使用matlab自编一个中值滤波函数mymedfilt2(A, [m,n]),实现Matlab中的medfilt2函数的功能(边缘采用复制的方式);对自选的灰度图像加上椒盐噪声,用自编的函数对其进行中值滤波。
时间: 2024-09-24 16:15:31 浏览: 45
MATLAB实现中值滤波(非medfilt2函数)
5星 · 资源好评率100%
在MATLAB中,你可以编写一个名为`mymedfilt2`的函数,该函数实现了中值滤波操作,类似于内置的`medfilt2`函数,但是允许你在滤波核大小上进行自定义。边缘处理通常会采用"边界复制"的方式,即在滤波时将边缘像素的值保持不变。
下面是一个简单的示例函数实现:
```matlab
function filtered = mymedfilt2(image, kernel_size)
% 检查输入尺寸和滤波核的有效性
if ~isnumeric(kernel_size) || length(kernel_size) ~= 2 || any(kernel_size < 1)
error('Kernel size should be a two-element vector with positive integers.');
end
m = kernel_size(1);
n = kernel_size(2);
% 边界复制
pad_image = padarray(image, [0, 0, (m - 1)/2, (n - 1)/2], 'replicate');
% 中值滤波操作
filtered = medfilt2(pad_image, [m n]);
% 移除填充部分
filtered = filtered((m - 1)/2 + 1:end - (n - 1)/2, :, :);
end
```
接下来,为了演示如何应用这个函数到带椒盐噪声的图像上,假设你已经有了一个名为`noisy_image`的灰度图像,可以这样做:
```matlab
% 添加椒盐噪声到图像
saltpepper_noise = 0.05; % 例如,5% 的椒盐噪声比例
noisy_image = imnoise(noisy_image, 'salt & pepper', saltpepper_noise);
% 自定义滤波核大小,比如3x3
kernel_size = [3, 3];
% 进行中值滤波
filtered_image = mymedfilt2(noisy_image, kernel_size);
% 可视化原始和处理后的图像
subplot(1, 2, 1), imshow(noisy_image, []);
title('Original Image with Salt & Pepper Noise');
subplot(1, 2, 2),.imshow(filtered_image, []);
title('Filtered Image using mymedfilt2');
```
阅读全文