目錄
- 一、安裝&問題
- 二、題目&代碼
- 三、結果
一、安裝&問題
Pycharm中File->setting->Python Interpreter添加opencv-python及opencv-contrib-python,呼叫時直接import cv2即可,
我原來用的Pycharm版本是2018年的,點了更新之后注銷快捷鍵Ctrl+/用不了了,解決方法是:File->Setting->Keymap,更改這個為自己的系統,比如我以前用的是Windows,

二、題目&代碼
題目:使用opencv進行影像處理
描述:自行下載一張網路圖片以.jpg格式保存(要求寬高均大于448);自行安裝opencv(cv2)以及opencv-contrib;使用opencv讀取.jpg格式的檔案,并獲取圖片的寬、高資訊;將img1進行鏡像,且進行灰度處理得到img2,鏡像軸為y軸;Img2進行中心裁剪,裁剪得到448*448的新圖片img3;將img1與img2、img3列印出來,并將img2和img3保存到本地檔案中,輸入:本地讀取影像img1;輸出:列印img1、img2、img3將img2、img3保存在本地檔案中,
import cv2
import numpy as np
def Image():
# flags False顯示灰度影像,True顯示原圖
img1 = cv2.imread("C:\\Users\\*\\Pictures\\img1.jpg") # 鏡玄yyds啊啊啊啊啊!
cv2.imshow(winname='img1',mat=img1)
cv2.waitKey(2000)
# cv2.namedWindow('img1',cv2.WINDOW_NORMAL)
# 獲取圖片資訊,輸出高寬通道數
height = img1.shape[0]
width = img1.shape[1]
print('該影像寬為:',width)
print('該影像高為:',height)
# 將img1進行水平鏡像翻轉(對稱軸為y軸)
# 影像的鏡像翻轉得到的影像與原影像構成的影像是一個軸對稱影像
img2 = cv2.flip(img1,1) # 0 垂直鏡像翻轉,1 水平鏡像翻轉,-1 對角鏡像反轉
# 灰度處理img2 令R=G=B
img2 = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)
cv2.imshow(winname='img2',mat=img2)
cv2.waitKey(2000)
img3 = img2[int(height/2-224):int(height/2+224), int(width/2-224):int(width/2+224)] # 裁剪坐標為[y0:y1, x0:x1]
cv2.imshow('img3',img3)
cv2.imshow(winname='img3',mat=img3)
cv2.waitKey(2000)
# 列印影像矩陣
print(img1,img2,img3)
# # 多圖同窗顯示,要求影像通道大小必須相同
# imgs = np.hstack((img1,img2,img3))
imgs = ManyImgs(0.2,([img1,img2,img3])) # 結果伸縮變形,需要調整
cv2.imshow('imgs',imgs)
cv2.waitKey(1000)
# 等待關閉
# cv2.destroyWindow()
# 呼叫函式
cv2.imwrite('C:\\Users\\*\\Pictures\\img2.jpg',img2)
cv2.imwrite('C:\\Users\\*\\Pictures\\img3.jpg',img3)
# 參考博文:《Opencv實作多幅影像顯示在同一視窗(基于Python)》
# 鏈接:https://blog.csdn.net/qq_44703724/article/details/105613611?
# 定義函式,第一個引數是縮放比例,第二個引數是需要顯示的圖片組成的元組或者串列
def ManyImgs(scale, imgarray):
rows = len(imgarray) # 元組或者串列的長度
cols = len(imgarray[0]) # 如果imgarray是串列,回傳串列里第一幅影像的通道數,如果是元組,回傳元組里包含的第一個串列的長度
# print("rows=", rows, "cols=", cols)
# 判斷imgarray[0]的型別是否是list
# 是list,表明imgarray是一個元組,需要垂直顯示
rowsAvailable = isinstance(imgarray[0], list)
# 第一張圖片的寬高
width = imgarray[0][0].shape[1]
height = imgarray[0][0].shape[0]
# print("width=", width, "height=", height)
# 如果傳入的是一個元組
if rowsAvailable:
for x in range(0, rows):
for y in range(0, cols):
# 遍歷元組,如果是第一幅影像,不做變換
if imgarray[x][y].shape[:2] == imgarray[0][0].shape[:2]:
imgarray[x][y] = cv2.resize(imgarray[x][y], (0, 0), None, scale, scale)
# 將其他矩陣變換為與第一幅影像相同大小,縮放比例為scale
else:
imgarray[x][y] = cv2.resize(imgarray[x][y], (imgarray[0][0].shape[1], imgarray[0][0].shape[0]), None, scale, scale)
# # 如果影像是灰度圖,將其轉換成彩色顯示
# if len(imgarray[x][y].shape) == 2:
# imgarray[x][y] = cv2.cvtColor(imgarray[x][y], cv2.COLOR_GRAY2BGR)
# 創建一個空白畫布,與第一張圖片大小相同
imgBlank = np.zeros((height, width, 3), np.uint8)
hor = [imgBlank] * rows # 與第一張圖片大小相同,與元組包含串列數相同的水平空白影像
for x in range(0, rows):
# 將元組里第x個串列水平排列
hor[x] = np.hstack(imgarray[x])
ver = np.vstack(hor) # 將不同串列垂直拼接
# 如果傳入的是一個串列
else:
# 變換操作,與前面相同
for x in range(0, rows):
if imgarray[x].shape[:2] == imgarray[0].shape[:2]:
imgarray[x] = cv2.resize(imgarray[x], (0, 0), None, scale, scale)
else:
imgarray[x] = cv2.resize(imgarray[x], (imgarray[0].shape[1], imgarray[0].shape[0]), None, scale, scale)
if len(imgarray[x].shape) == 2:
imgarray[x] = cv2.cvtColor(imgarray[x], cv2.COLOR_GRAY2BGR)
# 將串列水平排列
hor = np.hstack(imgarray)
ver = hor
return ver
if __name__=='__main__':
Image()
三、結果
鏡玄yyds!!!眷思量我等著你更新!!!

img1.jpg

寬高及列印

img2.jpg

img3.jpg

利用ManyImgs()函式得到的影像有伸縮變形,需要修正,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/301616.html
標籤:其他
