本文链接: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. Apache常见interview

    Apache在Linux系统下的工作模式及特点?如何使Apache使用worker模式? prefork 是一种非线程.与派生的工作模式,用的是进程去处理请求,所以比较容易消耗内存,但是稳定性好,某个 ...

  2. Android笔记(二十八) Android中图片之简单图片使用

    用户界面很大程度上决定了APP是否被用户接收,为了提供友好的界面,就需要在应用中使用图片了,Android提供了丰富的图片处理功能. 简单使用图片 使用Drawable对象 为Android应用增加了 ...

  3. Python标准库3.4.3-random

    9.6. random — Generate pseudo-random numbers Source code: Lib/random.py  翻译:Z.F. This module impleme ...

  4. java - day012 - 异常 , throws, throw , IO ,RandomAccessFile

    异常 封装错误信息的对象 错误信息 类型        例如: NullPointerExce 空指针 提示消息  出错的行号 异常的继承结构 Throwable | - Error 系统级错误 | ...

  5. [ansible-playbook]离线安装ansible 2.3

    痛点: 测试环境无法连上外网升级ansible 预计阅读时间:5分钟 参考文档 http://docs.ansible.com/ansible/latest/intro_installation.ht ...

  6. 商汤开源的mmdetection技术报告

    目录 1. 简介 2. 支持的算法 3. 框架与架构 6. 相关链接 前言:让我惊艳的几个库: ultralytics的yolov3,在一众yolov3的pytorch版本实现算法中脱颖而出,收到开发 ...

  7. (转)大厂常问到的14个Java面试题

    1. synchronized和reentrantlock异同 相同点 都实现了多线程同步和内存可见性语义 都是可重入锁 不同点 实现机制不同 synchronized通过java对象头锁标记和Mon ...

  8. Java程序员完美设置,Mac编程指南

        重装了不知道多少次Windows,Linux发行版换来换去总是觉得不满意,终于下定决心在年头买了人生中第一台Mac. 为什么是Mac 现在的移动端.服务器端跑的大多数都是Unix系统,熟悉Un ...

  9. C#中流Stream的使用-学习

    概念 提供字节序列的一般视图.这是一个抽象类. 子类: Derived Microsoft.JScript.COMCharStream System.Data.OracleClient.OracleB ...

  10. javascript数据判断是否有指定元素

    jquery方法: $.inArray(dataKey, dataArray) == -1 javascript方法: indexOf() 功能:根据指定的数据,从左向右,查询在数组中出现的位置,如果 ...