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

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

透视变换矩阵:

透视变换矩阵warpMatric,(下图使用的A表示,下面代码该矩阵用warpMatrix表示,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是已知,所以就可以求出warpMatrix。

下面是上面透视变换矩阵的python实现:

import numpy as np

def WarpPerspectiveMatrix(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*warpMatrix=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)
    warpMatrix = A.I * B #求出a_11, a_12, a_13, a_21, a_22, a_23, a_31, a_32
    
    #之后为结果的后处理
    warpMatrix = np.array(warpMatrix).T[0]
    warpMatrix = np.insert(warpMatrix, warpMatrix.shape[0], values=1.0, axis=0) #插入a_33 = 1
    warpMatrix = warpMatrix.reshape((3, 3))
    return warpMatrix

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)
    
    warpMatrix = WarpPerspectiveMatrix(src, dst)
    print(warpMatrix)

输出结果:

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

 

  • 13
    点赞
  • 82
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值