openCV Python 學習筆記(一)影象的基本操作
Python的版本是Python3.6,openCV使用的是cv2
例圖
一、影象的讀取、顯示和儲存
讀取影象:cv2.imread(filename,flags)
該函式有兩個引數,第一個引數是圖片的地址,第二個引數是讀取影象的方式(預設值為1,以RGB格式讀取)
顯示圖片:cv2.imshow(winname,mat)
以視窗的形式顯示圖片,兩個引數,第一個是視窗上顯示的名稱,第二個是影象在程式碼中的表示名稱
儲存圖片:cv2.imwrite(filename,img,params)
N個引數,第一個是要儲存的影象的名字,如 'Rachel.jpg'
,第二個是也是影象在程式碼中的表示名稱,此外還有影象的質量等引數,暫且略過
銷燬全部視窗:cv2.destroyALLWindows()
銷燬特定視窗:cv2.destroyWindow(winname) 括號裡填指定視窗名稱
繫結按鍵:cv2.waitKey(delay)
示例程式碼:
按下 s 鍵儲存圖片到 png 格式
import cv2 img = cv2.imread('Rachel.jpg',1) # 若為0則是灰度圖 cv2.imshow('Rachel', img) k = cv2.waitKey(0) # 等待按鍵,返回按鍵的ASCII碼值 if k == ord('s'): # 若按下 S cv2.imwrite('Rachel.png', img) cv2.destroyAllWindows() # 刪除全部視窗
二、影象的縮放
縮放圖片是非常常用的操作,cv2裡面的函式是:cv2.resize
函式原型:cv2.resize(src, dst, dsize, fx=0, fy=0, interpolation=INTER_LINEAR )
fx,fy表示縮放比例,interpolation是縮放時填充的型別,有以下幾種:
INTER_NEAREST(鄰近元素插值法)
INTER_LINEAR(預設值,雙線性插值)
INTER_AREA(使用象素關係重取樣。當影象縮小時候,該方法可以避免波紋出現。當影象放大時,類似於 CV_INTER_NN 方法)
INTER_CUBIC(立方插值)
示例程式碼:
圖片變成原圖的0.5倍的灰度圖
import cv2
img = cv2.imread('Rachel.jpg', 0) # 注意,第二個引數是0,灰度圖
new = cv2.resize(img, None, fx=0.5, fy=0.5, interpolation=cv2.INTER_CUBIC)
cv2.imshow('Rachel', new)
k = cv2.waitKey(0)
if k == ord('s'):
cv2.imwrite('Rachel1.jpg', new)
cv2.destroyAllWindows()
結果:
三、影象翻轉和旋轉
影象翻轉用到的函式是cv2.flip
函式原型:cv2.flip(src, dst, flipCode)
flipCode,翻轉模式,flipCode==0垂直翻轉(沿X軸翻轉),flipCode>0水平翻轉(沿Y軸翻轉),flipCode<0水平垂直翻轉(先沿x
軸翻轉,再沿Y軸翻轉,等價於旋轉180°)
示例程式碼:
import cv2
img = cv2.imread('Rachel.jpg', 0)
new = cv2.resize(img, None, fx=0.5, fy=0.5, interpolation=cv2.INTER_CUBIC)
another_new0 = cv2.flip(new, 0)
another_new1 = cv2.flip(new, 1)
another_new_1 = cv2.flip(new, -1)
cv2.imshow('Rachel', new)
cv2.imshow('Rachel_flip_0', another_new0)
cv2.imshow('Rachel_flip_1', another_new1)
cv2.imshow('Rachel_flip_-1', another_new_1)
cv2.waitKey(0)
cv2.destroyAllWindows()
結果:
影象旋轉用到的函式是cv2.getRotationMatrix2D
函式原型:getRotationMatrix2D(center,angle,scale)
center一般是中心點的座標,用元組表示
angle角度是逆時針旋轉的角度
scale是比例,有放大或縮小影象的作用
示例程式碼:
import cv2
img = cv2.imread('Rachel.jpg', 0)
rows, cols = img.shape[:2]
M = cv2.getRotationMatrix2D((cols / 2, rows / 2), 90, 1)
dst = cv2.warpAffine(img, M, (cols, rows)) # 仿射變換,以後再說
cv2.imshow('Rachel', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
結果: