-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathguiderfilter.py
More file actions
39 lines (28 loc) · 1.08 KB
/
guiderfilter.py
File metadata and controls
39 lines (28 loc) · 1.08 KB
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
import numpy as np
def boxfilter(img, r):
(rows, cols) = img.shape
imDst = np.zeros_like(img)
imCum = np.cumsum(img, 0)
imDst[0 : r+1, :] = imCum[r : 2*r+1, :]
imDst[r+1 : rows-r, :] = imCum[2*r+1 : rows, :] - imCum[0 : rows-2*r-1, :]
imDst[rows-r: rows, :] = np.tile(imCum[rows-1, :], [r, 1]) - imCum[rows-2*r-1 : rows-r-1, :]
imCum = np.cumsum(imDst, 1)
imDst[:, 0 : r+1] = imCum[:, r : 2*r+1]
imDst[:, r+1 : cols-r] = imCum[:, 2*r+1 : cols] - imCum[:, 0 : cols-2*r-1]
imDst[:, cols-r: cols] = np.tile(imCum[:, cols-1], [r, 1]).T - imCum[:, cols-2*r-1 : cols-r-1]
return imDst
def guidedfilter(I, p, r, eps):
(rows, cols) = I.shape
N = boxfilter(np.ones([rows, cols]), r)
meanI = boxfilter(I, r) / N
meanP = boxfilter(p, r) / N
meanIp = boxfilter(I * p, r) / N
covIp = meanIp - meanI * meanP
meanII = boxfilter(I * I, r) / N
varI = meanII - meanI * meanI
a = covIp / (varI + eps)
b = meanP - a * meanI
meanA = boxfilter(a, r) / N
meanB = boxfilter(b, r) / N
q = meanA * I + meanB
return q