
上面提到的滤波器都属于平滑滤波器(低通滤波器),用来平滑图像,抑制噪声。相反,锐化空间滤波器主要用于增强图像的突变信息、细节和边缘信息。平滑滤波主要是利用邻域的均值(或中值)来代替模板中心的像素,以此来削弱邻域间的差异,平滑图像,抑制噪声。相反,锐化滤波器以邻域的微分作为算子,增大邻域内像素的差异,使图像的突变部分变得更加明显。
本文主要介绍以下内容:
图像的一阶和二阶微分的性质
几种常见的一阶微分算子
二阶微分算子-拉普拉斯拉普拉斯算子
一阶微分算子和二阶微分算子得到的边的比较
一阶微分和二阶微分的性质
既然是基于一阶微分和二阶微分的锐化空间滤波器,那就要先了解下一个一阶微分和二阶微分的性质。
锐化图像是为了增强图像的突变部分,所以我们还研究了图像恒定区域中突变(阶跃和斜率的突变)的起点和终点,以及沿灰度斜率的微分性质。微分是函数的局部变化率的表示,因此一阶微分具有以下性质:
在恒定的灰度区域,图像的微分值为0。(灰度值没有变化,自然微分值为0)
在灰度级阶跃或斜率的起始点,微分值不为0。(步长为,灰度值突变较大;斜率是灰度值变化缓慢;灰度值发生变化,微分值不为0)
沿着斜坡的微分值不为0。
二阶微分是一阶微分的导数,对应于一阶微分,具有以下性质:
在恒定区域中,第二微分值为0。
在灰度阶梯或斜率的开始处,微分值不为0。
沿坡度的微分值为0。
从上述图像灰度的一阶和二阶微分的性质可以看出,在灰度值变化的地方,一阶微分和二阶微分的值不为零;在灰度级恒定的情况下,微分值为0。也就是说,无论使用一阶微分还是二阶微分,都可以获得图像灰度级的变化值。
图像可以看作一个二维离散函数,它对图像一阶微分的计算公式如下:
对于二阶微分,有:
对于图像边缘的灰度值,通常有两个突变:
两侧边缘图像的灰度差异较大,形成灰度台阶。在该步骤,第一微分和第二微分的值不为0。
两边的边缘图像不像台阶那样变化剧烈,会形成缓慢变化的灰度斜率。在斜率的起点和终点,一阶和二阶微分的值不为零,但是沿斜率的一阶微分的值不为零,而二阶微分的值为零。
对于图像的边缘,通常有一个斜率过渡。如果一阶微分在斜坡处的值不为0,那么其得到的边缘较粗;而二阶微分的值在斜坡处为0,但在斜坡两端不为0,值的符号也不同,这样二阶微分就得到一个相隔0和一个像素宽的双边缘。也就是说,二阶微分在增强图像细节方面要比一阶微分好得多,在计算上也比一阶微分更方便。
梯度图
图像处理中的一阶微分通常是利用梯度的幅值来实现的。对于图像f (x,y),f,f在坐标(x,y)处的梯度是一个列向量。
向量表示点(x,y)处图像中像素的灰度值的最大变化率的方向。向量的幅度是图像f (x,y)的梯度图,表示为M(x,y)。
M (x,y)是an
根据梯度的定义
用这种方法得到的模板[11]和计算的图像的梯度只考虑了单个像素的差异,没有利用图像像素的邻域特性。
罗伯特交叉算子
在图像处理过程中,我们不只计算图像中的某个像素,通常考虑每个像素的某个邻域的灰度变化。因此,我们通常不简单的用梯度的定义来计算梯度,而是在像素的某个邻域内设置梯度算子。考虑33区域的像素由以下矩阵表示:
设中心点z5代表图像中的任意像素,那么根据梯度的定义,z5在X和Y方向的梯度分别为GX=z9 z5和gy=z8 z6,梯度图像M (x,Y)
根据上述公式,罗伯特于1965年提出了罗伯特交叉算子
索贝尔算子
罗伯特交叉算子是偶数,偶数大小的滤波器没有对称中心计算效率较低,所以滤波器的模板大小通常是奇数。仍以33为例,以z5为对称中心(代表图像中的任意像素),有
利用上面的公式,可以得到下面两个卷积模板,分别计算图像在X和Y风向的梯度。
在第一个模板中,第三条线和第一条线的差近似为X方向的偏导数;在第二个模板中,第三列和第一列的差在Y方向上近似为偏微分,模板的所有系数只和为0,表示恒定灰度区的响应为0。
基于OpenCV的梯形算子的实现
索贝尔算子
Sobel算子封装在OpenCV中,函数是Sobel。使用Sobel可以轻松计算任意大小的x和y方向的偏微分,如下所示:
void sobel_grad(const Mat src,Mat dst) { Mat grad_x,grad _ y;索贝尔(src,grad_x,CV_32F,1,0);索贝尔(src,grad_y,CV_32F,0,1);//convertScaleAbs(grad_x,grad _ x);//convertScaleAbs(grad_y,grad _ y);//addWeighted(grad_x,0.5,grad_y,0.5,0,dst);星等(grad_x,grad_y,dst);convertScaleAbs(dst,dst);}
在上面的代码中调用Sobel,分别得到图像在X和Y方向的偏微分gx和gy,然后将它们相加得到图像的梯度图。
其余函数显示convertScaleAbs将图像类型转换为cv _ 8uAddWeighted将两幅图像按照一定的权重相加;量级求两幅图像的振幅,其公式为
,具体参数描述请参考OpenCV官方文档。
基于定义和罗伯特交叉算子的计算
对于这两个操作符,OpenCV中没有提供具体的函数,但是可以通过使用filter2D函数来实现。Filter2D是OpenCV中图像卷积的一个非常重要的函数,可以使用任何线性卷积核进行卷积。
void robert_grad(const Mat src,Mat dst) { Mat grad_x,grad _ y;Mat kernel_x=(Mat_(2,2) -1,0,0,1);Mat kernel_y=(Mat_(2,2) 0,-1,1,0);filter2D(src,grad_x,CV_32F,kernel _ x);filter2D(src,grad_y,CV_32F,kernel _ y);//convertScaleAbs(grad_x,grad _ x);//convertScaleAbs(grad_y,grad _ y);//addWeighted(grad_x,1,grad_y,1,0,dst);星等(grad_x,grad_y,dst);}
构造Robert交叉算子,然后调用filter2D基于定义的计算方法在此类似,此处不再赘述。
结果三种方法计算的梯度图如下:
从以上结果可以看出,Robert交叉算子和基于定义的边图得到的边比较细,不是很连续;Sobel得到了更粗的边缘和连续的线条,效果明显优于另外两种算子。
二阶微分算子-拉普拉斯拉普拉斯算子
二阶微分算子的代表是拉普拉斯算子,其定义如下:
其中包括:
对于上面提到的33区域,有
生成的模板如下所示:
注意模板中央的符号,模板所有系数之和为0。
OpenCV里有一个拉普拉斯的包,它的函数是拉普拉斯,它使用的模板中心的系数是负的。参数详情见OpenCV文档。OpenCV得到的边图和一阶微分算子得到的边图的比较结果如下:
一阶微分算子Sobel得到的边缘比二阶微分算子Laplace得到的边缘粗,但边缘更细,边缘是双刃的。l宫算子对噪声敏感,得到的边缘图像中噪声明显。
由于拉普拉斯算子对噪声敏感,它可以得到两个面,并且可以无法检测边缘的方向。它通常不用于直接边缘检测,只起辅助作用。检测像素是边缘的亮侧还是暗侧,并使用零交叉以确定边缘的位置。
摘要
本文主要介绍图像空间域的锐化算子(即边缘检测算子)。这些算子都是基于图像微分的:一阶微分和二阶微分(拉普拉斯算子)。
由于一阶微分和二阶微分各有特点,所以它们得到的图像边缘也不同:一阶微分得到的图像边缘较粗,而二阶微分得到的双边缘较细,所以二阶微分算子对图像边缘增强的效果更好。









