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