matlab 雙邊濾波(灰度圖)

% matlab 2012b
% 灰度圖的雙邊濾波
clc;
clear;

%-------雙邊濾波 參數 -----------------
r = 3;   %半徑   窗口 長 = 寬 = 2*r+1
sigma_space = 1.0;           %空間標準差
sigma_color = 1.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
%matlab數組下標從1開始 
%disp(w_space);
%disp(w_color);
%break;

%------- 加載圖片 進行濾波----------------
src=imread('cs.jpg');
src=rgb2gray(src);
src=double(src);             %一定要轉換格式 全部都爲double
[height,width] = size(src);  %matlab中 一個uint8與一個double計算 結果爲uint8類型 會
dst = src;
for h = 1+r:height-r
    for w = 1+r:width-r      %窗口中心
        w_sum = 0;           %權值和
        p_sum = 0;           %權值未歸一化與像素值的乘積和
        p_c = src(h,w);      %中心像素點的值
        for j = h-r:h+r
            for i = w-r:w+r                  %遍歷窗口內的像素
                p_t = src(j,i);              %像素點的值 以及未歸一化的權值
                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) = p_sum;      %賦值
    end
end

%轉換格式 顯示
src = uint8(src);
dst = uint8(dst);
subplot(121),imshow(src);
subplot(122),imshow(dst);
imwrite(dst,'cs1.jpg');
%src = im2bw(src, graythresh(src));
%dst = im2bw(dst, graythresh(dst));
%subplot(223),imshow(src);
%subplot(224),imshow(dst);

參考:
https://blog.csdn.net/l_eop/article/details/81812277
https://blog.csdn.net/qq_36359022/article/details/80198890
opencv源碼 bilateral_filter.cpp

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章