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为横坐标之差的绝对值 + 1for j = 1:r+1 %j为纵坐标之差的绝对值 + 1w_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为像素值之差的绝对值 + 1w_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-rfor w = 1+r:width-r %窗口中心w_sum = 0; %权值和p_sum = 0; %权值未归一化与像素值的乘积和p_c = src(h,w); %中心像素点的值for j = h-r:h+rfor 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; %权值和endendp_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
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
