【OpenCV图像处理】十五、图像空域滤波(上) 您所在的位置:网站首页 prc系统主要用于什么方面 【OpenCV图像处理】十五、图像空域滤波(上)

【OpenCV图像处理】十五、图像空域滤波(上)

2024-06-17 22:01| 来源: 网络整理| 查看: 265

1.空域滤波介绍

空域滤波是一种邻域处理方法,通过直接在图像空间中对邻域内像素进行处理,达到平滑或锐化图像的作用。此外,在图像识别中,通过滤波还可以抽出图像的特征作为图像识别的特征模式。

空域滤波是图像处理领域中广泛使用的主要工具。空域滤波主要可以分为线性滤波和非线性滤波,其中,线性滤波和频域滤波存在一一对应的关系。但是,空域滤波可以用于非线性滤波,但是频域滤波不能用于非线性滤波。

从根源上讲,滤波这一词语来自于频域,信号处理中频域滤波指的是允许或者限制一定的频率成分通过。但空域滤波直接在图像空间中增强图像的某些特征或者减弱图像的某些特征。

空域滤波的作用域是像素及其邻域,通常使用空域模板对邻域内的像素进行处理从而产生该像素的输出值。

线性空域滤波指的是像素的输出值是计算该像素邻域内像素值的线性组合,系数矩阵在这里我们称之为模板。由信号处理的原理可以得出,线性滤波可以用卷积来实现。因此,在数字图像处理中,线性滤波通常是利用滤波模板与图像的空域进行卷积来实现的,在线性滤波中滤波模板也称为卷积模板。

根据空域卷积的定义可以知道,卷积首先需要将模板进行反褶,也就是将模板绕模板中心旋转180°,但是在数字图像处理中,卷积模板通常是关于原点对称的,因此通常不需要考虑反褶过程。模板卷积的主要步骤包括如下几个步骤,

(a.将模板在图像中进行遍历,将模板中心和各个像素位置重合;

(b.将模板的各个系数与模板对应像素值进行相乘;

(c.将所有的乘积相加,并将求和结果赋值于模板中心对应的像素

对于尺寸为m*n的模板,线性滤波在图像中像素(x,y)处的相应输出g(x,y)的一般表达式如下:

上式中,w(s,t)和f(x+s,y+t)分别为模板系数和模板对应像素,其中,为了保证唯一坐标s和t是整数,要求m和n是奇数。在一般情况下,线性滤波选取尺寸为奇数的正方形模板。

为了方便进行描述,设模板的尺寸为mxn,线性滤波在像素(x,y)处的相应输出R的另一种简单化表示为:

上式中wi表示的是模板系数,zi表示与模板系数对应的像素值,这里i = 1,2,3,...,mn,mn这里指的是模板对应的像素总数。

在非线性空域滤波中也是采用基于邻域的处理,而且模板滑过一幅图像的机理和线性空域滤波是一致的。非线性滤波处理也取决于模板对应的邻域内的像素,然而,因为不能直接利用上面g(x,y)的表达式计算乘积求和。例如非常有用的中值滤波,它是将模板对应的邻域内的像素值进行排序,然后查找中间值。利用这种方法可以有效地去除椒盐噪声,但是因为非线性滤波涉及到了像素值的排序操作,因此它的时间开销要比线性滤波的大。

对于实现空域滤波的最后一个问题是对于图像边界像素邻域的处理。对于尺寸为n*n的空域模板,当模板中心距离图像边界为(n-1)/2像素时,该模板正好在图像的内部。如果模板的中心继续像图像外边界靠近,那么模板的行或列就会超出图像之外。因此常常采用延拓的方式解决外边界问题。常用的方法有四种,分别是补零、重复、对称和循环方式,补零是指通过补零来扩展图像。重复是指通过复制外边界的值来扩展图像,对称是指通过镜像反射外边界的值来扩展图像,循环是指将图像看成二维周期函数的一个周期来扩展。在空域滤波完成后,从处理后的图像裁剪出与源图像对应的部分,使处理后的图像与源图像的尺寸相等。

2.图像平滑

图像平滑的作用是对图像进行模糊和降噪。其中图像平滑的模糊处理经常用于图像的预处理阶段,例如,为了提取较大的目标,通过模糊处理平滑一些细节和纹理、桥接直线和曲线的缝隙。因为噪声的特性造成图像灰度的突变,因此,图像的平滑处理也可以起到降低噪声的作用,但是,在模糊和降噪的同时,图像中的边缘和细节的锐度也都丢失了,也就是说,在平滑的过程中,使得图像的一部分细节信息丢失。在通常情况下,图像的平滑有两种主要的方法:

线性平滑滤波和统计排序平滑滤波。其中线性平滑滤波适用于降低图像中的高斯噪声,而统计排序平滑滤波对滤除脉冲噪声非常有效。   

其中,线性滤波是现实将空域模板对应邻域内像素的灰度值加权之和作为邻域内中心像素的相应输出。线性平滑模板的权系数全为正值而且系数之和等于1,因此这种方法不会增加图像中总体的灰度程度。也就是说在灰度一致的区域,线性平滑滤波的相应输出不变。此外,可以知道,线性平滑滤波等效于低通滤波。

最简单的线性平滑滤波使用的模板是均值平滑模板。如下图所示均值模板的尺寸为3x3,权系数全为1,为了让权系数之和等于1,模板系数需要再乘以归一化因子1/9

但是,通过对上面这个模板进行频域分析可以知道,均值平滑模板具有旁瓣泄漏效应,反应在图像中就是振铃效应,且模板尺寸越大,振铃效应也就越明显。

另一种更为重要的平滑模板是加权平均模板,指的是模板中不同的位置对应的像素具有不同的权值数,其中,最常用的就是高斯平滑模板。对应模板中心像素的响应输出,显然中心像素的灰度值比周围图像像素的灰度值更重要,因此给模板中心对应的像素赋予最大的权系数,随着模板对应的像素到中心位置的距离增大而减小权系数。下图是3x3的高斯平滑模板。

如上图,中心像素的权系数是4,由于4邻域的像素到中心位置的距离为1,而对角邻域的像素到中心位置的距离为√2,对角邻域的像素比4邻域的像素到中心位置的距离更远,因此,4邻域像素的权系数为2,而对角邻域像素的权系数为1。最后乘以1/16是为了对模板进行归一化。

下面分别介绍一下在OpenCV中各种空域滤波函数的使用和实现。

①方框滤波:boxFilter()

方框滤波函数的作用是使用方框滤波(box filter)来模糊一张图片,原理是指定一个XY的矩阵大小,目标像素的周围XY矩阵内的像素全部相加作为目标像素的值,方框滤波所用到的核如下:

其中,α为

当normalize为true时,方框滤波也就成了均值滤波。也就是说均值滤波是方框滤波归一化后的特殊情况。归一化就是将要处理的量缩放到一定范围,比如(0,1),以便统一处理和直观量化。而非归一化的方框滤波用于计算每个像素邻域内的积分特性,比如光流法中用到的图像倒数的协方差矩阵。如果要在可变窗口中计算像素总和,可以使用integral()函数。

因此它在OpenCV中的内部实现借鉴了积分图像的原理思想,在快速积分图像求解中,将计算某个矩阵像素间的和值运算转换为求矩阵对应边角点的求和差值运算。在实现中最关键的步骤就是初始化起始数组S,数组D的每个值是存放的像素邻域内的像素和值,在求解某矩形块中的像素和时,只需要索引对应区域的位置存放的和值就可以完成计算。

函数原型如下:

void boxFilter( InputArray src, OutputArray dst, int ddepth, Size ksize, Point anchor=Point(-1,-1), bool normalize=true, int borderType=BORDER_DEFAULT );相关参数意义如下:

第一个参数 src表示输入图像,使用Mat类的对象即可。这个图像对通道是独立处理的,而且可以处理任意通道数的图像。但是需要注意的是,待处理的图像深度应该为CV_8U、CV_16U、CV_16S、CV_32F以及CV_64F之一。

第二个参数dst表示目标图像,需要和原图像有一样的尺寸和类型。

第三个参数是int类型的ddepth,表示的是输出图像的深度,-1代表的是使用源图像的深度,也就是src.depth()。

第四个参数是Size类型的ksize,表示的是内核的大小,我们一般使用size(w,h)来表示内核的大小,其中w是像素的宽度,h是像素的高度

第五个参数是Point类型的anchor,表示锚点(目标点,也就是此刻被滤波处理的点)。有默认值(-1,-1)。如果这个点的坐标是负值的话,就表示取核的中心为锚点,所以默认值Point(-1,-1)表示这个锚点在这个核的中心。

第六个参数是bool类型的normalize,有默认值true,表示的是是否对内核进行归一化处理。

最后一个参数是int类型的borderType,表示的是扩展边界的类型,有默认值BORDER_DEFAULT,通常直接使用默认值即可。

以下为相关使用范例

//使用boxFilter实现方框滤波 #include #include #include #include using namespace cv; using namespace std; int main() { Mat srcImage = imread("2345.jpg"); if (!srcImage.data) { cout


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有