aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'MATLAB/guidedfilter_color.m')
-rwxr-xr-xMATLAB/guidedfilter_color.m59
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 @@
1function 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);
10N = boxfilter(ones(hei, wid), r); % the size of each local patch; N=(2r+1)^2 except for boundary pixels.
11
12mean_I_r = boxfilter(I(:, :, 1), r) ./ N;
13mean_I_g = boxfilter(I(:, :, 2), r) ./ N;
14mean_I_b = boxfilter(I(:, :, 3), r) ./ N;
15
16mean_p = boxfilter(p, r) ./ N;
17
18mean_Ip_r = boxfilter(I(:, :, 1).*p, r) ./ N;
19mean_Ip_g = boxfilter(I(:, :, 2).*p, r) ./ N;
20mean_Ip_b = boxfilter(I(:, :, 3).*p, r) ./ N;
21
22% covariance of (I, p) in each local patch.
23cov_Ip_r = mean_Ip_r - mean_I_r .* mean_p;
24cov_Ip_g = mean_Ip_g - mean_I_g .* mean_p;
25cov_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
32var_I_rr = boxfilter(I(:, :, 1).*I(:, :, 1), r) ./ N - mean_I_r .* mean_I_r;
33var_I_rg = boxfilter(I(:, :, 1).*I(:, :, 2), r) ./ N - mean_I_r .* mean_I_g;
34var_I_rb = boxfilter(I(:, :, 1).*I(:, :, 3), r) ./ N - mean_I_r .* mean_I_b;
35var_I_gg = boxfilter(I(:, :, 2).*I(:, :, 2), r) ./ N - mean_I_g .* mean_I_g;
36var_I_gb = boxfilter(I(:, :, 2).*I(:, :, 3), r) ./ N - mean_I_g .* mean_I_b;
37var_I_bb = boxfilter(I(:, :, 3).*I(:, :, 3), r) ./ N - mean_I_b .* mean_I_b;
38
39a = zeros(hei, wid, 3);
40for 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
51end
52
53b = mean_p - a(:, :, 1) .* mean_I_r - a(:, :, 2) .* mean_I_g - a(:, :, 3) .* mean_I_b; % Eqn. (15) in the paper;
54
55q = (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;
59end \ No newline at end of file
Powered by cgit v1.2.3 (git 2.41.0)