OpenCV学习笔记(二)常用滤波函数之中篇(自适应中值滤波)

本文详细介绍了OpenCV中的自适应中值滤波原理,旨在滤除椒盐噪声和平滑图像,同时保护图像细节。通过动态调整滤波窗口尺寸,自适应中值滤波器能更好地适应不同噪声场景,避免传统中值滤波器可能导致的图像边缘细化或粗化问题。文章还提供了自适应中值滤波的代码实现,展示了如何在彩色图像上应用此方法。
摘要由CSDN通过智能技术生成

前言

上一篇介绍了OpenCV中已经封装好的常用滤波函数,这一篇只介绍一种滤波函数:自适应中值滤波。它是在中值滤波的基础上延伸出来的比传统中值滤波函数更为有效一种滤波方法。

先上张效果图

在这里插入图片描述
上图中最后一张图是在自适应中值滤波处理后将扩展的边界去除后的效果。

自适应中值滤波原理

常规的中值滤波器的窗口尺寸是固定大小不变的,不能同时兼顾去噪和保护图像的细节。这时就要寻求一种改变,根据预先设定好的条件,在滤波的过程中,动态的改变滤波器的窗口尺寸大小,这就是自适应中值滤波器 Adaptive Median Filter。在滤波的过程中,自适应中值滤波器会根据预先设定好的条件,改变滤波窗口的尺寸大小,同时还会根据一定的条件判断当前像素是不是噪声,如果是则用邻域中值替换掉当前像素;不是,则不作改变。
自适应中值滤波器有三个目的:
滤除椒盐噪声
平滑其他非脉冲噪声
尽可能的保护图像中细节信息,避免图像边缘的细化或者粗化。

自适应中值滤波器不但能够滤除概率较大的椒盐噪声,而且能够更好的保护图像的细节,这是常规的中值滤波器做不到的。自适应的中值滤波器也需要一个矩形的窗口Sxy,和常规中值滤波器不同的是这个窗口的大小会在滤波处理的过程中进行改变(增大)。需要注意的是,滤波器的输出是一个像素值,该值用来替换点(x,y)处的像素值,点(x,y)是滤波窗口的中心位置。
在描述自适应中值滤波器时需要用到如下的符号:
Zmin=Sxy中的最小灰度值
Zmax=Sxy中的最大灰度值
Zmed=Sxy中的灰度值的中值
Zxy表示坐标(x,y)处的灰度值
Smax=Sxy允许的最大窗口尺寸
自适应中值滤波器有两个处理过程,分别记为:A和B。
A :
A1 = Zmed−Zmin
A2 = Zmed−Zmax
如果A1 > 0 且 A2 < 0,跳转到 B;
否则,增大窗口的尺寸 (此处有两种情况:一种是 Zmed确实是噪点,此时模板太小无法分辨出噪点需要增大模板;另外一种是 Zmed是原图的有用点,但是A1 > 0 且 A2 < 0条件也不成立,需要增大模板,若直到最后窗口的尺寸≥Smax时条件任然不成立那么此时的Zmed则可以肯定是原图像中的点而不是噪点了)
如果增大后窗口的尺寸 ≤Smax,则重复A过程。否则,输出Zmed
B:
B1 = Zxy−Zmin
B2 = Zxy−Zmax
如果B1 > 0 且 B2 < 0,则输出Zxy
否则输出Zmed(因为此时的Zmed不是噪点,Zxy 是噪点,用Zmed代替Zxy)。
自适应中值滤波原理说明:
过程A的目的是确定当前窗口内得到中值Zmed是否是噪声。如果Zmin<Zmed<Zmax,则中值Zmed不是噪声,这时转到过程B测试,当前窗口的中心位置的像素Zxy是否是一个噪声点。如果Zmin<Zxy<Zmax,则Zxy不是一个噪声,此时滤波器输出Zxy;如果不满足上述条件,则可判定Zxy是噪声,这是输出中值Zmed(在A中已经判断出Zmed不是噪声)。
从上面分析可知,当噪声出现的概率较低时,自适应中值滤波器使用较小的滤波核就可以得出结果,不需要去增加窗口的尺寸;反之,噪声的出现的概率较高,则需要增大滤波器的窗口尺寸,这些操作过程都是局部进行的,因此在对一幅图片滤波时,既有大滤波核滤波,也有小滤波核滤波,这就避免了中值滤波一刀切的问题。这也比较符合自适应中值滤波器的特点:噪声点比较多时,需要更大的滤波器窗口尺寸。

自适应中值滤波器代码实现

// Adaptive_Median_Filter.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "iostream"
#include "cv.h"
#include "highgui.h"

using namespace std;
using namespace cv;

//盐噪声  
void saltNoise(Mat img, int n)
{
   
	int x, y;
	for (int i = 0;i < n / 2;i++)
	{
   
		x = rand() % img.cols;
		y = rand() % img.rows;
		if (img.type() == CV_8UC1)
		{
   
			img.at<uchar>(y, x) = 255;
		}
		else if (img.type() == CV_8UC3)
		{
   
			img.at<Vec3b>(y, x)[0] = 255;
			img.at<Vec3b>(y, x)[1] = 255;
			img.at<Vec3b>(y,<
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值