欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

透视变换原理和变换矩阵的python实现

程序员文章站 2023-12-27 11:36:09
...

透视变换又叫投影变换,我们常说的仿射变换是透视变换的一个特例。透视变换的目的就是把现实中为直线的物体,在图片上可能呈现为斜线,通过透视变换转换成直线的变换。

透视变换矩阵:

透视变换原理和变换矩阵的python实现

透视变换矩阵warpMatric,(下图使用的A表示,下面代码该矩阵用warpMatric表示,A表示8*8的矩阵)

透视变换原理和变换矩阵的python实现

透视变换的源点和目标点,矩阵如下:

源点矩阵:透视变换原理和变换矩阵的python实现           目标点矩阵: 透视变换原理和变换矩阵的python实现

这是一个从二维空间变换到三维空间的转换,因为图像在二维平面,故除以Z,  (X';Y';Z')表示图像上的点:

透视变换原理和变换矩阵的python实现

透视变换原理和变换矩阵的python实现,展开上面公式,得到一个点的情况:

透视变换原理和变换矩阵的python实现

4个点可以得到8个方程,求解8个未知数,即可解出透视变换矩阵warpMatric:

透视变换原理和变换矩阵的python实现

其中的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)

透视变换原理和变换矩阵的python实现

其中的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)

输出结果:

透视变换原理和变换矩阵的python实现

参考:https://blog.csdn.net/cuixing001/article/details/80261189

 

上一篇:

下一篇: