1. 程式人生 > >openCV Python 學習筆記(一)影象的基本操作

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()
結果: