-
Notifications
You must be signed in to change notification settings - Fork 2
/
preprocessing.py
96 lines (74 loc) · 1.97 KB
/
preprocessing.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
import numpy as np
import cv2 as cv
import os
import shutil
def get_start_end(img):
h, w = img.shape
start = -1
for i in range(w):
for j in range(h):
p = img[j][i]
if start == -1 and p == 255:
start = i
break
if start != -1:
break
end = start
j = w - 1
while j > start:
i = h - 1
while i >= 0:
p = img[i][j]
if p == 255:
end = j
break
i -= 1
if end != start:
break
j -= 1
return start, end
def extract_lines(img):
if img is None:
return
_, img_binary_orig = cv.threshold(img, 190, 255, 0)
img_binary = cv.bitwise_not(img_binary_orig)
length, width = img_binary.shape
kernel = np.array([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]])
img_dilated = cv.dilate(img_binary, kernel, iterations=10)
contours, hierarchy = cv.findContours(img_dilated, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_NONE)
rects = [cv.boundingRect(ctr) for ctr in contours]
chosen_rects = []
start = False
rects = sorted(rects, key=lambda x: x[1])
for r in rects:
x, y, w, h = r
lower_limit = length * 0.16
upper_limit = length * 0.85
if h < 30 and w > 350 and y > 0.1 * length:
start = True
continue
if start or y > 0.25 * length:
if y < lower_limit or y > upper_limit or h < 80 or h > 235 or w < 1000:
continue
chosen_rects.append(r)
imgs = []
for i, r in enumerate(chosen_rects):
x, y, w, h = r
new_img = img[y:y+h, x:x+w]
start, end = get_start_end(img_binary[y:y+h, x:x+w])
new_img = new_img[:, start:end]
imgs.append(new_img)
return imgs
def preprocess(authors_forms_images, test_form_image):
authors_lines_images = []
for a in authors_forms_images:
imgs = []
for i, img in enumerate(a):
# break them into lines, save them into lines_path
if i == 0:
imgs = extract_lines(img)
else:
imgs = imgs + extract_lines(img)
authors_lines_images.append(np.array(imgs))
test_lines_images = extract_lines(test_form_image)
return np.array(authors_lines_images), np.array(test_lines_images)