本文链接:https://blog.csdn.net/LYduring/article/details/80443573

一、目的
实现算术均值滤波器、几何均值滤波器、中值滤波器、修正的阿尔法均值滤波器、自适应中值滤波器,并比较不同滤波器的降噪结果。

二、代码
代码的思路如下:

(1)先对原始的电路图先后进行加高斯噪声和椒盐噪声;之后设置滤波器的模板大小为5*5,分别对被噪声污染的图像进行算术均值、几何均值、中值、修正的阿尔法滤波,并输出图像,方便结果比较。

(2)为了比较中值滤波器和自适应中值滤波器的滤波结果,先对原始电路图添加椒盐噪声;接着对噪声图像进行模板大小为5*5的中值滤波;最后对噪声图像进行最大模板为5*5的自适应中值滤波,分别输出滤波后的图像,比较结果。

代码具体实现如下:

%******************************************************%
%目的:比较几种不同均值滤波器和自适应中值滤波器的去噪声效果
%日期:2018.5.
%******************************************************% %读入图像
img = imread('img.tif');
figure;
subplot(,,);
imshow(img);
title('原始图像');
%分别添加加入高斯噪声和椒盐噪声
f1 = imnoise(img,'gaussian');
subplot(,,)
imshow(f1);
title('添加高斯噪声');
f2 = imnoise(f1,'salt & pepper');
subplot(,,)
imshow(f2);
title('再添加椒盐噪声');
f2 = double(f2);
[M,N] = size(f2); %%%%比较几种均值滤波器及中值滤波器的滤波结果%%%%%%
%算术均值滤波器
n = ; %模板大小
f11 = f2;
for i = :M-n+
for j = :N-n+
g1 = f2(i:i+n-,j:j+n-);
s1 = sum(sum(g1));
%中心点的值用子图像的算术均值代替
f11(i+(n-)/,j+(n-)/) = s1/(n*n);
end
end
img1 = uint8(f11);
figure;
subplot(,,);
imshow(img1);
title('算术均值滤波结果'); %几何均值滤波器
n = ; %模板大小
f21 = f2 + ones(M,N); %防止有个像素点为0而导致乘积为0
f12 = f21;
for i = :M-n+
for j = :N-n+
g2 = f21(i:i+n-,j:j+n-);
s2 = prod(g2(:));
%中心点的值用子图像的几何均值代替
f12(i+(n-)/,j+(n-)/) = s2.^(/numel(g2));
end
end
img2 = uint8(f12);
subplot(,,);
imshow(img2);
title('几何均值滤波结果'); %中值滤波器
img3 = uint8(medfilt2(f2,[ ]));
figure;
subplot(,,);
imshow(img3);
title('中值滤波结果'); %修正的阿尔法均值滤波器
n = ; %模板大小
d = ; %去掉最值灰度值的个数
f13 = f2;
for i = :M-n+
for j = :N-n+
g3 = f2(i:i+n-,j:j+n-);
g3 = sort(g3(:)); %对邻域内的像素点进行排序
min_num = ceil(d/); %去掉最小灰度值的个数
max_num = floor(d/); %去掉最大灰度值的个数
%去掉d个最值灰度级后求算术均值
g3(:min_num) = zeros(min_num,);
g3(n-max_num+:n) = zeros(max_num,);
s3 = sum(g3);
%中心点的值用子图像的算术均值代替
f13(i+(n-)/,j+(n-)/) = s3/(n*n-d);
end
end
img4 = uint8(f13);
subplot(,,);
imshow(img4);
title('修正的阿尔法均值滤波结果'); %%%%%%%比较中值滤波器及自适应中值滤波器的滤波结果%%%%%%%
f2 = imnoise(img,'salt & pepper');
figure;
subplot(,,);
imshow(img);
title('原图');
subplot(,,);
imshow(f2);
title('添加椒盐噪声的图像'); %中值滤波器
img5 = uint8(medfilt2(f2,[ ]));
subplot(,,);
imshow(img5);
title('中值滤波结果'); %自适应中值滤波器
f14 = f2;
alreadyPro = false(size(f2)); %看是否完成进程
Smax=; %最大窗口尺寸
for s = ::Smax %起始窗口尺寸设为3
%得到特定的灰度值
zmin = ordfilt2(f2, , ones(s, s), 'symmetric');
zmax = ordfilt2(f2, s * s, ones(s, s), 'symmetric');
zmed = medfilt2(f2, [s s], 'symmetric');
%进程B
processB = (zmed > zmin) & (zmax > zmed) & ~alreadyPro;
%进程A
processA = (f2 > zmin) & (zmax > f2);
outZxy = processB & processA;
outZmed = processB & ~processA;
f14(outZxy) = f2(outZxy);
f14(outZmed) = zmed(outZmed);
alreadyPro = alreadyPro | processB;
if all(alreadyPro(:))
break;
end
end
f14(~alreadyPro) = zmed(~alreadyPro);
img6 = uint8(f14);
subplot(,,);
imshow(img6);
title('自适应中值滤波结果');

三、结果分析
得到的结果如下:

由滤波结果,我们可以看出,对于添加了高斯噪声和椒盐噪声的图像,算术均值和几何均值滤波器的效果比较差,尤其是几何均值滤波器;而中值滤波器和修正后的阿尔法均值滤波器的降噪效果比前面两种滤波器的效果要好很多,修正的阿尔法均值滤波器的效果最好,使图像变得更平滑。中值滤波器和自适应中值滤波器进行比较,两者的降噪效果都不错,不过中值滤波器导致了原始图像细节的丢失,而自适应中值滤波器则很好地保持了原始图像的清晰度和细节。

几种常见空间滤波器MATLAB实现的更多相关文章

  1. 数字图像处理- 3.4 空间滤波 and 3.5 平滑空间滤波器

    3.4 空间滤波基础 • Images are often corrupted by random variations in intensity, illumination, or have poo ...

  2. JavaScript 中 4 种常见的内存泄露陷阱

    了解 JavaScript 的内存泄露和解决方式! 在这篇文章中我们将要探索客户端 JavaScript 代码中常见的一些内存泄漏的情况,并且学习如何使用 Chrome 的开发工具来发现他们.读一读吧 ...

  3. ADB几种常见的错误及解决方法

    下面列举出几种常见的错误及解决方法. Q1:无效的安装包,安装包已损坏[INSTALL_FAILED_INVALID_APK] A1:请检查安装包是否完整.如果是xpk包,可以通过 手动安装xpk来检 ...

  4. JAVA几种常见的编码格式(转)

    简介 编码问题一直困扰着开发人员,尤其在 Java 中更加明显,因为 Java 是跨平台语言,不同平台之间编码之间的切换较多.本文将向你详细介绍 Java 中编码问题出现的根本原因,你将了解到:Jav ...

  5. Java几种常见的编码方式

    几种常见的编码格式 为什么要编码 不知道大家有没有想过一个问题,那就是为什么要编码?我们能不能不编码?要回答这个问题必须要回到计算机是如何表示我们人类能够理解的符号的,这些符号也就是我们人类使用的语言 ...

  6. 自然语言处理的CNN模型中几种常见的池化方法

    自然语言处理的CNN模型中几种常见的池化方法 本文是在[1]的基础上进行的二次归纳. 0x00 池化(pooling)的作用   首先,回顾一下NLP中基本的CNN模型的卷积和池化的大致原理[2].f ...

  7. JS数组去重的几种常见方法

    JS数组去重的几种常见方法 一.简单的去重方法 // 最简单数组去重法 /* * 新建一新数组,遍历传入数组,值不在新数组就push进该新数组中 * IE8以下不支持数组的indexOf方法 * */ ...

  8. Fibonacci series(斐波纳契数列)的几种常见实现方式

    费波那契数列的定义: 费波那契数列(意大利语:Successione di Fibonacci),又译费波拿契数.斐波那契数列.斐波那契数列.黄金切割数列. 在数学上,费波那契数列是以递归的方法来定义 ...

  9. java之 ------ 几种常见的简单设计模式

    前言: 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.用于解决特定环境下.反复出现的特定问题的解决方式.使用设计模式是为了可重用代码.让代 ...

随机推荐

  1. 运维开发笔记整理-QueryDict对象

    运维开发笔记整理-QueryDict对象 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 客户端发送数据请求有很多种,相信运维人员已经很清楚了,如果不太清楚的话可以参考我之前的学习笔 ...

  2. Manthan, Codefest 19 (open for everyone, rated, Div. 1 + Div. 2)-E. Let Them Slide-思维+数据结构

    Manthan, Codefest 19 (open for everyone, rated, Div. 1 + Div. 2)-E. Let Them Slide-思维+数据结构 [Problem ...

  3. de4dot FAQ

    How to deobfuscate but make sure metadata tokens stay the same? --preserve-tokens will preserve all ...

  4. mailto标签来调用邮箱客户端

    最近项目需要使用mailto标签来调用客户端,并且把邮件模板填到客户端. mailto 的用法: a标签直接调用: <a href="mailto:example@qq.com?cc= ...

  5. 新闻系统——VS制作自己的模板

    我们在做机房管理的项目时,就用过模板方法,建立一个模板,这样就会省很多事,我们不需要每次都添加同样的东西,比如我们的类窗体,就可以制作一个模板,将注释和需要引用的控件直接添加上,这可以省去很大的麻烦, ...

  6. Web前端 --- 前端基础简介

    目录 web端 HTTP协议 web端 1.前端,后端 什么是前端 任何与用户直接打交道的操作界面,都可以称之为前端, eg:电脑界面 手机界面 什么是后端 真正的幕后操作者 2.前端学习的历程 HT ...

  7. tsql 通过row_number() over() 产生行号

    先按userIP分组,再按时间排序,最后编号. select row_number() over (partition by UserIp order by insertTime),* from us ...

  8. Color Highlight 鼠标放在 #f3f 上面其背景会变成相应的颜色的插件 DocBlockr自动补全注释

    不是  Color Highlighter    而是 Color Highlight  少了 er  颜色功能还是很爽的,找了好久 鼠标放在 #f3f 上面其背景会变成相应的颜色的插件 DocBlo ...

  9. [USACO]骑马修栅栏 Riding the Fences

    题目链接 题目简述:欧拉回路,字典序最小.没什么好说的. 解题思路:插入边的时候,使用multiset来保证遍历出出答案的字典序最小. 算法模板:for(枚举边) 删边(无向图删两次) 遍历到那个点 ...

  10. spark sql启动优化

    ./spark-sql --conf spark.driver.maxResultSize=8g --driver-memory 20g --conf  spark.kryoserializer.bu ...