双边滤波matlab代码
时间: 2023-10-11 17:11:14 浏览: 15
基于双边滤波实现灰度和彩色图像去噪附matlab代码.zip
5星 · 资源好评率100%
% 双边滤波matlab代码
function [img_filtered] = bilateral_filter(img, sigma_d, sigma_r)
% 双边滤波函数
% img: 输入图像
% sigma_d: 空间域标准差
% sigma_r: 灰度值域标准差
[h,w,c] = size(img); % 获取图像的高、宽和通道数
if c == 3 % 如果是彩色图像
% 转换为 Lab 颜色空间
img = rgb2lab(img);
img_filtered = zeros(h,w,c);
% 对每个通道分别进行双边滤波
for i = 1:c
img_filtered(:,:,i) = bilateral_filter_channel(img(:,:,i), sigma_d, sigma_r);
end
% 转换回 RGB 颜色空间
img_filtered = lab2rgb(img_filtered);
else % 如果是灰度图像
img_filtered = bilateral_filter_channel(img, sigma_d, sigma_r);
end
end
function [img_filtered] = bilateral_filter_channel(img, sigma_d, sigma_r)
% 对单通道图像进行双边滤波
% img: 输入图像
% sigma_d: 空间域标准差
% sigma_r: 灰度值域标准差
[h,w] = size(img);
img_filtered = zeros(h,w);
% 计算空间域权重矩阵
[X,Y] = meshgrid(1:w,1:h);
X = X(:); Y = Y(:);
D = pdist2([X,Y],[X,Y]);
Wd = exp(-D.^2/(2*sigma_d^2));
% 对每个像素点进行计算
for i = 1:h
for j = 1:w
% 计算灰度值域权重矩阵
I = img(i,j);
Dr = img-I;
Wr = exp(-Dr.^2/(2*sigma_r^2));
% 计算总的权重矩阵
W = Wd.*Wr;
% 求解加权平均
img_filtered(i,j) = sum(W(:).*img(:))/sum(W(:));
end
end
end
阅读全文