函數:cv2.warpAffine()、cv2.getRotationMatrix2D()
說明:此函數可以對圖片進行平移和旋轉操作。此函數需要和python 自帶的numpy庫結合使用。
簡單例子:
代碼如下:
<code>import cv2
import numpy as np
#打開圖片
img = cv2.imread('1.png',0)
cv2.imshow('a0',img)
#獲取圖片的長和寬
rows,cols = img.shape
#平移
#創建一個矩陣,其中100和50分別是向左平移100像素,向下平移50像素
M = np.float32([[1,0,100],[0,1,50]])
a1= cv2.warpAffine(img,M,(cols,rows))
cv2.imshow('a1',a1)
#旋轉
M = cv2.getRotationMatrix2D((cols/2,rows/2),90,1)
a2 = cv2.warpAffine(img,M,(cols,rows))
cv2.imshow('a2',a2)
#關閉窗口
cv2.waitKey(0)
cv2.destroyAllWindows()/<code>
原圖:
運行代碼後:
詳解:
rows,cols = img.shape
此函數是獲取圖片的寬(rows)和長(cols),它只能讀取灰度圖片的參數,所以要用img = cv2.imread('1.png',0),後面這個0代表灰度,如果改成1或者刪掉,則代表彩色
M = np.float32([[1,0,100],[0,1,50]])
這個函數輸出結果如下
其中100(向左)和50(向下)代表你要移動的參數
cv2.warpAffine(img,M,(cols,rows))
img是自己導入圖片,M 是根據矩陣參數進行圖片變化,(cols,rows)這個是代表圖片(新窗口大小)
cols,和rows都等於200,如果將改成400,如cv2.warpAffine(img,M,(400,400)),則新窗口大小如下:
難點:
為什麼矩陣M前面要有0和1?
其實前面部分是,
[1,0;0,1]代入函數正好算出來θ=0,即不旋轉,如果要旋轉一定角度,則要算出這個矩陣大小來,這是比較麻煩的,所以要用M = cv2.getRotationMatrix2D((cols/2,rows/2),90,1)進行換算。
M = cv2.getRotationMatrix2D((cols/2,rows/2),90,1)
(cols/2,rows/2)這是座標是圖片中心,即旋轉中心,可以換成以某個座標旋轉。
90,表示逆時針旋轉90°
通過這個函數,可以直接生成旋轉90°的矩陣M,然後把M代入cv2.warpAffine(img,M,(cols,rows))即可得到旋轉後的圖片。
閱讀更多 python的圖像處理 的文章