-
Notifications
You must be signed in to change notification settings - Fork 0
/
preprocessor.py
68 lines (56 loc) · 2.28 KB
/
preprocessor.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
import cv2
import numpy as np
def crop_image(img):
# Go from the rightmost position and start moving left
columns = img.sum(axis=0)
co_point = 0 # Cutoff point
for col in range(columns.shape[0] - 1, -1, -1):
if np.all(columns[col] == 0):
co_point = col
else:
break
print(co_point)
return img[:, :co_point]
def pair_wise_match(img1, img2):
# Find keypoints and descriptors
orb = cv2.ORB_create()
keypoints1, descriptors1 = orb.detectAndCompute(img1, None)
keypoints2, descriptors2 = orb.detectAndCompute(img2, None)
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
matches = bf.match(descriptors1, descriptors2)
matches = sorted(matches, key = lambda x : x.distance)
print("Number of matching points:", len(matches))
good_matches = matches[:50] # Can reduce the candidate number for performance
# Get the coords of matched points
src_pts = np.float32([keypoints1[m.queryIdx].pt for m in good_matches]).reshape(-1,1,2)
dst_pts = np.float32([keypoints2[m.trainIdx].pt for m in good_matches]).reshape(-1,1,2)
# Calculate homography
homography, _ = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0)
# Warp images
res = cv2.warpPerspective(img1, homography, (img1.shape[1] + img2.shape[1], img2.shape[0]))
res[0 : img2.shape[0], 0 : img2.shape[1]] = img2
return crop_image(res) # Crop any empty pixels to reduce image sizes
# def _combine_images(images: list):
# prev_res = images[0]
# for i in range(1, len(images)):
# prev_res = pair_wise_match(prev_res, images[i])
# # cv2.imwrite(f"res_{i-1}_with_{i}.png", prev_res)
# return prev_res
# def combine_images(images: list):
# # Split array down the middle. Go from left to right and then right to left
# # Finally combine them together
# mid_idx = (len(images) - 1) // 2
# h1 = images[:mid_idx]
# t_h2 = images[mid_idx:]
# h2 = t_h2[::-1]
# return pair_wise_match(_combine_images(h2), _combine_images(h1))
def combine_images(images: list):
prev_res = images[0]
for i in range(1, len(images)):
prev_res = pair_wise_match(prev_res, images[i])
# cv2.imwrite(f"res_{i-1}_with_{i}.png", prev_res)
return prev_res
# Test...
# image1 = cv2.imread('image1.png')
# image2 = cv2.imread('image2.png')
# cv2.imwrite('result.png', combine_images([image1, image2]))