自适应中值滤波器(基于OpenCV实现)

article/2025/8/27 15:42:55

转自:http://blog.csdn.net/brookicv/article/details/54931857

 

本文主要介绍了自适应的中值滤波器,并基于OpenCV实现了该滤波器,并且将自适应的中值滤波器和常规的中值滤波器对不同概率的椒盐噪声的过滤效果进行了对比。最后,对中值滤波器的优缺点了进行了总结。

空间滤波器

一个空间滤波器包括两个部分:

  • 一个邻域,滤波器进行操作的像素集合,通常是一个矩形区域
  • 对邻域中像素进行的操作

一个滤波器就是在选定的邻域像素上执行预先定义好的操作产生新的像素,并用新的像素替换掉原来像素形成新的图像。 
通常,也可以将滤波器称之为核(kernel),模板(template)或者窗口(window)

根据预定义的操作,可以将滤波器分为:

  • 线性滤波器
  • 非线性滤波器

而根据滤波器最终对图像造成的影响,可以将滤波器分为:

  • 平滑滤波器 ,通常用于模糊图像或者去除图像中的噪声
  • 锐化滤波器,突出图像中的边缘细节部分

中值滤波器 Median Filter

中值滤波器是一种常用的非线性滤波器,其基本原理是选择待处理像素的一个邻域中各像素值的中值来代替待处理的像素,其主要功能是像素的灰度值与周围像素比较接近,从而消除孤立的噪声点,所以中值滤波器能够很好的消除椒盐噪声。不仅如此,中值滤波器在消除噪声的同时,还能有效的保护图像的边界信息,不会对图像造成很大的模糊(相比于均值滤波器)。

中值滤波器的效果受滤波窗口尺寸的影响较大,在消除噪声和保护图像的细节存在着矛盾:滤波窗口较小,则能很好的保护图像中的某些细节,但对噪声的过滤效果就不是很好;反之,窗口尺寸较大有较好的噪声过滤效果,但是会对图像造成一定的模糊。另外,根据中值滤波器原理,如果在滤波窗口内的噪声点的个数大于整个窗口内像素的个数,则中值滤波就不能很好的过滤掉噪声。

自适应中值滤波器 Adaptive Median Filter

上面提到常规的中值滤波器,在噪声的密度不是很大的情况下(根据经验,噪声的出现的概率小于0.2),效果不错。但是当概率出现的概率较高时,常规的中值滤波的效果就不是很好了。有一个选择就是增大滤波器的窗口大小,这虽然在一定程度上能解决上述的问题,但是会给图像造成较大的模糊。

常规的中值滤波器的窗口尺寸是固定大小不变的,就不能同时兼顾去噪和保护图像的细节。这时就要寻求一种改变,根据预先设定好的条件,在滤波的过程中,动态的改变滤波器的窗口尺寸大小,这就是自适应中值滤波器 Adaptive Median Filter。在滤波的过程中,自适应中值滤波器会根据预先设定好的条件,改变滤波窗口的尺寸大小,同时还会根据一定的条件判断当前像素是不是噪声,如果是则用邻域中值替换掉当前像素;不是,则不作改变。

自适应中值滤波器有三个目的:

  • 滤除椒盐噪声
  • 平滑其他非脉冲噪声
  • 尽可能的保护图像中细节信息,避免图像边缘的细化或者粗化。

自适应中值滤波算法描述

自适应滤波器不但能够滤除概率较大的椒盐噪声,而且能够更好的保护图像的细节,这是常规的中值滤波器做不到的。自适应的中值滤波器也需要一个矩形的窗口SxySxy,和常规中值滤波器不同的是这个窗口的大小会在滤波处理的过程中进行改变(增大)。需要注意的是,滤波器的输出是一个像素值,该值用来替换点(x,y)(x,y)处的像素值,点(x,y)(x,y)是滤波窗口的中心位置。

在描述自适应中值滤波器时需要用到如下的符号:

  • Zmin=SxyZmin=Sxy中的最小灰度值
  • Zmax=SxyZmax=Sxy中的最大灰度值
  • Zmed=SxyZmed=Sxy中的灰度值的中值
  • ZxyZxy表示坐标(x,y)(x,y)处的灰度值
  • Smax=SxySmax=Sxy允许的最大窗口尺寸

自适应中值滤波器有两个处理过程,分别记为:A和B。 
A : 
A1 = Zmed−ZminZmed−Zmin 
A2 = Zmed−ZmaxZmed−Zmax 
如果A1 > 0 且 A2 < 0,跳转到 B; 
否则,增大窗口的尺寸 
如果增大后窗口的尺寸 ≤Smax≤Smax,则重复A过程。 
否则,输出ZmedZmed

B
B1 = Zxy−ZminZxy−Zmin 
B2 = Zxy−ZmaxZxy−Zmax 
如果B1 > 0 且 B2 < 0,则输出ZxyZxy 
否则输出ZmedZmed

自适应中值滤波原理说明

过程A的目的是确定当前窗口内得到中值ZmedZmed是否是噪声。如果Zmin<Zmed<ZmaxZmin<Zmed<Zmax,则中值ZmedZmed不是噪声,这时转到过程B测试,当前窗口的中心位置的像素ZxyZxy是否是一个噪声点。如果Zmin<Zxy<ZmaxZmin<Zxy<Zmax,则ZxyZxy不是一个噪声,此时滤波器输出ZxyZxy;如果不满足上述条件,则可判定ZxyZxy是噪声,这是输出中值ZmedZmed(在A中已经判断出ZmedZmed不是噪声)。

如果在过程A中,得到则ZmedZmed不符合条件Zmin<Zmed<ZmaxZmin<Zmed<Zmax,则可判断得到的中值ZmedZmed是一个噪声。在这种情况下,需要增大滤波器的窗口尺寸,在一个更大的范围内寻找一个非噪声点的中值,直到找到一个非噪声的中值,跳转到B;或者,窗口的尺寸达到了最大值,这时返回找到的中值,退出。

从上面分析可知,噪声出现的概率较低,自适应中值滤波器可以较快的得出结果,不需要去增加窗口的尺寸;反之,噪声的出现的概率较高,则需要增大滤波器的窗口尺寸,这也符合种中值滤波器的特点:噪声点比较多时,需要更大的滤波器窗口尺寸。

实现

有了算法的详细描述,借助于OpenCV对图像的读写,自适应中值滤波器实现起来也不是很困难。

    int minSize = 3; // 滤波器窗口的起始尺寸int maxSize = 7; // 滤波器窗口的最大尺寸Mat im1;// 扩展图像的边界copyMakeBorder(im, im1, maxSize / 2, maxSize / 2, maxSize / 2, maxSize / 2, BorderTypes::BORDER_REFLECT);// 图像循环for (int j = maxSize / 2; j < im1.rows - maxSize / 2; j++){for (int i = maxSize / 2; i < im1.cols * im1.channels() - maxSize / 2; i++){im1.at<uchar>(j, i) = adaptiveProcess(im1, j, i, minSize, maxSize);}}

首先定义滤波器最小的窗口尺寸以及最大的窗口尺寸。 
要进行滤波处理,首先要扩展图像的边界,以便对图像的边界像素进行处理。copyMakeBorder根据选择的BorderTypes使用不同的值扩充图像的边界像素,具体可参考OpenCV的文档信息。 
下面就是遍历图像的像素,对每个像素进行滤波处理。需要注意一点,不论滤波器多么的复杂,其每次的滤波过程,都是值返回一个值,来替换掉当前窗口的中心的像素值。函数adpativeProcess就是对当前像素的滤波过程,其代码如下:

uchar adaptiveProcess(const Mat &im, int row,int col,int kernelSize,int maxSize)
{vector<uchar> pixels;for (int a = -kernelSize / 2; a <= kernelSize / 2; a++)for (int b = -kernelSize / 2; b <= kernelSize / 2; b++){pixels.push_back(im.at<uchar>(row + a, col + b));}sort(pixels.begin(), pixels.end());auto min = pixels[0];auto max = pixels[kernelSize * kernelSize - 1];auto med = pixels[kernelSize * kernelSize / 2];auto zxy = im.at<uchar>(row, col);if (med > min && med < max){// to Bif (zxy > min && zxy < max)return zxy;elsereturn med;}else{kernelSize += 2;if (kernelSize <= maxSize)return adpativeProcess(im, row, col, kernelSize, maxSize); // 增大窗口尺寸,继续A过程。elsereturn med;}
}

首先,根据当前窗口的大小,取得所有像素值存放到vector中,然后对vector进行排序,取得像素的最小值、最大值和中值。然后测试当前取得的中值是否在(min,max)之间,如果是,则中值不是噪声点,则开始对当前像素值进行处理,判断其是否是噪声点。如果,测试当前已取得的中值是噪声点,则扩大窗口的尺寸,在更大的空间中重新寻找中值。

上面自适应中值滤波器实现起来比较简单,所以问题就来了:效率及其的低下。这里,这是对自适应中值滤波器的原理的学习,可以忽略这个不必要的细节。

结果对比

这里写图片描述
左边是添加概率为0.2的椒盐噪声,右边是原图。下面是使用常规的中值滤波和本文实现的自适应中值滤波器后的处理结果

这里写图片描述

左边是自适应中值滤波器(最小窗口为3,最大窗口为7)的结果,右图是常规中值滤波器(窗口大小为5)的结果。可以看出,无论是中值滤波还是自适应的中值滤波,都能过滤掉图像中的噪声,自适应中值滤波器的效果要好些,常规的还有一些噪声没有过滤掉。而且,常规的中值滤波器对图像造成的模糊较明显,而自适应中值滤波器很好的的保存了图像中的细节。

下面测试更大概率噪声下,两种滤波器的工作情况。噪声概率为0.4时, 
这里写图片描述
可以看出,常规的中值滤波器已经不能很好的过滤掉噪声,而自适应的中值滤波还可以胜任。

中值滤波器总结

  • 中值滤波器能够很好的滤除“椒盐”噪声。椒盐噪声是在图像上随机出现的孤立点,根据中值滤波器的原理,使用邻域像素的中值代替原像素,能够有效的消除这些孤立的噪声点。
  • 和均值滤波器相比,中值滤波在消除噪声的同时,还能在很大程度保护图像的细节,不会造成很大的模糊。
  • 和常规的中值滤波器相比,自适应中值滤波器能够更好的保护图像中的边缘细节部分。

 


http://chatgpt.dhexx.cn/article/67mVHuO7.shtml

相关文章

NAFSM中值滤波器讲解与实现

去年大三时课上&#xff0c;医学图像处理老师讲解了这个算法&#xff0c;当时布置的作业就是实现这个中值滤波器&#xff0c;今天突然从一篇论文中看到过类似这种思想&#xff0c;就又想起来了&#xff0c;发现网上对这个算法的讲解很少&#xff0c;那我就在这分享一下咯&#…

中值滤波器处理椒盐噪声

clc; close all; clear all; %读取原始图像 im imread(‘Fig0318(b)(ckt-board-slt-pep-both-0pt2).tif’); im_noise_salt imnoise(im,‘salt & pepper’,0.05); % 加入椒盐噪声 % im_noise_gaussian imnoise(im,‘gaussian’); %定义邻域尺寸 n1 2; m1 2n11; n2 2;…

使用中值滤波器对图像降噪

中值滤波器&#xff1a; 基于排序统计理论的一种能有效抑制噪声的非线性平滑滤波信号处理技术。中值滤波的特点即是首先确定一个以某个像素为中心点的邻域&#xff0c;一般为方形邻域&#xff0c;也可以为圆形、十字形等等&#xff0c;然后将邻域中各像素的灰度值排序&#xff…

【OpenCV 例程 300 篇】101. 自适应中值滤波器

专栏地址&#xff1a;『youcans 的 OpenCV 例程 300篇 - 总目录』 【第 7 章&#xff1a;图像复原与重建】 100. 自适应局部降噪滤波器 101. 自适应中值滤波器 102. 陷波带阻滤波器的传递函数 【youcans 的 OpenCV 例程 300 篇】101. 自适应中值滤波器 3.8 自适应中值滤波器&am…

python实现自适应中值滤波器

目录 原理&#xff08;冈萨雷斯第四版p235&#xff09;&#xff1a; 代码&#xff1a; 结果&#xff1a; 原理&#xff08;冈萨雷斯第四版p235&#xff09;&#xff1a; 代码&#xff1a; import cv2 import numpy as np from matplotlib import pyplot as plt# for gray im…

自编自适应中值滤波器

自适应中值滤波器 算法思想&#xff1a;自适应中值滤波器是根据输入的图片像素矩阵和滤波器窗口的最大和最小值&#xff0c;首先&#xff0c;根据滤波器窗口的最大值申请两个可以处理了边界情况的滤波器&#xff0c;大小为原图加上最大滤波器的尺寸减一&#xff0c;按照边缘处…

图像中值滤波器python实现

中值滤波器原理 图像处理中最著名的统计排序滤波器是中值滤波器&#xff0c;即用一个预定义的像素领域中的灰度中值来代替像素的值&#xff1a; 其中是以&#xff08;x,y&#xff09;为中心的领域&#xff0c;包含中心点自己&#xff0c;在领域中找到中值&#xff0c;并用中值…

中值滤波器 median filter

中值滤波 中值滤波器(median filter)是将每个像素替换为围绕这个像素的矩形领域内的中值&#xff0c;或”中值像素"。 通过平均的简单模糊对噪声图像&#xff0c;由其是有较大孤立的异常值非常敏感。少量具有较大偏差的点也会严重影响到均值滤波。中值滤波可以采用取中间…

中值滤波器

我们前面提到&#xff0c;使用平均操作或加权平均操作可以降低图像的噪声&#xff0c;并由此引出了空间滤波器的概念。 这种平均操作或加权平均操作的空间滤波器&#xff0c;根据平均操作的特点&#xff0c;可以叫做均值滤波器。均值&#xff0c;就是平均值得意思。我们在《统…

C Primer Plus 第1章 初识C语言 笔记

C语言的起源 1972年&#xff0c;贝尔实验室的丹尼斯里奇&#xff08;Dennis Ritch&#xff09;和肯汤普逊&#xff08;Ken Thompson&#xff09;在开发UNIX操作系统时设计了C语言。 选择C语言的理由 用C语言编写的程序更易懂、更可靠。C语言充分利用了当前计算机的优势&…

C语言 基于结构体的程序设计(PTA)

一、实验目的 1&#xff0e;掌握C语言中结构体类型的定义和结构体变量的定义和引用。 2&#xff0e;掌握用结构指针传递结构数据的方法。 二、实验内容 1、 计算职工工资 给定N个职员的信息&#xff0c;包括姓名、基本工资、浮动工资和支出&#xff0c;要求编写程序顺序输…

C语言学习笔记(kk-zkx)

前言 流行的编程语言编程语言的大致发展历程编程语言应用数据在内存中的储存程序载入内存ASCII编码GB2312和GBKUnicode字符集&#xff08;统一码&#xff0c;万国码&#xff09;就业坑&#xff0c;当心 编程语言&#xff1a;用来控制计算机&#xff0c;让计算机为我们做事情的语…

C语言简介--学前必备知识

关键字 32个关键字&#xff1a; C和C的关系 C 主要在C语言的基础上增加了面向对象和泛型的机制&#xff0c;提高了开发效率&#xff0c;以适用于大中型软件的编写。C支持面向过程编程、面向对象编程和泛型编程&#xff0c;而C语言仅支持面向过程编程。就面向过程编程而言&a…

C语言入门篇——文件操作篇

目录 1、为什么使用文件 2、什么是文件 2.1程序文件 2.2数据文件 2.3文件名 3、文件的打开和关闭 3.1文件指针 3.2文件的打开和关闭 4、文件的顺序读写 5、文件的随机读写 5.1fseek 5.2ftell 5.3rewind 6、文本文件和二进制文件 7、文件读取结束的判定 8、文件…

C语言基础之13:文件输入/输出

Tips1&#xff1a; 函数&#xff1a;fopen()、getc()、putc()、exit()、fclose() fprintf()、fscanf()、fgets()、fputs() rewind()、fseek()、ftell()、fflush() fgetpos()、fsetpos()、feof()、ferror() ungetc()、setvbuf()、fread()、fwrite() 如何使用C标准I/O系列的函数…

01是c语言,01-C语言-简介

一、C语言的起源 1972年&#xff0c;由贝尔实验室的丹尼斯.里奇和肯.汤普逊在开发UNIX系时设计C语言。C语言是在B语言基础上进行设计的。C 语言设计的初衷是将其作为程序员使用的 一种编程工具&#xff0c;因此&#xff0c;其主要目标是成为有用的语言。 二、C语言的特性 设计特…

用C语言实现CLI界面的魔塔游戏

简介 本着开源的精神&#xff0c;我分享下我做的数据结构大作业&#xff0c;我当时选择的是游戏设计题目&#xff0c;由于魔塔基础的机制不太复杂&#xff0c;所以就借着大作业设计了个简易的魔塔游戏。 这是游戏界面&#xff1a; 以下是我当时大作业内容&#xff1a; 我把…

C语言入门(什么是C语言,C语言的编程机制以及一些基础计算机概念)

目录 一.什么是C语言 1.面向对象&#xff1a; 2.面向过程&#xff1a; 二.C语言特点 三.C语言开发时间 四.环境搭建 1.代码编辑器 2.C编译器 五.C语言标准 六.计算机补充知识 1.计算机构成 2.CPU工作 3.编译器 七.编写程序步骤 八.源文件&#xff0c;目标文件&a…

C语言 09.文件

读写文件与printf、scanf关联 printf – 屏幕 – 标准输出 scanf – 键盘 – 标准输入 perror – 屏幕 – 标准错误 系统文件&#xff1a;&#xff08;打开和关闭由系统自动执行&#xff09; 标准输入 – stdin – 0 一旦关闭了&#xff0c;scanf就不可以使用 标准输出 – s…

C语言完整知识体系总结

C语言的知识体系总结 这里写目录标题 C语言的知识体系总结序言&#xff1a;C语言的概述历史、特点、标准&#xff09;1、嵌入式开发为什么选择C语言&#xff1f;&#xff08;面试题&#xff01;&#xff09;2、为什么内核开发选择C语言&#xff1f;3、C语言的缺点&#xff1a;a…