1.平移
OpenCV中的仿射函數爲cv2.warpAffine(),其通過一個變換矩陣(映射矩陣)M實現變換,具體爲:
dst(x, y)=src(M11x+M12y+M13, M21x+M22y+M23)
仿射函數cv2.warpAffine()的一般格式爲:
dst=cv2.warpAffine(src,M,disze)
解釋:src表示要變換的圖像,M就是dst(x,y)使用的矩陣,disize指的是輸出圖像的尺寸
例:
import cv2
import numpy as np
img=cv2.imread("D:/lena.jpg")
height,width=img.shape[:2]
x=100
y=200
M=np.float32([[1,0,x],[0,1,y]])
move=cv2.warpAffine(img,M,(width,height))
cv2.imshow("img",img)
cv2.imshow("move",move)
cv2.waitKey()
cv2.destroyAllWindows()
解釋:代碼中M的矩陣是
他表示的意思是
dst(x,y)=src(1*x+0*y+100,0*x+1*y+200)也就是將原始圖像src向右側移動100個像素、向下方移動200個像素
2.旋轉
在使用函數cv2.warpAffine()對圖像進行旋轉時,可以通過函數cv2.getRotationMatrix2D()獲取轉換矩陣。
該函數的語法格式爲:
retval=cv2.getRotationMatrix2D(center,angle,scale)
● center爲旋轉的中心點。
● angle爲旋轉角度,正數表示逆時針旋轉,負數表示順時針旋轉。
● scale爲變換尺度(縮放大小)。
import cv2
img=cv2.imread("D:/lena.jpg")
height,width=img.shape[:2]
M=cv2.getRotationMatrix2D((width/2,height/2),45, 0.6)
rotate=cv2.warpAffine(img, M, (width,height))
cv2.imshow("img",img)
cv2.imshow("rotate",rotate)
cv2.waitKey()
cv2.destroyAllWindows()
代碼解釋:
在M=cv2.getRotationMatrix2D((width/2,height/2),45, 0.6)語句中,center部分表示的是圖像的中心,angle部分表示逆時針旋轉45度(如果是負數則表示順時針旋轉),0.6表示將目標圖像縮小爲原來的0.6倍
3.擴展
對於更復雜仿射變換,OpenCV提供了函數cv2.getAffineTransform()來生成仿射函數cv2.warpAffine()所使用的轉換矩陣M。該函數的語法格式爲:M=cv2.getAffineTransform(src, dst)
● src代表輸入圖像的三個點座標。
● dst代表輸出圖像的三個點座標。上述參數通過函數cv2.getAffineTransform()定義了兩個平行四邊形。src和dst中的三個點分別對應平行四邊形的左上角、右上角、左下角三個點。(左上角是座標原點)
例子:
import cv2
import numpy as np
img=cv2.imread("D:/lena.jpg")
rows,cols,ch=img.shape
p1=np.float32([[0,0],[cols-1,0],[0,rows-1]])
p2=np.float32([[0,rows*0.33],[cols*0.85,rows*0.25],[cols*0.15,rows*0.7]])
M=cv2.getAffineTransform(p1, p2)
dst=cv2.warpAffine(img, M, (cols,rows))
cv2.imshow("img",img)
cv2.imshow("dst",dst)
cv2.waitKey()
cv2.destroyAllWindows()
解釋:
p1=np.float32([[0,0],[cols-1,0],[0,rows-1]])
p2=np.float32([[0,rows*0.33],[cols*0.85,rows*0.25],[cols*0.15,rows*0.7]])
p1,p2是輸入圖像的三個座標,左上角、右上角、左下角,