前面介绍的几种滤波器都属于平滑滤波器(低通滤波器),用来平滑图像和抑制噪声的;而锐化空间滤波器偏偏相反,主要用来加强图像的突变信息,图像的细节和边缘信息。平滑滤波器主要是使用邻域的均值(或者中值)来代替模板中心的像素,消弱和邻域间的差异,以达到平滑图像和抑制噪声的目的;相反,锐化滤波器则使用邻域的微分做为算子,增大邻域间像素的差值,使图像的突变部分变的更加明显。app
本位主要介绍了一下几点内容:函数
既然是基于一阶微分和二阶微分的锐化空间滤波器,那么首先就要了解下一阶和二阶微分的性质。spa
图像的锐化也就是加强图像的突变部分,那么咱们也就对图像的恒定区域中,突变的开始点与结束点(台阶和斜坡突变)及沿着灰度斜坡处的微分的性质。微分是对函数局部变化率的一种表示,那么对于一阶微分有如下几个性质:3d
二阶微分,是一阶微分的导数,和一阶微分相对应,也有如下几点性质:code
从以上图像灰度的一阶和二阶微分的性质能够看出,在灰度值变化的地方,一阶微分和二阶微分的值都不为0;在灰度恒定的地方,微分值都为0.也就是说,不管是使用一阶微分仍是二阶微分均可以获得图像灰度的变化值。blog
图像能够看着是二维离散函数,对于图像的一阶微分其计算公式以下:
在x方向,\(\frac{\partial f} {\partial x} = f(x + 1) - f(x)\).
在y方向,\(\frac{\partial f} {\partial y} = f(y + 1) - f(y)\)ci
对于二阶微分有:
在x方向,\(\frac{\partial^2 f} {\partial x^2} = f(x + 1) + f(x - 1) - 2 f(x)\).
在y方向,\(\frac{\partial^2 f} {\partial y^2} = f(y + 1) + f(y - 1) -2 f(y)\)文档
对于 图像边缘处的灰度值来讲,一般有两种突变形式:博客
对于图像的边缘来讲,一般会造成一个斜坡过分。一阶微分在斜坡处的值不为0,那么用其获得的边缘较粗;而二阶微分在斜坡处的值为0,但在斜坡两端值不为0,且值得符号不同,这样二阶微分获得的是一个由0分开的一个像素宽的双边缘。也就说,二阶微分在加强图像细节方面比一阶微分好得多,而且在计算上也要比一阶微分方便。it
在图像处理中的一阶微分一般使用梯度的幅值来实现。对于图像\(f(x,y)\),\(f\)在坐标\((x,y)\)处的梯度是一个列向量
\[ \nabla f = grad(f) = \left[ \begin{array}{c} g_x \\ g_y \end{array} \right] = \left[\begin{array}{c} \frac{\partial f} {\partial x} \\ \frac{\partial f} {\partial y} \end{array} \right] \]
该向量表示图像中的像素在点\((x,y)\)处灰度值的最大变化率的方向。
向量\(\nabla f\)的幅值就是图像\(f(x,y)\)的梯度图,记为\(M(x,y)\)
\[ M(x,y) = mag(\nabla f) = \sqrt{g_x^2 + g_y^2} \]
\(M(x,y)\)是和原图像\(f(x,y)\)同大小的图像。因为求平方的根运算比较费时,一般可使用绝对值的和来近似
\[ M(x,y) \approx \mid g_x \mid + \mid g_y \mid \]
从上面能够看出,要获得图像的梯度图,有如下步骤:
图像是以离散的形式存储,一般使用差分来计算图像的微分,常见的计算梯度的模板有如下几种
根据梯度的定义
\[ g_x = f(x+1,y) - f(x,y) \\ g_y = f(x,y+1) - f(x,y) \]
能够获得模板\(\left[ \begin{array}{c} -1 & 1\end{array}\right]\) 和 \(\left[ \begin{array}{c} -1 \\ 1\end{array}\right]\)。
使用该方法计算的图像的梯度只是考虑单个像素的差值,并无利用到图像的像素的邻域特性。
Robert交叉算子
在图像处理的过程当中,不会只单独的对图像中的某一个像素进行运算,一般会考虑到每一个像素的某个邻域的灰度变化。所以,一般不会简单的利用梯度的定义进行梯度的计算,而是在像素的某个邻域内设置梯度算子。考虑,$3 \times 3 $区域的像素,使用以下矩阵表示:
\[ \left[ \begin{array}{ccc} z_1 & z_2 & z_3 \\ z_4 & z_5 & z_6\\z_7 & z_8 & z_9 \end{array} \right] \]
令中心点\(z_5\)表示图像中任一像素,那么根据梯度的定义,\(z_5\)在在x和y方向的梯度分别为:\(g_x = z_9 - z_5\)和\(g_y = z_8 - z_6\),梯度图像M(x,y)\[M(x,y) \approx \mid z_9 - z_5 \mid + \mid z_8 - z_6 \mid\]
根据上述公式,Robert在1965年提出的Robert交叉算子
\[ \left[ \begin{array}{cc} -1 & 0 \\ 0 & 1 \end{array} \right] and \left[ \begin{array}{cc} 0 & -1 \\ 1 & 0 \end{array} \right] \]
Sobel算子
Robert交叉算子的尺寸是偶数,偶数尺寸滤波器没有对称中心计算效率较低,因此一般滤波器的模板尺寸是奇数。仍以\(3 \times 3\)为例,以\(z_5\)为对称中心(表示图像中的任一像素),有
\[ g_x = (z_7 + 2z_8 +z_9) - (z_1 + 2z_2 + z_3) \\ g_y = (z_3 + 2z_6 + z_9)-(z_1 + 2z_4 + z_7) \]
利用上述公式能够获得以下两个卷积模板,分别计算图像在x和y风向的梯度
\[ \left[ \begin{array}{ccc} -1 & -2 & -1 \\ 0 & 0 & 0 \\ 1 & 2 & 1 \end{array} \right] 和 \left[ \begin{array}{ccc} -1 & 0 & 1 \\ -2 & 0 & 2 \\ -1 & 0 & 1 \end{array} \right] \]
第一个模板,第三行和第一行的差近似x方向的偏微分;第二个模板,第三列和第一列的差近似y方向的偏微分,并且模板的全部系数只和为0,表示恒定灰度区域的响应为0.
Sobel
。使用Sobel
可以很方便的计算任意尺寸的x和y方向的偏微分,具体以下:void sobel_grad(const Mat &src, Mat &dst) { Mat grad_x, grad_y; Sobel(src, grad_x, CV_32F, 1, 0); Sobel(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); magnitude(grad_x, grad_y, dst); convertScaleAbs(dst, dst); }
上述代码中调用Sobel
分别获得图像在x和y方向的偏微分\(g_x\)和\(g_y\),而后相加获得获得图像的梯度图。
其他的几个函数说明,convertScaleAbs
将图像类型转换为CV_8U
;addWeighted
按必定的权值将两个图像相加;magnitude
求两个图像的幅值,其公式为\(dst=\sqrt{g_x^2 + g_y^2}\),具体的参数说明可参考OpenCV的官方文档。
filter2D
函数来实现。filter2D
是OpenCV中对图像进行卷积运算的一个很重要的函数,该函数可以使用任意的线性卷积核对图像进行卷积运算。void robert_grad(const Mat& src, Mat &dst) { Mat grad_x, grad_y; Mat kernel_x = (Mat_<float>(2, 2) << -1, 0,0,1); Mat kernel_y = (Mat_<float>(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); magnitude(grad_x, grad_y, dst); convertScaleAbs(dst, dst); }
构造好Robert交叉算子,而后调用filter2D
便可;基于定义的计算方法于此相似,不在赘述。
结果三种方法计算获得的梯度图,以下:
从上面结果能够看出,Robert交叉算子和基于定义获得的边缘图,获得的边缘较细而且不是很连续;Sobel获得边缘较粗,线条连续,效果明显好于其余的两种算子。
二阶微分算子的表明就是拉普拉斯算子,其定义以下:
\[ \nabla ^2 f = \frac{\partial^2 f} {\partial x^2} + \frac{\partial^2 f} {\partial y^2} \]
其中:
\[\frac{\partial^2 f} {\partial x^2} = f(x + 1,y) + f(x - 1,y) - 2 f(x,y) \\ \frac{\partial^2 f} {\partial y^2} = f(x,y + 1) + f(x,y - 1) -2 f(x,y) \]
对于上述的$3 \times 3 $区域,则有
\[ \nabla ^2 f = z_2 + z_4 + z_6 + z_8 - 4z_5 \]
其获得的模板以下:
\[ \left[ \begin{array}{ccc} 0 & 1 & 0 \\ 1 &-4 & 1 \\ 0 & 1 & 0 \end{array} \right] 或 \left[ \begin{array}{ccc} 0 & -1 & 0 \\ -1 &4 & -1 \\ 0 & -1 & 0 \end{array} \right] \]
注意,模板中心的符号,而且模板的全部系数之和为0.
在OpenCV中有对LapLace的封装,其函数为Laplacian
,其使用的模板中心的系数为负,具体参数说明参见OpenCV文档,其获得的边缘图和一阶微分算子获得边缘图对比结果以下:
因为Laplace算子对噪声敏感,会获得双边,而且并不能检测边缘的方向,其一般不用于直接的边缘检测,只是起到辅助做用。检测某像素实在边缘的亮的一侧仍是暗的一侧,利用“零跨越”肯定边缘的位置。
本文主要介绍了图像空间域的锐化算子(也就是边缘检测算子),这些算子都是基于图像的微分的:一阶微分和二阶微分(拉普拉斯算子)。
因为一阶微分和二阶微分有各自的特色,其获得的图像边缘也不相同:一阶微分获得的图像边缘较粗,二阶微分获得的是较细的双边缘,因此在图像的边缘加强方面二阶微分算子的效果较好。
唠叨几句,看了下上一篇博客仍是2月下旬发的,而今已经是6月了,蹉跎了近4个月的时间!感受工做上实在学不到什么东西啊,每日忙来忙去没有什么收获,并且自己也不是本身喜欢作的方向,是否是该考虑换个工做了呢。