首页 > 解决方案 > 执行图像配准时图像之间的不匹配

问题描述

原图 1

原图 1

原图 2

原图 2

我正在尝试匹配两个显微镜图像(请参阅附件)。但是,匹配很糟糕,并且单应矩阵会产生不可接受的结果。有没有办法改进这个注册?

import cv2 # Imports the Open CV2 module for image manipulation.
import numpy as np # Imports the numpy module for numerical manipulation.
from tkinter import Tk # Imports tkinter for the creation of a graphic user interface.
from tkinter.filedialog import askopenfilename # Imports the filedialog window from tkinter

Tk().withdraw()
filename1 = askopenfilename(title='Select the skewed file')

Tk().withdraw()
filename2 = askopenfilename(title='Select the original file')


img1 = cv2.imread(filename1)
img2 = cv2.imread(filename2)

img1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
img2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)

orb = cv2.ORB_create(nfeatures=10000)

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

matcher = cv2.DescriptorMatcher_create(cv2.DESCRIPTOR_MATCHER_BRUTEFORCE_HAMMING)
matches = matcher.match(des1, des2, None)
matches = sorted(matches, key = lambda x:x.distance)

points1 = np.zeros((len(matches), 2), dtype=np.float32)
points2 = np.zeros((len(matches), 2), dtype=np.float32)

for i, match in enumerate(matches):
    points1[i, :] = kp1[match.queryIdx].pt
    points2[i, :] = kp2[match.trainIdx].pt

h, mask = cv2.findHomography(points1, points2, cv2.RANSAC)

height, width = img2.shape

im1Reg = cv2.warpPerspective(img1, h, (width, height))

img3 = cv2.drawKeypoints(img1, kp1, None, flags=0)
img4 = cv2.drawKeypoints(img2, kp2, None, flags=0)
img5 = cv2.drawMatches(img1, kp1, img2, kp2, matches[:10], None)

img = np.dstack((im1Reg, img2, im1Reg))

cv2.imshow("Shifted", img3)
cv2.imshow("Original", img4)
cv2.imshow("Matches", img5)
cv2.imshow("Registered", im1Reg)
cv2.imshow("Merged", img)
cv2.waitKey(0)

显示我得到的匹配的图像

显示我得到的匹配的图像

标签: pythonopencvimage-registration

解决方案


(我可能是错的,因为没有处理过显微图像处理,并且必须存在解决该领域典型问题的普遍传播方式,如果它不是一个玩具项目,你应该研究这个领域)。

在我看来,您应该尝试另一个决定来解决您的问题,而不是使用任何类型的基于点特征的图像描述符(ORB、SURF 等)。首先,并非所有这些都提供您在处理显微镜图像时可能需要的亚像素精度。但主要原因是描述符背后的数学。参考任何简历书籍或论文。这是ORB 描述符文件的链接。注意作者用于匹配检测点的图像。好点是图像的边缘和角落之一,因此它可以用来匹配锐利和突出形状的物体。

众所周知的例子:

众所周知的例子

匹配点位于字母(独特形状)和纹理绘图上。尝试使用此工具检测纯绿色教科书(封面上没有任何字母和任何内容),您将失败。

所以我认为你的图像不是可以这样处理的(因为物体的形状不清晰,没有纹理并且彼此非常接近)。即使是人眼也很难匹配相似的圆圈(在不太明显的例子中,例如向左/向右移动一个视图)。

但我一眼就注意到,你的形象可以用上面的圆圈来描述。基于霍夫的圆检测要容易得多(无论是理解还是计算),真正重要的是,它可以在此类图像上提供几乎 100% 的准确度。您可以轻松地操作圈数、大小、位置等。

不过,显微镜 CV 是一个单独的领域,有自己的常用工具可供使用,使用 Hough 或其他东西可能有很多优点和缺点。但乍一看,它似乎比点特征描述更准确。


推荐阅读