opencv仿射:平移,旋轉

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是輸入圖像的三個座標,左上角、右上角、左下角,

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章