图像拼接

本文介绍了图像拼接的概念,通过实例展示了如何利用RANSAC算法估计单应性矩阵进行图像拼接。讨论了图像曝光不一致、边缘效应以及算法在不同场景下的表现,包括日间和夜间拍摄的图片。还提到了图像顺序对拼接结果的影响,并指出算法存在的局限性。此外,文章提及使用PS调整图片大小以优化算法匹配速度。
摘要由CSDN通过智能技术生成

1概念

估计出图像间的单应性矩阵(使用RANSAC算法),现在我们需要将所有的图像扭曲到一个公共的图像平面上。通常,这里的公共平面为中心图像平面(否则,需要进行大量变形)。一种方法是创建一个很大的图像,比如图像中全部填充0,使其和中心图像平行,然后将所有的图像扭曲到上面。由于我们所有的图像是由照相机水平旋转拍摄的,因此我们可以使用一个较简单的步骤:将中心图像左边或者右边的区域填充0,以便为扭曲的图像腾出空间。

对于通用的geometric transform() 函数,我们需要指定能够描述像素到像索间映射的函数。在这个例子中,transf() 函数就是该指定的函数。该函数通过将像素和H相乘,然后对齐次坐标进行归一化来实现像素间的映射。通过查看H中的平移量,我们可以决定应该将该图像填补到左边还是右边。当该图像填补到左边时,由于目标图像中点的坐标也变化了,所以在“ 左边”情况中,需要在单应性矩阵中加入平移。简单起见,我们同样使用0像素的技巧来寻找alpha图。

现在在图像中使用该操作,具体函数如下:

	# 扭曲图像
    delta = 2000  # for padding and translation用于填充和平移

    im1 = array(Image.open(imname[1]), "uint8")
    im2 = array(Image.open(imname[2]), "uint8")
    im_12 = warp.panorama(H_12,im1,im2,delta,delta)

    im1 = array(Image.open(imname[0]), "f")
    im_02 = warp.panorama(dot(H_12,H_01),im1,im_12,delta,delta)

    im1 = array(Image.open(imname[3]), "f")
    im_32 = warp.panorama(H_32,im1,im_02,delta,delta)

    im1 = array(Image.open(imname[4]), "f")
    im_42 =warp.panorama(dot(H_32,H_43),im1,im_32,delta,2*delta)

注意,在最后一行中,im_32图像已经发生了一次平移。

2实例

2.1例子一

实际例子如下:

from pylab import *
from numpy import *
from PIL import Image

# If you have PCV installed, these imports should work
from PCV.geometry import homography, warp
from PCV.localdescriptors import sift

# 将匹配转换成齐次坐标点的函数
def convert_points(j):
    ndx = matches[j].nonzero()[0]
    fp = homography.make_homog(l[j + 1][ndx, :2].T)
    ndx2 = [int(matches[j][i]) for i in ndx]
    tp = homography.make_homog(l[j][ndx2, :2].T)

    # switch x and y - TODO this should move elsewhere
    fp = vstack([fp[1], fp[0], fp[2]])
    tp = vstack([tp[1], tp[
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值