% matlab 2012b
% 彩色圖的雙邊濾波
clc;
clear;
src=imread('cs.jpg'); %加載彩色圖
%-------雙邊濾波 參數 -----------------
r = 20; %半徑 窗口 長 = 寬 = 2*r+1
sigma_space = 15.0; %空間標準差
sigma_color = 10.0; %相似標準差
w_space = zeros(1,r+1); %空間權重
for i = 1:r+1 %i爲橫座標之差的絕對值 + 1
for j = 1:r+1 %j爲縱座標之差的絕對值 + 1
w_space(i,j) = exp(-double((i-1)^2 + (j-1)^2) / (2 * sigma_space^2));
end
end
w_color = zeros(1,256); %相似權重
for i = 1:256 %i爲像素值之差的絕對值 + 1
w_color(i) = exp(-double((i-1)^2) / (2 * sigma_color^2));
end
%disp(w_space);
%disp(w_color);
%break;
%--------- 進行濾波 ------------------
src=double(src);
[height,width,channel] = size(src);
if channel ~= 3 %判斷是否爲3通道彩色圖
break; %不是則退出函數
end
dst = src;
for h = 1+r:height-r
for w = 1+r:width-r %窗口中心
for c = 1:channel %彩色圖 三通道
w_sum = 0; %權值和
p_sum = 0; %權值未歸一化與像素值的乘積和
p_c = src(h,w,c); %中心像素點的值
for j = h-r:h+r
for i = w-r:w+r %遍歷窗口內的像素
p_t = src(j,i,c); %像素點的值 以及未歸一化的權值
w_tmp = w_space(abs(i-w)+1,abs(j-h)+1) * w_color(abs(p_c-p_t)+1);
p_sum = p_sum + p_t * w_tmp; %權值未歸一化與像素值的乘積和
w_sum = w_sum + w_tmp; %權值和
end
end
p_sum = p_sum / w_sum; %歸一化
dst(h,w,c) = p_sum; %賦值
end
end
end
%轉換格式 顯示
src = uint8(src);
dst = uint8(dst);
subplot(121),imshow(src);
subplot(122),imshow(dst);
參考:
https://blog.csdn.net/l_eop/article/details/81812277
https://blog.csdn.net/qq_36359022/article/details/80198890
opencv源碼 bilateral_filter.cpp