-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmain.py
94 lines (76 loc) · 2.59 KB
/
main.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 cv2 as cv
from glob import glob
import os
import numpy as np
from poincare import calculate_singularities
from segmentation import create_segmented_and_variance_images
from normalization import normalize
from gabor_filter import gabor_filter
from frequency import ridge_freq
import orientation
from crossing_number import calculate_minutiaes
from tqdm import tqdm
from skeletonize import skeletonize
def f(input_img):
# normalization -> orientation -> frequency -> mask -> filtering
block_size = 16
# normalization - removes the effects of sensor noise and finger pressure differences.
normalized_img = normalize(input_img.copy(), float(100), float(100))
# ROI and normalisation
(segmented_img, normim, mask) = create_segmented_and_variance_images(
normalized_img, block_size, 0.2
)
# orientations
angles = orientation.calculate_angles(normalized_img, W=block_size, smoth=False)
orientation_img = orientation.visualize_angles(
segmented_img, mask, angles, W=block_size
)
# find the overall frequency of ridges in Wavelet Domain
freq = ridge_freq(
normim,
mask,
angles,
block_size,
kernel_size=5,
minWaveLength=5,
maxWaveLength=15,
)
# create gabor filter and do the actual filtering
gabor_img = gabor_filter(normim, angles, freq)
# thinning oor skeletonize
thin_image = skeletonize(gabor_img)
# minutias
minutias = calculate_minutiaes(thin_image)
# singularities
singularities_img = calculate_singularities(thin_image, angles, 1, block_size, mask)
# visualize pipeline stage by stage
output_imgs = [
input_img,
normalized_img,
segmented_img,
orientation_img,
gabor_img,
thin_image,
minutias,
singularities_img,
]
for i in range(len(output_imgs)):
if len(output_imgs[i].shape) == 2:
output_imgs[i] = cv.cvtColor(output_imgs[i], cv.COLOR_GRAY2RGB)
results = np.concatenate(
[np.concatenate(output_imgs[:4], 1), np.concatenate(output_imgs[4:], 1)]
).astype(np.uint8)
return results
if __name__ == "__main__":
# open images
img_dir = "./input/*"
output_dir = "./output/"
def open_images(directory):
images_paths = glob(directory)
return np.array([cv.imread(img_path, 0) for img_path in images_paths])
images = open_images(img_dir)
# image pipeline
os.makedirs(output_dir, exist_ok=True)
for i, img in enumerate(tqdm(images)):
results = f(img)
cv.imwrite(output_dir + str(i) + ".png", results)