【问题标题】:How can I align a green-band and infrared image with openCV?如何将绿波段和红外图像与 openCV 对齐?
【发布时间】:2016-01-04 13:03:45
【问题描述】:

我有两个图像要使用 openCV 对齐。其中一张是真彩色图像的绿色波段,另一张是几乎相同区域的 NIR 图像(偏移量约为 180 像素)。对于这种对齐方式,我想使用 python-opencv 3.0 和 ORB 算法。我使用以下脚本来创建 KNNmatches:

img1 = cv2.imread('rgb.png',1)
img2 = cv2.imread('nir.png',0)
img1=img1[:,:,1]

orb = cv2.ORB_create()

kp1, des1 = orb.detectAndCompute(img1,None)
kp2, des2 = orb.detectAndCompute(img2,None)

bf = cv2.BFMatcher()
matches = bf.knnMatch(des1,des2, k=2)

good = []
for m,n in matches:
    if m.distance < 0.75*n.distance:
        good.append([m])

img3 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,good,flags=2,outImg=None)

但是,当我对我的图像执行此操作时,我只得到与以下图像匹配的几个:

你们中有人知道我如何才能最好地对齐这些图像吗?提前感谢您,如果在错误的论坛上发布此内容,我们深表歉意。

【问题讨论】:

标签: python opencv rgb infrared


【解决方案1】:

下一步是从“良好匹配”中提取关键点位置,使用这些位置计算一个 3x3 变换矩阵,将一个图像的角转换到另一个图像。

对于这种情况,假设我们想要将 img2 转换为与 img1 对齐。首先我们提取好的匹配的位置:

pts1 = np.float32([kp1[m.queryIdx].pt for m in good]).reshape(-1, 1, 2)
pts2 = np.float32([kp2[m.queryIdx].pt for m in good]).reshape(-1, 1, 2)

然后我们找到变换矩阵:

M = cv2.findHomography(pts2, pts1)

最后,我们可以应用转换:

warpedImg2 = cv2.warpPerspective(img2, M, img1.shape)

这是一个great resource,关于使用 Python 在 OpenCV 中进行特征检测。

【讨论】:

  • 主要问题是,几乎没有找到匹配项(3-5 并且位置错误)。至少对于非线性变换来说太少了。
  • 嗯,好的。必须尝试任何其他特征检测器/描述符/匹配器组合?使用 SURF 关键点和描述符以及具有类似图像的 FLANN 匹配器,我得到了很好的结果。另一种方法可能是尝试基于相关性的对齐方式。
猜你喜欢
  • 2020-11-21
  • 2019-10-31
  • 2023-03-31
  • 2020-02-25
  • 1970-01-01
  • 1970-01-01
  • 2017-05-26
  • 2017-07-25
  • 2012-09-29
相关资源
最近更新 更多