/
preprocessing.py
146 lines (123 loc) · 4.41 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
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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
import cv2
import skimage
import numpy as np
from skimage import img_as_float
from skimage.morphology import reconstruction
from scipy.ndimage import gaussian_filter
from skimage.util.dtype import dtype_range
from skimage.util import img_as_ubyte
from skimage import exposure
from skimage.morphology import disk
from skimage.filters import rank
from skimage import feature, filters
def erosion(image, erosionType, kernelSize):
if len(image.shape)>2:
raise "Shape mismatch"
# kernelSize = 3 # should be odd
# erosionType = cv2.MORPH_RECT
# erosionType = cv2.MORPH_CROSS
# erosionType = cv2.MORPH_ELLIPSE
element = cv2.getStructuringElement(erosionType, (2*kernelSize + 1, 2*kernelSize+1), (kernelSize, kernelSize))
erodedImage = cv2.erode(image, element)
return erodedImage
def dilate(image, kernelSize, erosionType):
if len(image.shape)>2:
raise "Shape mismatch"
# kernelSize = 3 # should be odd
# erosionType = cv2.MORPH_RECT
# erosionType = cv2.MORPH_CROSS
# erosionType = cv2.MORPH_ELLIPSE
element = cv2.getStructuringElement(erosionType, (2*kernelSize + 1, 2*kernelSize+1), (kernelSize, kernelSize))
dilatedImage = cv2.dilate(image, element)
return dilatedImage
def openImage(image, kernelSize):
if len(image.shape)>2:
raise "Shape mismatch"
# kernelSize = 3 # should be odd
# erosionType = cv2.MORPH_RECT
# erosionType = cv2.MORPH_CROSS
erosionType = cv2.MORPH_ELLIPSE
element = cv2.getStructuringElement(erosionType, (2*kernelSize + 1, 2*kernelSize+1), (kernelSize, kernelSize))
dst = cv2.morphologyEx(image, cv2.MORPH_OPEN, element)
return dst
def closeImage(image, kernelSize):
if len(image.shape)>2:
raise "Shape mismatch"
kernelSize = 3 # should be odd
# erosionType = cv2.MORPH_RECT
# erosionType = cv2.MORPH_CROSS
erosionType = cv2.MORPH_ELLIPSE
element = cv2.getStructuringElement(erosionType, (2*kernelSize + 1, 2*kernelSize+1), (kernelSize, kernelSize))
dst = cv2.morphologyEx(image, cv2.MORPH_CLOSE, element)
return dst
def gradientImage(image, kernelSize):
if len(image.shape)>2:
raise "Shape mismatch"
# kernelSize = 3 # should be odd
# erosionType = cv2.MORPH_RECT
# erosionType = cv2.MORPH_CROSS
erosionType = cv2.MORPH_ELLIPSE
element = cv2.getStructuringElement(erosionType, (2*kernelSize + 1, 2*kernelSize+1), (kernelSize, kernelSize))
dst = cv2.morphologyEx(image, cv2.MORPH_GRADIENT, element)
return dst
def dilation(image):
image = img_as_float(image)
image = gaussian_filter(image, 1)
# seed = np.copy(image)
h = 0.9
seed = image - h
# seed[1:-1, 1:-1] = image.min()
mask = image
dilated = reconstruction(seed, mask, method='dilation')
return dilated
def equalizeHist(image, globalHist=False):
if globalHist:
img = exposure.equalize_hist(image)
else:
# Equalization
selem = disk(200)
img = rank.equalize(image, selem=selem)
return img
def adaptiveEq(image, limit=0.03):
# Adaptive Equalization
img_adapteq = exposure.equalize_adapthist(image, clip_limit=limit)
return img_adapteq
def contrastStretching(image):
# Contrast stretching
p2, p98 = np.percentile(image, (25, 90))
img_rescale = exposure.rescale_intensity(image, in_range=(p2, p98))
return img_rescale
def canny(image, sigma=1):
edges = feature.canny(image, sigma=sigma)
return edges
def sobel(image):
edge_sobel = filters.sobel(image)
return edge_sobel
# Not working
def laplace(image, kernelSize=3):
h = 100
mask = image - h
dst = filters.laplace(image, kernelSize, mask)
return dst
def sift(image):
orb = cv2.ORB_create(nfeatures=1500)
# find the keypoints and descriptors with SIFT
kp, desc_a = orb.detectAndCompute(image, None)
img=cv2.drawKeypoints(image,kp,None,flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
return img
# kp_b, desc_b = orb.detectAndCompute(img_b, None)
# # initialize the bruteforce matcher
# bf = cv.BFMatcher(cv.NORM_HAMMING, crossCheck=True)
# # match.distance is a float between {0:100} - lower means more similar
# matches = bf.match(desc_a, desc_b)
# similar_regions = [i for i in matches if i.distance < 70]
# if len(matches) == 0:
# return 0
# return len(similar_regions) / len(matches)
def bitplane(img, bit):
lst = []
for i in range(img.shape[0]):
for j in range(img.shape[1]):
lst.append(np.binary_repr(img[i][j] ,width=8))
bit_img = (np.array([int(i[bit]) for i in lst],dtype = np.uint8) * 128).reshape(img.shape[0],img.shape[1])
return bit_img