'Image registration problem : Very bad image registration result
I am trying to perform image registration and my registration output is completely bad .
Following is my code , the images that i posses are models of wounds acquired at different camera angle, links for the acquired images and output image is provided below for your review
import numpy as np
import cv2
from matplotlib import pyplot as plt
im1 = cv2.imread('/home/Documents/image_registration/1.jpg') # Image that needs to be registered.
im2 = cv2.imread('/home/Documents/image_registration/3.jpg') # trainImage
img1 = cv2.cvtColor(im1, cv2.COLOR_BGR2GRAY)
img2 = cv2.cvtColor(im2, cv2.COLOR_BGR2GRAY)
# Initiate ORB detector
orb = cv2.ORB_create(5000) #Registration works with at least 50 points
# find the keypoints and descriptors with orb
kp1, des1 = orb.detectAndCompute(img1, None) #kp1 --> list of keypoints
kp2, des2 = orb.detectAndCompute(img2, None)
#Brute-Force matcher takes the descriptor of one feature in first set and is
# create Matcher object
matcher = cv2.DescriptorMatcher_create(cv2.DESCRIPTOR_MATCHER_BRUTEFORCE_HAMMING)
# Match descriptors.
matches = matcher.match(des1, des2, None) #Creates a list of all matches, just like keypoints
# Sort them in the order of their distance.
matches = sorted(matches, key = lambda x:x.distance)
#Like we used cv2.drawKeypoints() to draw keypoints,
#cv2.drawMatches() helps us to draw the matches.
img3 = cv2.drawMatches(im1,kp1, im2, kp2, matches[:500], None)
#cv2.imshow("Matches image", img3)
#cv2.waitKey(0)
#Now let us use these key points to register two images.
#Can be used for distortion correction or alignment
#Second set to #trainIdx.
points1 = np.zeros((len(matches), 2), dtype=np.float32) #Prints empty array of size equal to (matches, 2)
points2 = np.zeros((len(matches), 2), dtype=np.float32)
for i, match in enumerate(matches):
points1[i, :] = kp1[match.queryIdx].pt #gives index of the descriptor in the list of query descriptors
points2[i, :] = kp2[match.trainIdx].pt #gives index of the descriptor in the list of train descriptors
h, mask = cv2.findHomography(points1, points2, cv2.RANSAC)
# Use homography
height, width, channels = im2.shape
im1Reg = cv2.warpPerspective(im1, h, (width, height)) #Applies a perspective transformation to an image.
print("Estimated homography : \n", h)
#cv2.imshow("Registered image", im1Reg)
#cv2.waitKey()
cv2.imwrite ( '/home/Documents/image_registration/output.jpg' , im1Reg)
image 3
Kindly suggest me the problem with my approach
Solution 1:[1]
in python tuples are immutable and sort function (in python list) is sorting in place and that's why it doesn't exist on tuples. to sort the tuples you should use the sorted function which returns a new list
in your case -
sorted(matches, key = lambda x: x.distance)
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | gil |



