-
Notifications
You must be signed in to change notification settings - Fork 113
/
Copy pathdhe.py
109 lines (91 loc) · 3.01 KB
/
dhe.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
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors
import imageio
import scipy, scipy.misc, scipy.signal
import cv2
import sys
def build_is_hist(img):
hei = img.shape[0]
wid = img.shape[1]
ch = img.shape[2]
Img = np.zeros((hei+4, wid+4, ch))
for i in range(ch):
Img[:,:,i] = np.pad(img[:,:,i], (2,2), 'edge')
hsv = (matplotlib.colors.rgb_to_hsv(Img))
hsv[:,:,0] = hsv[:,:,0] * 255
hsv[:,:,1] = hsv[:,:,1] * 255
hsv[hsv>255] = 255
hsv[hsv<0] = 0
hsv = hsv.astype(np.uint8).astype(np.float64)
fh = np.array([[-1.0,0.0,1.0],[-2.0,0.0,2.0],[-1.0,0.0,1.0]])
fv = fh.conj().T
H = hsv[:,:,0]
S = hsv[:,:,1]
I = hsv[:,:,2]
dIh = scipy.signal.convolve2d(I, np.rot90(fh, 2), mode='same')
dIv = scipy.signal.convolve2d(I, np.rot90(fv, 2), mode='same')
dIh[dIh==0] = 0.00001
dIv[dIv==0] = 0.00001
dI = np.sqrt(dIh**2+dIv**2).astype(np.uint32)
di = dI[2:hei+2,2:wid+2]
dSh = scipy.signal.convolve2d(S, np.rot90(fh, 2), mode='same')
dSv = scipy.signal.convolve2d(S, np.rot90(fv, 2), mode='same')
dSh[dSh==0] = 0.00001
dSv[dSv==0] = 0.00001
dS = np.sqrt(dSh**2+dSv**2).astype(np.uint32)
ds = dS[2:hei+2,2:wid+2]
h = H[2:hei+2,2:wid+2]
s = S[2:hei+2,2:wid+2]
i = I[2:hei+2,2:wid+2].astype(np.uint8)
Imean = scipy.signal.convolve2d(I,np.ones((5,5))/25, mode='same')
Smean = scipy.signal.convolve2d(S,np.ones((5,5))/25, mode='same')
Rho = np.zeros((hei+4,wid+4))
for p in range(2,hei+2):
for q in range(2,wid+2):
tmpi = I[p-2:p+3,q-2:q+3]
tmps = S[p-2:p+3,q-2:q+3]
corre = np.corrcoef(tmpi.flatten('F'),tmps.flatten('F'))
Rho[p,q] = corre[0,1]
rho = np.abs(Rho[2:hei+2,2:wid+2])
rho[np.isnan(rho)] = 0
rd = (rho*ds).astype(np.uint32)
Hist_I = np.zeros((256,1))
Hist_S = np.zeros((256,1))
for n in range(0,255):
temp = np.zeros(di.shape)
temp[i==n] = di[i==n]
Hist_I[n+1] = np.sum(temp.flatten('F'))
temp = np.zeros(di.shape)
temp[i==n] = rd[i==n]
Hist_S[n+1] = np.sum(temp.flatten('F'))
return Hist_I, Hist_S
def dhe(img, alpha=0.5):
hist_i, hist_s = build_is_hist(img)
hist_c = alpha*hist_s + (1-alpha)*hist_i
hist_sum = np.sum(hist_c)
hist_cum = hist_c.cumsum(axis=0)
hsv = matplotlib.colors.rgb_to_hsv(img)
h = hsv[:,:,0]
s = hsv[:,:,1]
i = hsv[:,:,2].astype(np.uint8)
c = hist_cum / hist_sum
s_r = (c * 255)
i_s = np.zeros(i.shape)
for n in range(0,255):
i_s[i==n] = s_r[n+1]/255.0
i_s[i==255] = 1
hsi_o = np.stack((h,s,i_s), axis=2)
result = matplotlib.colors.hsv_to_rgb(hsi_o)
result = result * 255
result[result>255] = 255
result[result<0] = 0
return result.astype(np.uint8)
def main():
img_name = sys.argv[1]
img = imageio.imread(img_name)
result = dhe(img)
plt.imshow(result)
plt.show()
if __name__ == '__main__':
main()