news 2026/11/4 1:00:47

[数字图像处理]图像去噪初步(2)--非线性滤波器

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
[数字图像处理]图像去噪初步(2)--非线性滤波器

本文已整理到我的个人博客,之后的勘误与更新只在博客进行:Image Denoise : 非线性滤波器 | Finn's blog

1.非线性处理与线性处理的区别

上一篇博文的内容,是关于均值滤波器的。比如说像算术均值滤波器,几何均值滤波器。这以类型的滤波器的常常被用于剔除某些不需要的频率成分,或者选择需要的频率成分,从而达到去噪的目的。这样的滤波器,被称为线性滤波器。

然而,还有一些特殊滤波器,他们被称为非线性滤波器。其代表为中央值滤波器。所谓中央值滤波器,就是将一定范围内的数据(对于图像而言,是像素的灰度值)进行排序,选择中央值作为滤波器的输出。

中央值滤波器的目的并不是频率成分的选择,而是求root信号。关于root信号的定义,[文献1]中是这样给出的。

------------------------

定义:对于任意信号,使用中央值滤波器进行有限次处理,直到所得到的限号不变为止。中央值滤波器处理前后,如果这个信号列没有任何变化,那么将这个信号列称为这个滤波器的root信号。

------------------------

对于中央值滤波器来讲,可以完美去除被椒盐噪声污染的root信号。对于root信号,有如下的性质。对于以下定理的证明与详细说明,请参考[文献2][文献3]。

=============

定理1:如果信号列{x(i)}是单调递增或单调递减的,那么对于任何尺寸的中央值滤波器,这个信号列都是root信号。

定理2:如果信号列{x(i)}是在从i开始的m个信号之间的局部单调信号的话,那么对于尺寸为N=2M+1(M<=m-2)的中央值滤波器,这样的信号为这个滤波器的root信号。

=============

2.几个典型的非线性滤波器

2.1 中央值滤波器 (Median Filter)

正如第一节所叙述的,中央值滤波器可以有效去除椒盐噪声,并且不会使得图像模糊。我们将一副图像染上椒盐噪声,然后使用不同尺寸的中央值滤波器去进行处理。所得的结果的画质使用SSIM去评价。

首先,将图像染上盐粒密度为0.15,胡椒密度为0.15的椒盐噪声,使用3x3,5x5,7x7和9x9四种不同尺寸的中值滤波器去处理图像。所得到的结果,如下表所示。

由上图所示,可以看出,所用滤波器尺寸不同,得到的结果是不同的,尺寸较大的滤波器得到了不太好的结果。随着循环次数的增加,图像的SSIM逐渐变化,最后趋近于稳定。下面是循环次数为30时候,4种尺寸滤波器得到的结果。

为了验证噪声与实验结果的影响,将图像染上盐粒密度为0.35,胡椒密度为0.35的椒盐噪声,在进行滤波实验,可以得到如下曲线。

实验结果给出,尺寸较小的的中值滤波器,其收敛到root信号较为缓慢,其次,对于高噪声的图像,其修复结果是不太好的。

总结上述实验,可以得到三个有用的结论。

1.中央值滤波器在处理过程中,不断在寻找root信号。反复数回之后,其结果收敛,基本不改变。

2.对于不同的图像,不同的噪声,最适合本幅图像的中央值滤波器的尺寸是不同的。并不是尺寸越小越好。

3.尺寸小的滤波器,收敛速度慢。反之,尺寸大的滤波器,收敛较快。

2.2 自适应中央值滤波器

我们要很好的使用中央值滤波器,只有一个要点!就是找一个最适合的滤波器尺寸,使得原图就是这个滤波器的root信号,那么,就可以得到一个完美的结果(当然,最适合的滤波器是不存在的)。那么,这里就可以有个想法了,在执行滤波器操作的时候,尽可能多的尝试各种尺寸,选择一个最适合的,让原图很接近这个尺寸的滤波器的root信号。这样的话,就可以得到一个不错的结果了。

当然,之对于椒盐噪声的话,还可以加入这样一个功能,由于噪声的灰度值是已知的(盐粒噪声为1,胡椒噪声0),那么只有当中央值不是0或者1的时候,滤波器生效,否则,扩大滤波器尺寸。

归纳上述思想,可以得到如下的伪代码。

START: S_xy = read(f(x,y),[size_S_xy]); z_min = min(S_xy); z_max = max(S_xy); z_med = median(S_xy); LOOP A : A_1 = z_med - z_min; A_2 = z_med - z_max; if ((A_1 >0) and (A_2 < 0)) goto LOOP B; else size_S_xy++; goto START; if (size_S_xy <= size_max) g(x,y) = z_med; goto NEXT; LOOP B : B_1 = f(x,y) - z_min; B_2 = f(x,y) - z_max; if ((B_1 >0) and (B_2 < 0)) g(x,y) = f(x,y) ; goto NEXT; else g(x,y) = z_med; goto NEXT; NEXT : x,y移动到下一个像素点 if (x > x_max)and(y>y_max) return; else goto START;

来看看这个滤波器的效果,将图像加一个很强的噪声椒盐噪声。盐粒密度为0.3,胡椒密度为0.3。同时将同样的图像,使用5x5的中央值滤波器。两个滤波器的不同,还是很容易看出来的。

2.3 最大值滤波器与最小值滤波器

最大值滤波器与最小值滤波器这两个滤波器,跟中央值滤波器有些类似。同样是一个目的,用于寻找root信号,只不过,最大值滤波器可以用于去除盐粒噪声,相反,最小值滤波器可以用于取出胡椒噪声。同样的,最大值与最小值滤波器不适用于去除,同时含有盐粒噪声与胡椒噪声的图片。

由于这个很简单,结果就不贴了。

2.4 中点滤波器(midpoint filter)

中点滤波器,糅合了均值滤波器和非线性的排序处理。这样的滤波器对于去除高斯噪声与均匀噪声有很好的效果。

我们使用这个滤波器,与平均滤波器做个比较吧。其结果显示在下图。

图片上,纵轴表示画质SSIM,横轴表示噪声的方差。绿线表示中点滤波器,红线表示算术滤波器。可以看出,均匀噪声上,中点滤波器的性能还是优于算术平均滤波器的。(当然,这可能跟选用的评价图像有关,但是基本是这个趋势)。

2.4 修正的阿尔法均值滤波器

从很小的时候开始,对唱歌节目就有这样的一个映像,评委打分的时候,总是要去掉一个最高分,去掉一个最低分,然后求均值。这个是个什么样的原理呢?其实这是一个很典型的滤波器,可以更好的反应一个选手的水平。
在图像处理领域,也有一个类似的处理方法,其表达式如下。
简单的理解一下这个滤波器,首先,我们将滤波范围的个数据进行排序,从大到下的顺序去除个数据,从小到大的顺序去除个数据。将剩下的数据计算均值。

这样的滤波器,很擅长去除椒盐噪声与其他类型噪声一起污染过的图片。依然是实验,首先将图片染上盐粒密度为0.1,胡椒密度为0.1的椒盐噪声。然后,再将这幅图像染上高斯噪声。在将图片进行去噪。得到的结果如下所示。

可以出,对于复数的噪声,这样的滤波器的效果是最好的。

3.自适应中值滤波器的Matlab代码

由于本次代码都比较简单,主要是概念上的理解,所以,代码我也就贴个自适应滤波器的代码就完事吧!

%% ------------Adaptive median filter-------------------- close all; clear all; clc; f = imread('./ckt-board-orig.tif'); f = mat2gray(f,[0 255]); [M,N] = size(f); % ----------------noise---------- b = 0.3; %salt a = 0.3; %pepper x = rand(M,N); g_sp = f; g_sp(find(x<=a)) = 0; g_sp(find(x > a & x<(a+b))) = 1; figure(); subplot(1,2,1); imshow(g_sp,[0 1]); xlabel('a).Image corrupted by S&P noise'); subplot(1,2,2); x = linspace(-0.2,1.2,358); h = hist(g_sp,x)/(M*N); Histogram = zeros(358,1); for y = 1:256 Histogram = Histogram + h(:,y); end bar(-0.2:1/255:1.2,Histogram); axis([-0.2 1.2 0 0.04]),grid; xlabel('b).The Histogram of a'); ylabel('Number of pixels'); [SSIM_g mssim] = ssim_index(f,g_sp,[0.01 0.03],ones(8),1); %% Adaptive median filter S_xy = zeros(3,3); z_min = 1; z_max = 0; z_med = 0; S_max = 7; w = zeros(S_max,S_max); w(round(S_max/2),round(S_max/2)) = 1; g_Ex = imfilter(g_sp,w,'symmetric','full'); g_Admf = zeros(M,N); S = 3; for x = 4:M+3 for y = 4:N+3 % A for S = 3:2:S_max S_xy = zeros(S,S); for s = 1:1:S for t = 1:1:S S_xy(s,t) = g_Ex(x+s-round(S/2),y+t-round(S/2)); end end z_min = min(S_xy(:)); z_max = max(S_xy(:)); z_med = median(S_xy(:)); A_1 = z_med - z_min; A_2 = z_med - z_max; if ((A_1>0)&&(A_2<0)) % B B_1 = g_Ex(x,y) - z_min; B_2 = g_Ex(x,y) - z_max; if((B_1>0)&&(B_2<0)) g_Admf(x-3,y-3) = z_med;break; else g_Admf(x-3,y-3) = z_med; break; end end if(S >= S_max) g_Admf(x-3,y-3) = z_med; break; end end end end figure(); subplot(1,2,1); imshow(g_Admf,[0 1]); xlabel('c).Ruselt of denoise by Adaptive median filter'); subplot(1,2,2); x = linspace(-0.2,1.2,358); h = hist(g_Admf,x)/(M*N); Histogram = zeros(358,1); for y = 1:256 Histogram = Histogram + h(:,y); end bar(-0.2:1/255:1.2,Histogram); axis([-0.2 1.2 0 0.04]),grid; xlabel('d).The Histogram of a'); ylabel('Number of pixels'); [SSIM_g_Admf mssim] = ssim_index(f,g_Admf,[0.01 0.03],ones(8),1);

下一篇博文,会说到去卷积处理。

参考文献

[文献1]非線形ディジタル信号処理 ,棟安実治 ・田口亮 著,システム制御情報学会,朝倉書店,1999年03月20日
[文献2]Tyan, S. G. "Median filtering: Deterministic properties."Two-Dimensional Digital Signal Prcessing II. Springer Berlin Heidelberg, 1981. 197-217.
[文献3]Gallagher Jr N C, Wise G L. A theoretical analysis of the properties of median filters[J]. Acoustics, Speech and Signal Processing, IEEE Transactions on, 1981, 29(6): 1136-1141.

原文发于博客:zhoufan900428-CSDN博客

=============更新日志===================

2014 - 7 - 17 修正了一些格式错误

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/11/3 23:59:41

从生成Token到直接决策:Jev如何重塑AI Agent工程实践

1. 从"生成文字"到"拍板决策"&#xff1a;Jev 到底在解决什么问题大多数人第一次接触大模型&#xff0c;脑子里建立的模型是"输入问题、输出文字"。你问它今天天气怎么样&#xff0c;它给你一段描述&#xff1b;你让它写个周报&#xff0c;它给你…

作者头像 李华
网站建设 2026/11/3 23:58:13

微信小程序+Java构建疫苗预约系统的高并发实践

1. 项目背景与核心价值新冠疫苗接种作为全球公共卫生事件中的重要环节&#xff0c;其预约管理系统的便捷性直接影响接种效率。传统线下预约方式存在排队时间长、信息不对称等问题&#xff0c;而基于微信小程序的解决方案具有天然优势&#xff1a;微信月活用户超12亿&#xff0c…

作者头像 李华
网站建设 2026/11/3 23:55:49

贝叶斯分类器原理与实践:从基础到应用

1. 贝叶斯分类器&#xff1a;一个被名字耽误的实用工具第一次听到"贝叶斯分类器"这个术语时&#xff0c;我也被它吓到了——听起来像是某种高深莫测的数学魔法。但当我真正开始使用它处理实际问题时&#xff0c;才发现这可能是机器学习领域最容易被低估的"平民英…

作者头像 李华
网站建设 2026/11/3 23:54:45

量子计算界面测试:从理论到实践的范式转变

1. 量子界面测试&#xff1a;一场测试范式的革命作为一名在传统软件测试领域摸爬滚打十年的老兵&#xff0c;当我第一次接触量子计算界面测试时&#xff0c;那种震撼感至今难忘。记得去年在IBM Quantum Experience平台上尝试运行一个简单的量子电路&#xff0c;看着那些概率性的…

作者头像 李华
网站建设 2026/11/3 23:53:13

MongoDB复制集主从切换实践与优化

1. MongoDB复制集主从切换的必要性在MongoDB的生产环境部署中&#xff0c;复制集&#xff08;Replica Set&#xff09;架构是确保高可用性的核心方案。复制集通过自动故障转移机制保障服务连续性&#xff0c;但实际运维中我们经常遇到需要主动进行主从切换的场景。这就像飞机起…

作者头像 李华
网站建设 2026/11/3 23:52:01

AI不做裁判:构建不排序、不打分的讨论系统

“AI 不做裁判”这个项目名字&#xff0c;其实是一句产品宣言&#xff1a;我们要做一个讨论系统&#xff0c;但它不排序、不打分、不判谁赢。所有参与者把观点放上来&#xff0c;AI 只负责当主持人、做整理、写纪要&#xff0c;唯独不碰“评价”这层权力。如果你开过线上复盘会…

作者头像 李华