几何变换原理
几何变换常见的就是仿射变换和透视变换,这两种变换在图像还原、图像局部处理是常用的方法。
仿射变换可以理解为平面变换,透视变换可以理解为空间变换,一个是二维一个是三维的。
仿射变换原理:
仿射变换是一种二维坐标到二维坐标之间的线性变换,它保持了二维图形的“平直性”(直线经过变换之后依然是直线)和“平行性”(二维图形之间的相对位置关系保持不变,平行线依然是平行线,且直线上点的位置顺序不变)
透视变换原理:
透视变换是将图片投影到一个新的视平面,也称作投影映射.它是二维(x,y)到三维(X,Y,Z),再到另一个二维(x’,y’)空间的映射.
变换示例
先上图片
仿射变换示例:
import cv2
import numpy as np
img=cv2.imread("../../Resources/card1.jpg")
rows, cols, channels = img.shape
point1 = np.float32([[0,0], [cols-1,0], [0,rows-1]]) #确定三个点
point2=np.float32([[10,rows*0.18], [cols*0.7,rows*0.3], [cols*0.17,rows*0.7]]) #目标点
M = cv2.getAffineTransform(point1, point2) #变换的矩阵
dst = cv2.warpAffine(img, M, (cols,rows))
cv2.imshow("img",dst)
cv2.waitKey(0)
仿射变换后的图片
从代码可以看出 仿射变换只用了三个点就完成了,因为三个点确定一个平面,这就是为什么上面提到的仿射变换是一个二维的变换。
透视变换示例:
img=cv2.imread("../../Resources/card1.jpg")
rows, cols, channels = img.shape
point1 = np.float32([[0,0], [cols-1,0], [0,rows-1],[rows-1,cols-1]]) #确定四个点
point2=np.float32([[10,rows*0.1], [cols*0.9,rows*0.2], [cols*0.1,rows*0.65],[rows*0.8,cols*0.95]]) #目标点
M = cv2.getPerspectiveTransform(point1, point2) #变换的矩阵
dst = cv2.warpPerspective(img, M, (cols,rows))
cv2.imshow("img",dst)
cv2.waitKey(0)
透视变换后的图片
可以尝试将变换后的图片转为方方正正的图片