仿射变换
在仿射变换中,原始图像中的所有平行线在输出图像中仍将平行。为了找到变换矩阵,我们需要输入图像中的三个点及其在输出图像中的对应位置。然后cv.getAffineTransform将创建一个2x3矩阵,该矩阵将传递给cv.warpAffine。
rows,cols,ch = img.shape
# 3个点的位置
pts1 = np.float32([[50,50],[200,50],[50,200]])
# 输出图像中3个点对应的位置
pts2 = np.float32([[10,100],[200,50],[100,250]])
# 得到一个全局的仿射变换矩阵
M = cv.getAffineTransform(pts1,pts2)
# 执行仿射变换操作
dst = cv.warpAffine(img,M,(cols,rows))
# 画图
plt.subplot(121),plt.imshow(img),plt.title('Input')
plt.subplot(122),plt.imshow(dst),plt.title('Output')
透视变换
对于透视变换,您需要3x3变换矩阵。即使在转换后,直线也将保持直线。要找到此变换矩阵,您需要在输入图像上有4个点,在输出图像上需要相应的点。在这四个点中,其中三个不应共线。然后可以通过函数cv.getPerspectiveTransform找到变换矩阵。然后将cv.warpPerspective应用于此3x3转换矩阵。
rows,cols,ch = img.shape
# 找到输入图像中的4个点
pts1 = np.float32([[56,65],[368,52],[28,387],[389,390]])
# 找到输出图像中的4个点
pts2 = np.float32([[0,0],[300,0],[0,300],[300,300]])
# 得到透视变换矩阵
M = cv.getPerspectiveTransform(pts1,pts2)
# 执行透视变换操作
dst = cv.warpPerspective(img,M,(300,300))
plt.subplot(121),plt.imshow(img),plt.title('Input')
plt.subplot(122),plt.imshow(dst),plt.title('Output')
plt.show()
仿射变换和透视变换的应用场景?
仿射变换和透视变换是计算机视觉和图像处理中常用的几何变换方法,它们的应用场景具体如下:
仿射变换:
图像的缩放和旋转;
平面纹理映射;
物体的形变校正;
视角的变换;
区域的扭曲调整等。
透视变换:
处理远距离拍摄的图像,如航拍影像,可以对图像进行透视矫正,使得远处元素得到较多的展示;
全景照片的生成;
3D 模型纹理贴图,如将 2D 纹理映射到 3D 网格上;
AR/VR 应用中,将虚拟物体与实际场景融合时,需要进行真实感透视变换;
机器人视觉中,需要对环境进行建模或者机器人导航时,可以通过透视变换获得更加真实的表现效果。
值得注意的是,两种方法通常也可以组合使用,以便更好地处理图像中的各种几何变换。