Matlab-形态学滤波去除椒盐噪声实例
形态学滤波最基本的两个形态学操作是腐蚀和膨胀,其他的高级形态学操作是基于这两个基本的形态学操作进行的,比如开运算、闭运算、形态学梯度、顶帽、黑帽等。
需要注意的是,在Matlab中,亮值是目标物,暗值是背景点。
先上结果:
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | %% 形态学去噪 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-代码实现图像平滑去噪 这一篇文章。
通过先腐蚀膨胀后膨胀腐蚀的方式可以实现先消除白点再消除黑点。也可以通过闭运算再开运算的方式消除椒盐噪声。形态学滤波的形式多种多样。
就结果而言,形态学滤波和中值滤波在处理椒盐噪声上的效果是近似的,在细节方面形态学滤波逊于中值滤波,因为形态学滤波只能够使图像总的位置和形状不变,在进行腐蚀和膨胀的时候会造成较多的信息丢失,而中值滤波相对损失较少的信息。
就过程而言,形态学滤波需要尝试结构元素的现状和大小、腐蚀和膨胀的先后顺序和开运算闭运算的顺序,过程比较复杂,而中值滤波较为简单。
本文作者:Khru
本文链接:https://www.cnblogs.com/khrushchefox/p/16147184.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步