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是输入图像的三个座标,左上角、右上角、左下角,

 

 

 

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