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