是否可以使用opencv匹配算法叠加两个共享地标但细节不同的图像

时间:2019-07-08 10:01:17

标签: python opencv

我正在使用以下代码来叠加使用不同显微镜拍摄的图像。这两个图像描述了相同的组织,但是使用了不同的技术。

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)  

由于两个图像不同,但是它们具有共同的标记,因此使用此算法可能不正确。

我的目标是知道较大图像中的绿色和红色在哪里。为此,我需要根据某些地标根据单应性旋转图像,如下图所示(仅作为示例)

所以我的问题是;如果我已经知道两个图像中的一些地标,例如蓝色(蓝色),如何将这些地标的单应性输入算法,以手动将小图像旋转到写入位置,以便我知道绿色和红色在哪里位于(未知)。

enter image description here

0 个答案:

没有答案