/
dehaze.py
79 lines (58 loc) · 2.44 KB
/
dehaze.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
"""Single image dehazing."""
from __future__ import division
import cv2
import numpy as np
class Channel_value:
val = -1.0
intensity = -1.0
def find_intensity_of_atmospheric_light(img, gray):
top_num = int(img.shape[0] * img.shape[1] * 0.001)
toplist = [Channel_value()] * top_num
dark_channel = find_dark_channel(img)
for y in xrange(img.shape[0]):
for x in xrange(img.shape[1]):
val = img.item(y, x, dark_channel)
intensity = gray.item(y, x)
for t in toplist:
if t.val < val or (t.val == val and t.intensity < intensity):
t.val = val
t.intensity = intensity
break
max_channel = Channel_value()
for t in toplist:
if t.intensity > max_channel.intensity:
max_channel = t
return max_channel.intensity
def find_dark_channel(img):
return np.unravel_index(np.argmin(img), img.shape)[2]
def clamp(minimum, x, maximum):
return max(minimum, min(x, maximum))
def dehaze(img, light_intensity, windowSize, t0, w):
size = (img.shape[0], img.shape[1])
outimg = np.zeros(img.shape, img.dtype)
for y in xrange(size[0]):
for x in xrange(size[1]):
x_low = max(x-(windowSize//2), 0)
y_low = max(y-(windowSize//2), 0)
x_high = min(x+(windowSize//2), size[1])
y_high = min(y+(windowSize//2), size[0])
sliceimg = img[y_low:y_high, x_low:x_high]
dark_channel = find_dark_channel(sliceimg)
t = 1.0 - (w * img.item(y, x, dark_channel) / light_intensity)
outimg.itemset((y,x,0), clamp(0, ((img.item(y,x,0) - light_intensity) / max(t, t0) + light_intensity), 255))
outimg.itemset((y,x,1), clamp(0, ((img.item(y,x,1) - light_intensity) / max(t, t0) + light_intensity), 255))
outimg.itemset((y,x,2), clamp(0, ((img.item(y,x,2) - light_intensity) / max(t, t0) + light_intensity), 255))
return outimg
def main():
imageName = raw_input() # eg. fg5.jpg
img = cv2.imread(imageName)
cv2.namedWindow("result", cv2.CV_WINDOW_AUTOSIZE)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
light_intensity = find_intensity_of_atmospheric_light(img, gray)
w = 0.95
t0 = 0.55
outimg = dehaze(img, light_intensity, 20, t0, w)
name = imageName+'_out_t0'+str(t0)+'_w'+str(w)+'.jpg'
print name
cv2.imwrite(name, outimg)
if __name__ == "__main__": main()