图像仿射变换和透视变换
图像的仿射变换就是图像的旋转加上拉升,说直白点,就是把矩形变成平行四边形。要把矩形变成平行四边行,只需要拉伸其四个角点就行了,事实上,只需要确定前面三个点,最后一个点自然就能确定了。也就是要改变下图所示的三个点的值,对应到新的平行四边形上相应的三个点即可。 这三个原点以及三个变换后的点呢,就组成了一个变换矩阵M。opencv提供了根据变换前后三个点的对应关系来自动求解M。这个函数是M=cv2.getAffineTransform(pos1,pos2),其中两个位置就是变换前后的对应位置关系。输出的就是仿射矩阵M。然后在使用函数cv2.warpAffine()即可完成仿射变换。如下图所示,左图是原图,右图是仿射变换之后的结果图。 from matplotlib import pyplot as pltimg = cv2.imread('E:/image/le.jpg')rows,cols = img.shape[:2]pts1 = np.float32([[0,0],[rows-1,0],[0,cols-1]])#原来三个点的位置pts2 = np.float32([[20,20],[rows-50,50],[100,cols-100]])#变换后三个点的位置M = cv2.getAffineTransform(pts1,pts2)#合成变换矩阵res = cv2.warpAffine(img,M,(cols,rows))#第三个参数:变换后的图像大小plt.imshow(img[:,:,[2,1,0]])plt.imshow(res[:,:,[2,1,0]])对于透视变换,需要确定四个点的位置,其四个点对应的位置如下图。 可以通过opencv的函数cv2.getPerspectiveTransform找到变换矩阵. 然后将cv2.warpPerspective应用于此3x3变换矩阵,即可完成透视变换。有一种说法是说,通过透视变换可以将平行四边形变为矩形。 import matplotlib.pylab as pltimg = cv2.imread('E:/image/ch.jpg')pts1 = np.float32([[20,20],[rows-50,50],[0,cols],[rows-50,cols-50]])#原图四个角点的位置,我的第三个点位置没找对,所以结果图只有1,2,4三个点进行了拉伸,而第3个点没变。pts2 = np.float32([[0,0],[rows,0],[0,cols],[rows,cols]])#结果图的四个点对应的位置,我这里是四个顶点M = cv2.getPerspectiveTransform(pts1,pts2)#合成变换矩阵dst = cv2.warpPerspective(img,M,(cols,rows))#进行变换plt.subplot(121),plt.imshow(img[:,:,[2,1,0]]),plt.title('Input'),plt.axis('off')plt.subplot(122),plt.imshow(dst[:,:,[2,1,0]]),plt.title('Output'),plt.axis('off')
|