diff options
Diffstat (limited to 'MATLAB/guidedfilter_color.m')
-rwxr-xr-x | MATLAB/guidedfilter_color.m | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/MATLAB/guidedfilter_color.m b/MATLAB/guidedfilter_color.m new file mode 100755 index 0000000..226b5df --- /dev/null +++ b/MATLAB/guidedfilter_color.m | |||
@@ -0,0 +1,59 @@ | |||
1 | function q = guidedfilter_color(I, p, r, eps) | ||
2 | % GUIDEDFILTER_COLOR O(1) time implementation of guided filter using a color image as the guidance. | ||
3 | % | ||
4 | % - guidance image: I (should be a color (RGB) image) | ||
5 | % - filtering input image: p (should be a gray-scale/single channel image) | ||
6 | % - local window radius: r | ||
7 | % - regularization parameter: eps | ||
8 | |||
9 | [hei, wid] = size(p); | ||
10 | N = boxfilter(ones(hei, wid), r); % the size of each local patch; N=(2r+1)^2 except for boundary pixels. | ||
11 | |||
12 | mean_I_r = boxfilter(I(:, :, 1), r) ./ N; | ||
13 | mean_I_g = boxfilter(I(:, :, 2), r) ./ N; | ||
14 | mean_I_b = boxfilter(I(:, :, 3), r) ./ N; | ||
15 | |||
16 | mean_p = boxfilter(p, r) ./ N; | ||
17 | |||
18 | mean_Ip_r = boxfilter(I(:, :, 1).*p, r) ./ N; | ||
19 | mean_Ip_g = boxfilter(I(:, :, 2).*p, r) ./ N; | ||
20 | mean_Ip_b = boxfilter(I(:, :, 3).*p, r) ./ N; | ||
21 | |||
22 | % covariance of (I, p) in each local patch. | ||
23 | cov_Ip_r = mean_Ip_r - mean_I_r .* mean_p; | ||
24 | cov_Ip_g = mean_Ip_g - mean_I_g .* mean_p; | ||
25 | cov_Ip_b = mean_Ip_b - mean_I_b .* mean_p; | ||
26 | |||
27 | % variance of I in each local patch: the matrix Sigma in Eqn (14). | ||
28 | % Note the variance in each local patch is a 3x3 symmetric matrix: | ||
29 | % rr, rg, rb | ||
30 | % Sigma = rg, gg, gb | ||
31 | % rb, gb, bb | ||
32 | var_I_rr = boxfilter(I(:, :, 1).*I(:, :, 1), r) ./ N - mean_I_r .* mean_I_r; | ||
33 | var_I_rg = boxfilter(I(:, :, 1).*I(:, :, 2), r) ./ N - mean_I_r .* mean_I_g; | ||
34 | var_I_rb = boxfilter(I(:, :, 1).*I(:, :, 3), r) ./ N - mean_I_r .* mean_I_b; | ||
35 | var_I_gg = boxfilter(I(:, :, 2).*I(:, :, 2), r) ./ N - mean_I_g .* mean_I_g; | ||
36 | var_I_gb = boxfilter(I(:, :, 2).*I(:, :, 3), r) ./ N - mean_I_g .* mean_I_b; | ||
37 | var_I_bb = boxfilter(I(:, :, 3).*I(:, :, 3), r) ./ N - mean_I_b .* mean_I_b; | ||
38 | |||
39 | a = zeros(hei, wid, 3); | ||
40 | for y=1:hei | ||
41 | for x=1:wid | ||
42 | Sigma = [var_I_rr(y, x), var_I_rg(y, x), var_I_rb(y, x); | ||
43 | var_I_rg(y, x), var_I_gg(y, x), var_I_gb(y, x); | ||
44 | var_I_rb(y, x), var_I_gb(y, x), var_I_bb(y, x)]; | ||
45 | %Sigma = Sigma + eps * eye(3); | ||
46 | |||
47 | cov_Ip = [cov_Ip_r(y, x), cov_Ip_g(y, x), cov_Ip_b(y, x)]; | ||
48 | |||
49 | a(y, x, :) = cov_Ip * inv(Sigma + eps * eye(3)); % Eqn. (14) in the paper; | ||
50 | end | ||
51 | end | ||
52 | |||
53 | b = mean_p - a(:, :, 1) .* mean_I_r - a(:, :, 2) .* mean_I_g - a(:, :, 3) .* mean_I_b; % Eqn. (15) in the paper; | ||
54 | |||
55 | q = (boxfilter(a(:, :, 1), r).* I(:, :, 1)... | ||
56 | + boxfilter(a(:, :, 2), r).* I(:, :, 2)... | ||
57 | + boxfilter(a(:, :, 3), r).* I(:, :, 3)... | ||
58 | + boxfilter(b, r)) ./ N; % Eqn. (16) in the paper; | ||
59 | end \ No newline at end of file | ||