1.什么是仿射变换
仿射变换是一个图像经过跟一个矩阵M进行运算,可以达到放大缩小平移旋转等效果的目的
放射变换的核心是找到变换矩阵,openCV中有提供变换矩阵的接口
2.利用仿射变换进行平移
其中[[1,0,tx],[0,1,ty]]是变换矩阵,tx为在x轴方向移动的距离,ty为在y轴移动的距离,我们只需要将tx和ty改成我们想要的大小,就可得到平移矩阵。
import cv2
import numpy as np
dog = cv2.imread("image/dog.png")
h,w,ch = dog.shape
#平移矩阵
M = np.float32([[1,0,100],[0,1,0]])
new = cv2.warpAffine(dog,M,(w,h))
cv2.imshow('show',new)
cv2.waitKey(0)
3.获取变换矩阵的三种方式
当需要图片进行旋转,缩放等比较复杂的操作时,人为计算变换矩阵就比较麻烦,因此openCV提供了三种获取变换矩阵的接口。
getRotationMatrix2D(center,angle,scale)
#center中心点,以图片哪个点作为旋转的中心
#angle 加偶的,旋转的角度,按照逆时针旋转
#scale 缩放比例
#注意openCV一切都是先宽后高,而不是熟悉的先高后宽
M = cv2.getRotationMatrix2D((w/2,h/2),15,1.0)
new_dog = cv2.warpAffine(dog,M,(w,h))
getAffineTransform(src,dst)
"""通过三点自动计算变换矩阵的API"""
#getAffineTransform(src,dst)
#src为原图中的三点坐标,dst为变换之后的图片对应的三点的坐标
#该函数会根据三点坐标之间的移动,自动计算出变换矩阵
src = np.float32([[50,100],[80,100],[200,300]])
dst = np.float32([[100,150],[360,200],[280,120]])
M2 = cv2.getAffineTransform(src,dst)
new_dog2 = cv2.warpAffine(dog,M2,(w,h))
透视变换getPerspectiveTransform(src,dst)
#通过原图和之后图对应的四个点的坐标来获得原始矩阵
#应用场景比如将倾斜的图片摆正
#getPerspectiveTransform(src,dst)
第三种透视变换与第二种的区别只是第二种需要三个点的坐标,而第三种需要四个点的坐标
4.完整代码:
import cv2
import numpy as np
dog = cv2.imread("image/dog.png")
h,w,ch = dog.shape
"""获取变换矩阵的API"""
#getRotationMatrix2D(center,angle,scale)
#center中心点,以图片哪个点作为旋转的中心
#angle 加偶的,旋转的角度,按照逆时针旋转
#scale 缩放比例
#注意openCV一切都是先宽后高,而不是熟悉的先高后宽
M = cv2.getRotationMatrix2D((w/2,h/2),15,1.0)
new_dog = cv2.warpAffine(dog,M,(w,h))
"""通过三点自动计算变换矩阵的API"""
#getAffineTransform(src,dst)
#src为原图中的三点坐标,dst为变换之后的图片对应的三点的坐标
#该函数会根据三点坐标之间的移动,自动计算出变换矩阵
src = np.float32([[50,100],[80,100],[200,300]])
dst = np.float32([[100,150],[360,200],[280,120]])
M2 = cv2.getAffineTransform(src,dst)
new_dog2 = cv2.warpAffine(dog,M2,(w,h))
"""透视变换"""
#通过原图和之后图对应的四个点的坐标来获得原始矩阵
#应用场景比如将倾斜的图片摆正
#getPerspectiveTransform(src,dst)
cv2.imshow("show",new_dog)
cv2.imshow("show2",new_dog2)
cv2.waitKey(0)
cv2.destroyAllWindows()