-
Notifications
You must be signed in to change notification settings - Fork 7
/
FeatureMatcher.py
123 lines (94 loc) · 3.55 KB
/
FeatureMatcher.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
"""
Created on Sat January 4 14:00:41 2017
Feature matcher main class
@author: Faizaan Naveed
"""
import Ransac
import Transformations
import numpy as np
import matplotlib.pyplot as plt
I1 = plt.imread('library1.jpg')
I2 = plt.imread('library2.jpg')
matches = np.loadtxt('library_matches.txt')
Input_coord1 = matches[:,0:2]
Input_coord2 = matches[:,2:4]
### LS Affine transformation ###
Affine_T = Transformations.AffineTransformer(Input_coord1, Input_coord2)
# Generate a pseudo z-axis
PS_Input_coord1 = np.hstack((Input_coord1, np.ones(shape=(len(Input_coord1), 1))))
PS_Input_coord2 = np.hstack((Input_coord2, np.ones(shape=(len(Input_coord2), 1))))
# Transformed coordinates
Tr_coord1 = np.matmul(np.linalg.inv(Affine_T),np.transpose(PS_Input_coord2))
Tr_coord2 = np.matmul(Affine_T,np.transpose(PS_Input_coord1))
# Residuals and mean error
Residuals_IC1 = Tr_coord2.T-PS_Input_coord2
Residuals_IC2 = Tr_coord1.T-PS_Input_coord1
Mean_Res_IC1 = np.mean(Residuals_IC1)
Mean_Res_IC2 = np.mean(Residuals_IC2)
# Display the image
fig = plt.figure('LS Affine Transformation')
ax1 = fig.add_subplot(1,2,1)
ax1.imshow(I1)
plt.axis('off')
ax2 = fig.add_subplot(1,2,2)
ax2.imshow(I2)
plt.axis('off')
# Plot the transformed points
ax2.plot(matches[:,2], matches[:,3], 'r+')
ax2.plot(Tr_coord2[0,:], Tr_coord2[1,:], 'b+')
ax1.plot(matches[:,0], matches[:,1], 'r+')
ax1.plot(Tr_coord1[0,:], Tr_coord1[1,:], 'b+')
### Affine + Ransac ###
Inliers, Affine_R = Ransac.Ransac(matches, TYPE=1, N=10, Epsilon=0.1)
Tr_coord1_R = np.matmul(np.linalg.inv(Affine_R),np.transpose(PS_Input_coord2))
Tr_coord2_R = np.matmul(Affine_R,np.transpose(PS_Input_coord1))
# Display the image
fig = plt.figure('LS Affine Ransac')
ax1 = fig.add_subplot(1,2,1)
ax1.imshow(I1)
plt.axis('off')
ax2 = fig.add_subplot(1,2,2)
ax2.imshow(I2)
plt.axis('off')
# Plot the transformed points
ax2.plot(matches[:,2], matches[:,3], 'r+')
ax2.plot(Tr_coord2_R[0,:], Tr_coord2_R[1,:], 'b+')
ax1.plot(matches[:,0], matches[:,1], 'r+')
ax1.plot(Tr_coord1_R[0,:], Tr_coord1_R[1,:], 'b+')
### Homography Transformation ###
Homography_T = Transformations.Homography(Input_coord1, Input_coord2)
# Transformed coordinates
Tr_coord2_H = Transformations.HomographyTransformer(Homography_T, Input_coord1)
Tr_coord1_H = Transformations.HomographyTransformer(np.linalg.inv(Homography_T), Input_coord2)
# Display the image
fig = plt.figure('Homogrphy Transformation')
ax1 = fig.add_subplot(1,2,1)
ax1.imshow(I1)
plt.axis('off')
ax2 = fig.add_subplot(1,2,2)
ax2.imshow(I2)
plt.axis('off')
# Plot the transformed points
ax2.plot(matches[:,2], matches[:,3], 'r+')
ax2.plot(Tr_coord2_H[:,0], Tr_coord2_H[:,1], 'b+')
ax1.plot(matches[:,0], matches[:,1], 'r+')
ax1.plot(Tr_coord1_H[:,0], Tr_coord1_H[:,1], 'b+')
### Homography Ransac Transformation ###
Inliers, Homography_R = Ransac.Ransac(matches, TYPE=2, N=10, Epsilon=0.1)
# Transformed coordinates
Tr_coord2_H = Transformations.HomographyTransformer(Homography_R, Input_coord1)
Tr_coord1_H = Transformations.HomographyTransformer(np.linalg.inv(Homography_R), Input_coord2)
# Display the image
fig = plt.figure('Homogrphy Ransac Transformation')
ax1 = fig.add_subplot(1,2,1)
ax1.imshow(I1)
plt.axis('off')
ax2 = fig.add_subplot(1,2,2)
ax2.imshow(I2)
plt.axis('off')
# Plot the transformed points
ax2.plot(matches[:,2], matches[:,3], 'r+')
ax2.plot(Tr_coord2_H[:,0], Tr_coord2_H[:,1], 'b+')
ax1.plot(matches[:,0], matches[:,1], 'r+')
ax1.plot(Tr_coord1_H[:,0], Tr_coord1_H[:,1], 'b+')
print('All done!')