透视变换原理和变换矩阵的python实现
程序员文章站
2023-12-27 11:36:09
...
透视变换又叫投影变换,我们常说的仿射变换是透视变换的一个特例。透视变换的目的就是把现实中为直线的物体,在图片上可能呈现为斜线,通过透视变换转换成直线的变换。
透视变换矩阵:
透视变换矩阵warpMatric,(下图使用的A表示,下面代码该矩阵用warpMatric表示,A表示8*8的矩阵)
透视变换的源点和目标点,矩阵如下:
源点矩阵: 目标点矩阵:
这是一个从二维空间变换到三维空间的转换,因为图像在二维平面,故除以Z, (X';Y';Z')表示图像上的点:
令,展开上面公式,得到一个点的情况:
4个点可以得到8个方程,求解8个未知数,即可解出透视变换矩阵warpMatric:
其中的x,y是源点的四个坐标,X',Y’表示目标点的四个坐标。
假设:
源点四个坐标分别为A:(x0,y0),(x1,y1),(x2,y2),(x3,y3)
目标点四个坐标分别为B:(X'0,Y'0),(X'1,Y'1),(X'2,Y'2),(X'3,Y'3)
其中的A和B是已知,所以就可以求出warpMatric。
下面是上面透视变换矩阵的python实现:
import numpy as np
def WarpPerspectiveMatric(src, dst):
assert src.shape[0] == dst.shape[0] and src.shape[0] >= 4
nums = src.shape[0]
A = np.zeros((2*nums, 8)) # A*warpMatric=B
B = np.zeros((2*nums, 1))
for i in range(0, nums):
A_i = src[i,:]
B_i = dst[i,:]
A[2*i, :] = [ A_i[0], A_i[1], 1,
0, 0, 0,
-A_i[0]*B_i[0], -A_i[1]*B_i[0]]
B[2*i] = B_i[0]
A[2*i+1, :] = [ 0, 0, 0,
A_i[0], A_i[1], 1,
-A_i[0]*B_i[1], -A_i[1]*B_i[1]]
B[2*i+1] = B_i[1]
A = np.mat(A)
warpMatric = A.I * B #求出a_11, a_12, a_13, a_21, a_22, a_23, a_31, a_32
#之后为结果的后处理
warpMatric = np.array(warpMatric).T[0]
warpMatric = np.insert(warpMatric, warpMatric.shape[0], values=1.0, axis=0) #插入a_33 = 1
warpMatric = warpMatric.reshape((3, 3))
return warpMatric
if __name__ == '__main__':
print('hello world!')
src = [[10.0, 457.0], [395.0, 291.0], [624.0, 291.0], [1000.0, 457.0]]
src = np.array(src)
dst = [[46.0, 920.0], [46.0, 100.0], [600.0, 100.0], [600.0, 920.0]]
dst = np.array(dst)
warpMatric = WarpPerspectiveMatric(src, dst)
print(warpMatric)
输出结果:
参考:https://blog.csdn.net/cuixing001/article/details/80261189
推荐阅读
-
透视变换原理和变换矩阵的python实现
-
python逆透视变换试验——利用cv2.getPerspectiveTransform和cv2.warpPerspective函数实现
-
使用python实现离散时间傅里叶变换的方法
-
jQuery和canvas实现的球体平抛及颜色动态变换效果
-
详解通过变换矩阵实现canvas的缩放功能
-
详解通过变换矩阵实现canvas的缩放功能
-
Python3+OpenCV2实现图像的几何变换(平移、镜像、缩放、旋转、仿射)
-
Python中实现单例模式的n种方式和原理
-
python opencv实现任意角度的透视变换实例代码
-
Opencv-Python图像透视变换cv2.warpPerspective的示例