图像到图像的映射

本文探讨了单应性变换在图像处理中的应用,包括使用DLT算法解单应性矩阵和仿射变换,以及图像扭曲技术如图像中的图像和分段仿射扭曲。通过实例展示了如何对图像进行仿射扭曲,但实验结果显示变换效果不理想,图像未能完全填充目标区域。
摘要由CSDN通过智能技术生成

单应性变换

单应性变换是将一个平面内的点映射到另一个平面内的二维投影变换。
下面的函数可以实现对点进行归一化和转换齐次坐标的功能。进行点和变换的处理时,我们会按照列优先的原则存储这些点。因此, n 个二维点集将会存储为齐次坐标意义下的一个 3× n 数组。这种格式使得矩阵乘法和点的变换
操作更加容易。

#对点归一化,转换齐次坐标
def normalize(points):
    """ 在齐次坐标意义下,对点集进行归一化,使最后一行为 1 """
    for row in points:
        row /= points[-1]
    return points

def make_homog(points):
    """ 将点集(dim × n 的数组)转换为齐次坐标表示 """
    return  vstack((points,ones((1,points.shape[1]))))

使用DLT算法解单应性矩阵

一个完全的射影变换有八个自由度,DLT直接线性变换通过给定4个或更多点对来计算单应性矩阵H。将对应点的坐标视为系数,堆叠到一个矩阵中,使用SVD算法可以找到H的最小二乘解。

def H_from_points(fp,tp):
    """ 使用线性 DLT 方法,计算单应性矩阵 H,使 fp 映射到 tp。点自动进行归一化 """
    if fp.shape != tp.shape:
        raise RuntimeError('number of points do not match')

    # 对点进行归一化(对数值计算很重要)
    # --- 映射起始点 ---
    m = mean(fp[:2],axis=1)
    maxstd = max(std(fp[:2],axis=1)) + 1e-9
    C1 = diag([1 / maxstd, 1 / maxstd, 1])
    C1[0][2] = -m[0] / maxstd
    C1[1][2] = -m[1] / maxstd
    fp = dot(C1,fp)

    # --- 映射对应点 ---
    m = mean(tp[:2], axis=1)
    maxstd = max(std(fp[:2],axis=1)) + 1e-9
    C2 = diag([1 / maxstd, 1 / maxstd, 1])
    C2[0][2] = -m[0] / maxstd
    C2[1][2] = -m[1] / maxstd
    tp = dot(C2, tp)

    # 创建用于线性方法的矩阵,对于每组对应点对,在矩阵中会出现两行数值
    nbr_correspondence = fp.shape[1]
    A = zeros((2 * nbr_correspondence,9))
    for i in range(nbr_correspondence):
        A[2 * i] = [-fp[0]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值