-
Notifications
You must be signed in to change notification settings - Fork 26
/
HazeRemovalWidthGuided.py
53 lines (40 loc) · 1.6 KB
/
HazeRemovalWidthGuided.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
#!/usr/bin/env python
# encoding: utf-8
from PIL import Image
import numpy as np
from guidedfilter import guidedfilter
class HazeRemoval:
def __init__(self, filename, omega = 0.85, r = 40):
self.filename = filename
self.omega = omega
self.r = r
self.eps = 10 ** (-3)
self.t = 0.1
def _ind2sub(self, array_shape, ind):
rows = (ind.astype('int') / array_shape[1])
cols = (ind.astype('int') % array_shape[1]) # or numpy.mod(ind.astype('int'), array_shape[1])
return (rows, cols)
def _rgb2gray(self, rgb):
return np.dot(rgb[...,:3], [0.299, 0.587, 0.114])
def haze_removal(self):
oriImage = np.array(Image.open(self.filename))
img = np.array(oriImage).astype(np.double) / 255.0
grayImage = self._rgb2gray(img)
darkImage = img.min(axis=2)
(i, j) = self._ind2sub(darkImage.shape, darkImage.argmax())
A = img[i, j, :].mean()
transmission = 1 - self.omega * darkImage / A
transmissionFilter = guidedfilter(grayImage, transmission, self.r, self.eps )
transmissionFilter[transmissionFilter < self.t] = self.t
resultImage = np.zeros_like(img)
for i in range(3):
resultImage[:, :, i] = (img[:, :, i] - A) / transmissionFilter + A
resultImage[resultImage < 0] = 0
resultImage[resultImage > 1] = 1
result = Image.fromarray((resultImage * 255).astype(np.uint8))
return result
if __name__ == '__main__':
imageName = "canon3.bmp"
hz = HazeRemoval("images/canon3.bmp")
result = hz.haze_removal()
result.show()