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-代码实现图像平滑去噪 这一篇文章。
通过先腐蚀膨胀后膨胀腐蚀的方式可以实现先消除白点再消除黑点。也可以通过闭运算再开运算的方式消除椒盐噪声。形态学滤波的形式多种多样。
就结果而言,形态学滤波和中值滤波在处理椒盐噪声上的效果是近似的,在细节方面形态学滤波逊于中值滤波,因为形态学滤波只能够使图像总的位置和形状不变,在进行腐蚀和膨胀的时候会造成较多的信息丢失,而中值滤波相对损失较少的信息。
就过程而言,形态学滤波需要尝试结构元素的现状和大小、腐蚀和膨胀的先后顺序和开运算闭运算的顺序,过程比较复杂,而中值滤波较为简单。