几种常见空间滤波器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)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.用于解决特定环境下.反复出现的特定问题的解决方式.使用设计模式是为了可重用代码.让代 ...
随机推荐
- [#Linux] CentOS 7 安装微信详细过程
微信安装 微信安装过程如下: 1,下载最新版本tar.gz压缩包 wget https://github.com/geeeeeeeeek/electronic-wechat/releases/down ...
- python编码和解码
一.什么是编码 编码是指信息从一种形式或格式转换为另一种形式或格式的过程. 在计算机中,编码,简而言之,就是将人能够读懂的信息(通常称为明文)转换为计算机能够读懂的信息.众所周知,计算机能够读懂的是高 ...
- 【pytorch报错解决】expected input to have 3 channels, but got 1 channels instead
遇到的问题 数据是png图像的时候,如果用PIL读取图像,获得的是单通道的,不是多通道的.虽然使用opencv读取图片可以获得三通道图像数据,如下: def __getitem__(self, idx ...
- Java线程(1)
多线程快速入门 线程与进程区别 每个正在系统上运行的程序都是一个进程.每个进程包含一到多个线程.线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行.也可以把它理解为代码运行的上下文.所以 ...
- Spring Cloud 之 服务网关
在微服务架构体系中,使用API 服务网关后的系统架构图如下: API服务网关的主要作用如下: 服务访问的统一入口 服务访问的负载均衡功能 服务访问的路由功能 在SpringCloud中,基于Netfl ...
- 聊聊Hash索引
hash index是基于哈希表实现的,只有精确匹配索引所有列的查询才会生效.对于每一行数据,存储引擎都会对所有的索引列计算一个hash code,并将的有的hash code存储在索引中,同时在哈希 ...
- python中的_xx, __xx, __xx__
一.从模块分析 ######## bb.py (一个用来导入的模块) ########## var = 0_var = 1__var = 2__var__ = 3 1. from module im ...
- 2018 南京网络预赛Sum - 离线分段打表
题意 设 $f(n)$ 为 $n=ab$ 的方案数,其中 $a,b$ 为无平方因子数. 例如,$f(6)=4$,因为 $6 = 1 \times 6 = 2 \times 3 = 3 \times 2 ...
- oracle数据库中 impdb/expdb 详解
创建逻辑目录,该命令不会在操作系统创建真正的目录,最好以system等管理员创建.create directory dpdata as 'd:\test\dump'; 二.查看管理理员目录(同时查看操 ...
- 使用JSP/Servlet技术开发新闻发布系统---JSP数据交互(二)
JSP内置对象application application对象 JSP常用的内置对象 对象的作用域 作用的分类 对象的作用域 page作用域 实例 //页面1 <% String name = ...