双边滤波器代码matlab
时间: 2024-01-27 12:05:49 浏览: 31
以下是一个基于局部自适应滤波器的双边滤波器的Matlab代码示例:
```matlab
% 读取图像
image = imread('image.jpg');
% 双边滤波参数设置
sigma_spatial = 10; % 空间域标准差
sigma_range = 20; % 强度域标准差
% 双边滤波
filtered_image = bilateralFilter(image, sigma_spatial, sigma_range);
% 显示原始图像和滤波后的图像
figure;
subplot(1, 2, 1);
imshow(image);
title('原始图像');
subplot(1, 2, 2);
imshow(filtered_image);
title('滤波后的图像');
% 双边滤波函数
function filtered_image = bilateralFilter(image, sigma_spatial, sigma_range)
[height, width, ~] = size(image);
filtered_image = zeros(size(image));
% 对每个像素进行滤波
for i = 1:height
for j = 1:width
% 获取当前像素的空间域范围
spatial_range = getSpatialRange(image, i, j, sigma_spatial);
% 获取当前像素的强度域范围
range_range = getRangeRange(image, i, j, sigma_range);
% 计算加权平均值
filtered_image(i, j, :) = weightedAverage(image, i, j, spatial_range, range_range);
end
end
end
% 获取当前像素的空间域范围
function spatial_range = getSpatialRange(image, i, j, sigma_spatial)
[height, width, ~] = size(image);
spatial_range = zeros(height, width);
% 计算每个像素与当前像素的空间距离
for x = 1:height
for y = 1:width
spatial_range(x, y) = sqrt((x - i)^2 + (y - j)^2);
end
end
% 计算空间域权重
spatial_weight = exp(-(spatial_range.^2) / (2 * sigma_spatial^2));
% 归一化空间域权重
spatial_weight = spatial_weight / sum(spatial_weight(:));
% 返回空间域范围
spatial_range = spatial_weight;
end
% 获取当前像素的强度域范围
function range_range = getRangeRange(image, i, j, sigma_range)
[height, width, ~] = size(image);
range_range = zeros(height, width);
% 计算每个像素与当前像素的强度差异
for x = 1:height
for y = 1:width
range_range(x, y) = norm(double(image(x, y, :)) - double(image(i, j, :)));
end
end
% 计算强度域权重
range_weight = exp(-(range_range.^2) / (2 * sigma_range^2));
% 归一化强度域权重
range_weight = range_weight / sum(range_weight(:));
% 返回强度域范围
range_range = range_weight;
end
% 计算加权平均值
function weighted_average = weightedAverage(image, i, j, spatial_range, range_range)
[height, width, channels] = size(image);
weighted_average = zeros(1, 1, channels);
% 对每个通道进行加权平均
for c = 1:channels
weighted_average(c) = sum(sum(double(image(:, :, c)) .* spatial_range .* range_range));
end
% 返回加权平均值
weighted_average = uint8(weighted_average);
end
```