Python,如何缝制重叠区域的图像?

时间:2018-11-09 04:22:37

标签: python opencv

我正在尝试将具有重叠区域的图像拼接在一起。 图像被排序,每个图像与先前图像具有重叠区域。例如:

https://imgur.com/a/t9zzeHD

我尝试过https://www.pyimagesearch.com/2016/01/11/opencv-panorama-stitching/处的代码,我对其稍有更改并使用了倾斜的图像,但是最终结果(https://imgur.com/a/B2d2VBL)却与预期不符。

问题是否出自右侧为黑色的第5张图像?不确定为什么要添加黑色以及如何避免添加黑色。

有人知道我如何解决代码,以免随着我添加越来越多的图像而扭曲图像?欢迎使用更好的代码示例。

~~~~~~~~编辑~~~~~~~ 正如Dan在评论中指出的那样,我正在为该工作使用错误的工具(warpPerspective)。我真正在寻找的是一种在两个图像中找到匹配的关键点,将其转换为每个图像中正确的Y的方法,这样我就可以剪切图像,然后相应地对其进行缝合。

因此,现在的问题可能是关于如何获取匹配的关键点并将其转换为Y坐标有点简单。

请忽略该代码,因为它只是我开始的一个例子,并且在这个点上只是一个错误。

下面的代码示例输入目录的路径,其中包含图像[“ 0.png”,“ 1.png”,“ 2.png”,“ 3.png”]

<div v-for="(data,index) in data" :key="index" class="col-12">
  <div class="row"> <!--  this one -->
    <div v-if="data.image" class="col-xs-12 col-md-3 image-div">
      <img class="image" :src="data.image" alt="image">
    </div>
    <div class="col-xs-12 col-md-9">
      <!-- etc -->
    </div>
  </div>
</div>

1 个答案:

答案 0 :(得分:0)

黑条的问题是您将两个重叠的图像放置在两个图像大小相同的图像内...黑条是重叠区域的宽度。要删除它,您可以始终计算所需的宽度。例如,您可以使用文档中提供的公式找到右上和右下点将映射到的位置。像这样:

def determineMaXSize(self, w, h ,M):
  x0 = (M[0,0]*(w-1) + M[0,2]) / (M[2,0]*(w-1)  + M[2,2]) # for top right point
  x1 = (M[0,0]*(w-1) + M[0,1]*(h-1) + M[0,2]) /  (M[2,0]*(w-1) + M[2,1]*(h-1) + M[2,2])# for bottom right point
  print ("x0",x0)
  print("x1",x1)
  return int(min(x0, x1))

然后:

    result[0:imageB.shape[0], 0:imageB.shape[1]] = imageB
    maxWidth = self.determineMaXSize(imageA.shape[1], imageA.shape[0] ,H)
    result = result[:, 0:maxWidth]

我将2点之间的最小宽度从右侧去除所有黑色部分,即使图像变形也是如此。 (在这种情况下,它将裁切一些图像)

您的第二个问题是,这家伙胸部的两个图像之间的匹配不怎么好,无法匹配,它们稍微移动了一点,然后由于扭曲而结束。您应该尝试获取更多重叠的图像,或者尝试使用其他匹配方法或其他参数进行SIFT特征检测。也许尝试寻找一种仅根据特征/点估算翻译量的方法。