几种常见空间滤波器MATLAB实现
本文链接: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实现的更多相关文章
- 数字图像处理- 3.4 空间滤波 and 3.5 平滑空间滤波器
3.4 空间滤波基础 • Images are often corrupted by random variations in intensity, illumination, or have poo ...
- JavaScript 中 4 种常见的内存泄露陷阱
了解 JavaScript 的内存泄露和解决方式! 在这篇文章中我们将要探索客户端 JavaScript 代码中常见的一些内存泄漏的情况,并且学习如何使用 Chrome 的开发工具来发现他们.读一读吧 ...
- ADB几种常见的错误及解决方法
下面列举出几种常见的错误及解决方法. Q1:无效的安装包,安装包已损坏[INSTALL_FAILED_INVALID_APK] A1:请检查安装包是否完整.如果是xpk包,可以通过 手动安装xpk来检 ...
- JAVA几种常见的编码格式(转)
简介 编码问题一直困扰着开发人员,尤其在 Java 中更加明显,因为 Java 是跨平台语言,不同平台之间编码之间的切换较多.本文将向你详细介绍 Java 中编码问题出现的根本原因,你将了解到:Jav ...
- Java几种常见的编码方式
几种常见的编码格式 为什么要编码 不知道大家有没有想过一个问题,那就是为什么要编码?我们能不能不编码?要回答这个问题必须要回到计算机是如何表示我们人类能够理解的符号的,这些符号也就是我们人类使用的语言 ...
- 自然语言处理的CNN模型中几种常见的池化方法
自然语言处理的CNN模型中几种常见的池化方法 本文是在[1]的基础上进行的二次归纳. 0x00 池化(pooling)的作用 首先,回顾一下NLP中基本的CNN模型的卷积和池化的大致原理[2].f ...
- JS数组去重的几种常见方法
JS数组去重的几种常见方法 一.简单的去重方法 // 最简单数组去重法 /* * 新建一新数组,遍历传入数组,值不在新数组就push进该新数组中 * IE8以下不支持数组的indexOf方法 * */ ...
- Fibonacci series(斐波纳契数列)的几种常见实现方式
费波那契数列的定义: 费波那契数列(意大利语:Successione di Fibonacci),又译费波拿契数.斐波那契数列.斐波那契数列.黄金切割数列. 在数学上,费波那契数列是以递归的方法来定义 ...
- java之 ------ 几种常见的简单设计模式
前言: 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.用于解决特定环境下.反复出现的特定问题的解决方式.使用设计模式是为了可重用代码.让代 ...
随机推荐
- SSM - SpringBoot - SpringCloud
SSM框架 Spring + Spring MVC + MyBatis:标准MVC模式 继 SSH (Struts+Spring+Hibernate)之后,主流的 Java EE企业级 Web应用程序 ...
- javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certificatio
场景:Java调用PHP接口,代码部署在服务器上后,调用报错,显示PHP服务器那边证书我这边服务器不信任(我猜的). 异常信息: 2019-08-06 14:00:09,102 [http-nio-4 ...
- rabbitmq二进制安装
一.erland的安装 1.首先测试一下是否已经安装了erlang,命令 rpm -qa | grep erlang 2.没有安装则用yum安装 yum install erlang -y 二.下载r ...
- JAVA HASH学习
就HASH的目的来说,是为了解决内容摘要与快速索引的问题:而其算法也比较多样. JDK实现中,对String类的hashcode()进行了重载: public int hashCode() { int ...
- JDK源码那些事儿之ArrayBlockingQueue
线程在JDK中是非常重要的一块内容,所有的应用服务都离不开线程的相关操作,对于大量线程的使用都是推荐使用线程池来进行操作和管理,JDK本身提供的线程池在服务中经常被使用到,以往经常使用Executor ...
- nginx url默认去掉index.php
- java对象转换
对象转换: 对象的分层涉及到各个层级之间的对象转换(Entity2DTO , DTO2VO, VO2DTO,DTO2Entity等),传统的采用set/get 方法硬编码实现写的代码比较多:或者采用B ...
- Vue.js最佳实践(五招助你成为vuejs大师)
转自https://www.jb51.net/article/139448.htm 本文面向对象是有一定Vue.js编程经验的开发者.如果有人需要Vue.js入门系列的文章可以在评论区告诉我,有空就给 ...
- 学到了林海峰,武沛齐讲的Day17完-6 文件操作
参考 https://www.cnblogs.com/linhaifeng/articles/5984922.html f=open('陈粒1',encoding='utf-8') ope ...
- 学到了林海峰,武沛齐讲的Day17-5 内置函数
zip print(list(zip(('a','n','c','d'),(1,2,3)))) =====[('a', 1), ('n', 2), ('c', 3)] 一一对应====元组变列表 ...