【问题标题】:How to align two images based on a common feature with matchTemplate如何使用 matchTemplate 根据共同特征对齐两个图像
【发布时间】:2017-10-25 11:42:19
【问题描述】:

我有两个重叠的图像。我想对齐这两个图像。我目前的方法是在两个图像中找到一个共同特征(标记)。然后我想根据特征重叠的位置对齐这两个图像。

图像并不完美,因此我正在寻找一种基于“最佳”拟合(大多数重叠)对齐的方法。最初我尝试通过 SIFT 使用特征匹配来对齐图像,但特征匹配通常不正确/太少。

这是我用来查找template的代码:

template = cv2.imread('template.png', 0)
template = template - cv2.erode(template, None)

image1 = cv2.imread('Image to align1.png')
image2 = cv2.imread('Image to align2.png')
image = image2
img2 = image[:,:,2]
img2 = img2 - cv2.erode(img2, None)

ccnorm = cv2.matchTemplate(img2, template, cv2.TM_CCORR_NORMED)
print(ccnorm.max())
loc = np.where(ccnorm == ccnorm.max())
print(loc)
threshold = 0.1
th, tw = template.shape[:2]
for pt in zip(*loc[::-1]):
    if ccnorm[pt[::-1]] < threshold:
        continue
    cv2.rectangle(image, pt, (pt[0] + tw, pt[1] + th),
                 (0, 0, 255), 2)

这是匹配的功能,12。 提前致谢。

【问题讨论】:

  • 您想要简单地移动图像并重叠,还是想要扭曲它(可能会缩放、旋转和透视失真)?
  • @AlexanderReynolds 我正在使用手持相机/扫描仪通过玻璃屏幕捕捉图像,因此我假设移位和旋转是我的图像之间的唯一区别。
  • @ZdaR 感谢您的链接,不幸的是,这是我在我的 OP 中提到的使用 SIFT 和特征检测的原始方法。您是否有任何基于模板的图像对齐/拼接方法的资源?

标签: python opencv opencv3.0 template-matching


【解决方案1】:

您对 OpenCV 库的选择是使用任意数量的方法来选择几个点,并使用 getAffineTransformgetPerspectiveTransform 之类的函数在图像中的这些点之间创建转换。请注意,像这样的函数将 points 作为参数,not 亮度值(图像)。您将希望在第一张图像中找到兴趣点(例如,那些标记点);你会想在第二张图片中找到那些相同的点,并将那些像素位置传递给像getAffineTransformgetPerspectiveTransform这样的函数。然后,一旦你有了这个变换矩阵,你就可以使用warpAffinewarpPerspective 将第二张图像变形为第一张图像的坐标(反之亦然)。

仿射 变换包括平移、旋转、缩放和剪切。 透视变换包括仿射变换的所有内容,以及xy 方向上的透视失真。对于getAffineTransform,您需要从第一张图像发送三对点,以及这三个相同像素在第二张图像中的位置。对于getPerspectiveTransform,您将从每个图像发送四个像素对。如果您想使用所有标记点,您可以使用 findHomography 代替,这将允许您放置 更多 四个点,它会计算所有匹配点之间的最佳单应性。

当您使用特征检测和匹配来对齐图像时,它会在后台使用这些功能。不同之处在于它会为您找到功能。但如果这不起作用,只需使用手动方法找到您喜欢的特征,然后在这些特征点上使用这些方法。例如,您可以找到已有的模板位置并将其定义为感兴趣区域 (ROI),然后将标记点分解为更小的模板片段并在 ROI 内找到这些位置。然后你有两个图像中对应的点对;您可以将他们的位置输入到findHomography,或者只需选择三个与getAffineTransform 一起使用或四个与getPerspectiveTransform 一起使用,然后您将获得可以应用的图像转换。


否则,如果您不想使用基于特征的方法,您将需要使用像 Lukas-Kanade optical flow algorithm 这样的东西,它可以进行直接图像匹配,但是与选择几个特征点和查找单应性相比,这些方法非常慢如果你使用整个图像,那就这样。但是,如果您只需要为几张图像执行此操作,那并不是什么大不了的事。为了更准确并使其收敛得更快,如果您可以为其提供一个起始单应性,至少将其大致翻译到正确的位置(例如,您进行特征检测,请参阅该特征大致为 (x', y')第二张图像中的像素,并使用该翻译创建单应性)。

如果你想尝试的话,你也可以从 Lucas-Kanade 逆合成算法等在线找到一些用于单应性估计的 Python 例程。我也有我自己的算法自定义例程,但我不能分享它,但是,如果你分享没有边界框的原件,我可以在你的图像上运行算法,也许可以为你提供一些估计的单应性进行比较与。

【讨论】:

  • 非常感谢您的详细评论和比较笔记的提议。一旦我有一个可行的解决方案,我会给你的方法一个镜头并提供一些图像进行比较。你是用 Python 编写例程还是用 C++ 编写的?
  • Python。也分别用matlab。我不能分享它,因为我是在工作中开发的,但你可以在网上找到很多实现。查看menpofit,它有多种 Lucas-Kanade 算法变体,编程良好。逆合成法是最快的。但我认为如果您编写自己的特征选择器,基于特征的方法应该非常适合您。
  • @Jason 你有这方面的python代码吗????或者任何人都可以请添加代码作为答案。
  • @M.D.P 见docs.opencv.org/3.4/d7/dff/tutorial_feature_homography.htmldocs.opencv.org/3.4.0/d9/dab/tutorial_homography.html 并在线搜索“opencv 单应性”和“opencv 对齐”——那里有很多教程。如果您在实施这些教程时遇到问题,请提出一个新问题。
【解决方案2】:

这可以使用 Homography 来完成。 这是一篇关于您正在寻找的文章(以及 C++ 和 Python 中的代码): Feature Based Image Alignment Using OpenCV

【讨论】:

    猜你喜欢
    • 2018-06-21
    • 2023-03-09
    • 2010-11-01
    • 2013-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多