(学习笔记)透视变换及其python实现

1.透视变换

  透视变换是一种图像矫正算法,其目的是将图片中的曲线变换为直线。

2.透视变换矩阵推导

(学习笔记)透视变换及其python实现_第1张图片
(学习笔记)透视变换及其python实现_第2张图片
(学习笔记)透视变换及其python实现_第3张图片

图中(X,Y,Z)代表的是目标点坐标,(x,y,z)代表的是原图像点坐标。

3.python实现

def pective_transformation(img,warpMatrix,size):
    height,weight,channel=img.shape
    #source=np.ones((3,1))
    new_img=np.zeros((size[1],size[0],channel))#创建透视变换图像(矩阵)
    warpMatrix = np.mat(warpMatrix)
    warpMatrix = warpMatrix.reshape((3, 3))

    for i in range(size[0]):#遍历新图像的列
        for j in range(size[1]):#遍历新图像的行
            #从新图像的左上角到右下角依次插值
            goal=[i,j,1]#目标点坐标(X,Y,Z)
            goal=np.mat(goal)
            goal=goal.reshape((3,1))
            #print(goal1)
            img_point=warpMatrix.I*goal#利用目标点反推原图像点坐标,得到的坐标为(x,y,z),shape=(3,1)
            img_point=img_point.tolist()
            #其中img_point[0][0]代表原图像x坐标
            # 其中img_point[1][0]代表原图像y坐标
            # 其中img_point[2][0]代表原图像z坐标
            #实际使用中z会无限趋近于1,但不会等于1,在这里相当于一个修正参数,修正x和y坐标
            x = int(np.round(img_point[0][0] / img_point[2][0]))#计算原图像x坐标
            y = int(np.round(img_point[1][0] / img_point[2][0]))#计算原图像y坐标
            #z=int(np.round(img_point[2][0]))
            #print("i=",i,"j=",j,'\n')
            #print("x=", x, 'y=', y, 'z=',z,'\n')
            if y>=img.shape[0]:#防止溢出原图像边界
                y=img.shape[0]-1
            if x>=img.shape[1]:
                x=img.shape[1]-1
            if y<0:
                y=0
            if x<0:
                x=0
            new_img[j,i]=img[y,x]
    new_img=new_img.astype(np.uint8)
    return new_img

以上代码为透视变换核心代码,使用方法与opencv中的使用方法类似,其中透视变换矩阵可根据推导过程求出。有兴趣一起学习讨论的小伙伴可以加QQ1530932377。

你可能感兴趣的:(笔记,图像处理,算法,python,图像处理)