Matlab-形态学滤波去除椒盐噪声实例

形态学滤波最基本的两个形态学操作是腐蚀和膨胀,其他的高级形态学操作是基于这两个基本的形态学操作进行的,比如开运算、闭运算、形态学梯度、顶帽、黑帽等。

需要注意的是,在Matlab中,亮值是目标物,暗值是背景点。

先上结果:

 

代码:

%% 形态学去噪
P = imread('cameraman.jpg');
I = imnoise(P, 'salt & pepper', 0.05);

SE = strel('disk', 1);

J1 = imerode(I, SE);
J1 = imerode(J1, SE);
J2 = imdilate(J1, SE);
J2 = imdilate(J2, SE);
J2 = imdilate(J2, SE);
J2 = imdilate(J2, SE);
J3 = imerode(J2, SE);
J3 = imerode(J3, SE);
figure;
subplot(2,3,1), imshow(P), title("原图");
subplot(2,3,2), imshow(I), title("椒盐噪声");
subplot(2,3,3), imshow(J1), title("腐蚀两次");
subplot(2,3,4), imshow(J2), title("膨胀两次");
subplot(2,3,5), imshow(J3), title("膨胀两次");
subplot(2,3,6), imshow(J4), title("腐蚀两次");

%% 另一种方式
J1 = imclose(I, SE);
J2 = imopen(J1, SE);
J3 = imclose(J2, SE);
J4 = imopen(J3, SE);
figure;
subplot(2,3,1), imshow(P), title("原图");
subplot(2,3,2), imshow(I), title("椒盐噪声");
subplot(2,3,3), imshow(J1), title("闭运算");
subplot(2,3,4), imshow(J2), title("开运算");
subplot(2,3,5), imshow(J2), title("闭运算");
subplot(2,3,6), imshow(J4), title("开运算");

%% 中值滤波对比
m = medfilter(I, 3);
figure;
subplot(1,3,1), imshow(P), title("原图");
subplot(1,3,2), imshow(I), title("椒盐噪声");
subplot(1,3,3), imshow(m), title("中值滤波");

  中值滤波的函数可以参考 Matlab-代码实现图像平滑去噪 这一篇文章。

 

通过先腐蚀膨胀后膨胀腐蚀的方式可以实现先消除白点再消除黑点。也可以通过闭运算再开运算的方式消除椒盐噪声。形态学滤波的形式多种多样。

就结果而言,形态学滤波和中值滤波在处理椒盐噪声上的效果是近似的,在细节方面形态学滤波逊于中值滤波,因为形态学滤波只能够使图像总的位置和形状不变,在进行腐蚀和膨胀的时候会造成较多的信息丢失,而中值滤波相对损失较少的信息。

就过程而言,形态学滤波需要尝试结构元素的现状和大小、腐蚀和膨胀的先后顺序和开运算闭运算的顺序,过程比较复杂,而中值滤波较为简单。

posted @ 2022-04-15 00:02  Khrushchefox  阅读(1973)  评论(0编辑  收藏  举报