我正在使用以下代码来叠加使用不同显微镜拍摄的图像。这两个图像描述了相同的组织,但是使用了不同的技术。
def match_images_using_orb(em_image, confocal_image):
gray_confocal = cv2.cvtColor(confocal_image, cv2.COLOR_RGB2GRAY)
#em_image is already gray
orb = cv2.ORB_create(500)
keypoints1, descriptors1 = orb.detectAndCompute(em_image, None)
keypoints2, descriptors2 = orb.detectAndCompute(gray_confocal, None)
#brute force matcher
matcher = cv2.BFMatcher(cv2.NORM_HAMMING)
matches = matcher.match(descriptors1, descriptors2)
matches.sort(key = lambda x: x.distance, reverse = False)
top_matches = int(len(matches) * 0.1)
matches = matches[:top_matches]
imMatches = cv2.drawMatches(em_image, keypoints1, gray_confocal, keypoints2, matches, None)
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, :] = keypoints1[match.queryIdx].pt
points2[i, :] = keypoints2[match.trainIdx].pt
h, _ = cv2.findHomography(points1, points2, cv2.RANSAC)
height, width, _ = em_image.shape
try:
#exclude negative homography
if h[ h < 0].size == 0:
em_reg = cv2.warpPerspective(confocal_image, h, (width, height))
else:
return False
except:
return False
else:
return (imMatches, em_reg, h)
由于两个图像不同,但是它们具有共同的标记,因此使用此算法可能不正确。
我的目标是知道较大图像中的绿色和红色在哪里。为此,我需要根据某些地标根据单应性旋转图像,如下图所示(仅作为示例)
所以我的问题是;如果我已经知道两个图像中的一些地标,例如蓝色(蓝色),如何将这些地标的单应性输入算法,以手动将小图像旋转到写入位置,以便我知道绿色和红色在哪里位于(未知)。