几何变换中的仿射变换和透视变换的原理(python)

图像的几何变换主要包括:平移、旋转、缩放、剪切、仿射、透视等。
图像的几何变换主要分为:刚体变换、相似变换、仿射变换和透视变换(又称射影变换)。
刚性变换:平移、旋转;
类似的变换:缩放、剪切;
仿射变换:从一个二维坐标系变换到另一个二维坐标系的过程,属于线性变换。通过已知3对坐标点便可求取变换矩阵。
透视变换:从二维坐标系变换到三维坐标系,在从三维坐标系投影到二维平面,属于非线性变换。通过已知4对坐标点便可求取变换矩阵。
几何变换中的仿射变换和透视变换的原理(python)

仿射变换
仿射变换是将一个二维坐标系转换为另一个二维坐标系的过程。在转换过程中,坐标点的相对位置和属性不进行转换,是一种线性转换。在这个变换过程中只发生平移和旋转,所以菱形在仿射变换后仍然是菱形。
也可以说仿射变换是指在一个向量空间中进行线性变换(乘以一个线性矩阵)和平移(添加一个向量)到另一个向量空间的过程。
仿射变换代表的是两幅图像之间的映射关系,仿射变换矩阵为2X3的矩阵,
一般来说,仿射=平移+旋转。
仿射变换Python例子

import cv2
import numpy as np

img = cv2.imread("C:/Users/player/Documents/3DPrinter/StitchImage/G2.png")
height, width = img.shape[:2]

# 在原图上和目标图像上各选三个点
mat_src = np.float32([[0, 15], [0, height - 20], [width - 1, 0]])
mat_dst = np.float32([[0, 15], [100, height - 100], [width - 100, 100]])

# 获得变换矩阵
mat_trans = cv2.getAffineTransform(mat_src, mat_dst)
# 进行仿射变换
dst = cv2.warpAffine(img, mat_trans, (width, height))

# 显示
imgs = np.hstack([img, dst])
cv2.namedWindow("img", cv2.WINDOW_NORMAL)
cv2.imshow("imgs", imgs)
cv2.imwrite("C:/Users/player/Documents/3DPrinter/StitchImage/affine.png", dst)
cv2.waitKey(0)

效果图
原始图像
几何变换中的仿射变换和透视变换的原理(python)
透视变换后渲染
几何变换中的仿射变换和透视变换的原理(python)

透视变换
透视变换是将一个图像投影到新的视平面,该过程包括:1.将二维坐标系转换为三维坐标系;2.将三维坐标系投影到新的二维坐标系。该过程属于非线性变换过程,一个菱形在经过非线性变换后得到一个四边形,但是不在平行。
透视变换也可以称为投影变换,仿射变换是透视变换的一种特例。透视变换可以保持“直线性”,即原始图像中的直线经过透视变换后仍然是直线。
透视变换图几何变换中的仿射变换和透视变换的原理(python)

透视变换矩阵变换公式为:
几何变换中的仿射变换和透视变换的原理(python)

透视变换矩阵为:
几何变换中的仿射变换和透视变换的原理(python)

要移动的点,源目标点:
几何变换中的仿射变换和透视变换的原理(python)

不动点,即要移动到的目标点:
几何变换中的仿射变换和透视变换的原理(python)

从二维空间变换到三维空间,因为图像在二维平面,故除以Z,(X‘,Y’,Z‘)表示图像上的点。

几何变换中的仿射变换和透视变换的原理(python)

另a33=1,展开上面的公式,可得到一个点为:
几何变换中的仿射变换和透视变换的原理(python)

四个点,即可得到8个方程,便可求解出透视变换矩阵A。
透视变换代码:

def PerspectImage():
    img = cv2.imread("C:/Users/player/Documents/3DPrinter/StitchImage/shizi.png")
    height, width = img.shape[:2]
    # 变换前的四个点
    srcArr = np.float32([[0, 0], [0, 1080], [1920, 1080], [1920, 0]])
    # 变换后的四个点
    dstArr = np.float32([[1, 12], [6, 1060], [1915, 1075], [1918, 3]])

    # 获取变换矩阵
    MM = cv2.getPerspectiveTransform(srcArr, dstArr)

    dst = cv2.warpPerspective(img, MM, (width, height))

    cv2.imwrite("C:/Users/player/Documents/3DPrinter/StitchImage/pe.png", dst)

转换结果
原始图像
几何变换中的仿射变换和透视变换的原理(python)
透视变换后渲染
几何变换中的仿射变换和透视变换的原理(python)

版权声明:本文为博主草原上唱山歌原创文章,版权归属原作者,如果侵权,请联系我们删除!

原文链接:https://blog.csdn.net/shanniuliqingming/article/details/123022486

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
社会演员多的头像社会演员多普通用户
上一篇 2022年2月20日 下午1:43
下一篇 2022年2月20日 下午1:59

相关推荐