使用matlab代码,设计一个自适应中值滤波器,要求能对输入的图像进行滤波并保存结果图
时间: 2024-02-12 15:03:59 浏览: 131
好的,我可以为您提供一个matlab代码实现自适应中值滤波器的例子。代码如下:
```matlab
function output_img = adaptive_median_filter(input_img, max_window_size)
% 自适应中值滤波器函数
% 输入参数:
% input_img:待滤波图像
% max_window_size: 最大窗口尺寸
% 输出参数:
% output_img:滤波后的图像
% 获取图像尺寸
[rows, cols] = size(input_img);
% 初始化输出图像
output_img = zeros(rows, cols);
% 遍历每个像素
for i = 1:rows
for j = 1:cols
% 获取当前像素的窗口尺寸,初始化为3x3
window_size = 3;
while(window_size <= max_window_size)
% 获取当前窗口
half_window = floor(window_size/2);
window = input_img(max(1,i-half_window):min(rows,i+half_window), max(1,j-half_window):min(cols,j+half_window));
% 计算窗口中像素的排序值
sorted_window = sort(window(:));
min_val = sorted_window(1);
max_val = sorted_window(end);
median_val = sorted_window(floor(window_size^2/2)+1);
% 判断当前像素是否为椒盐噪声
if(input_img(i,j) == min_val || input_img(i,j) == max_val)
% 判断是否达到最大窗口,若达到则输出当前像素值,否则扩大窗口
if(window_size == max_window_size)
output_img(i,j) = median_val;
else
window_size = window_size + 2;
end
else
% 判断当前像素是否为高斯噪声
mean_val = mean(window(:));
std_val = std(double(window(:)));
if(input_img(i,j) > mean_val-std_val && input_img(i,j) < mean_val+std_val)
output_img(i,j) = input_img(i,j);
else
output_img(i,j) = median_val;
end
break;
end
end
end
end
% 将输出图像转化为uint8类型
output_img = uint8(output_img);
end
```
使用该函数进行图像滤波的示例代码:
```matlab
% 读入图像
input_img = imread('input_image.png');
% 设置最大窗口尺寸为7
max_window_size = 7;
% 调用自适应中值滤波器函数
output_img = adaptive_median_filter(input_img, max_window_size);
% 显示原图和滤波后的图像
figure;
subplot(1, 2, 1); imshow(input_img); title('原图像');
subplot(1, 2, 2); imshow(output_img); title('滤波后的图像');
% 保存滤波后的图像
imwrite(output_img, 'output_image.png');
```
注意:本代码仅供参考,实际应用中需要根据具体需求进行修改和优化。
阅读全文