OpenCV——Sobel和拉普拉斯变换
Sobel变换和拉普拉斯变换都是高通滤波器。
什么是高通滤波器呢?就是保留图像的高频分量(变化剧烈的部分),抑制图像的低频分量(变化缓慢的部分)。而图像变化剧烈的部分,往往反应的就是图像的边沿信息了。
1. Sobel算子(主要用于边缘检测)
//Sobel变化实例 Mat sobelX; Sobel(image,sobelX,CV_8U,1,0,3,0.4,128); imshow("X方向Sobel结果",sobelX); Mat sobelY; Sobel(image,sobelY,CV_8U,0,1,3,0.4,128); imshow("Y方向Sobel结果",sobelY);
//函数说明 void Sobel(InputArray src, OutputArray dst, int ddepth, int xorder, int yorder, int ksize=3, double scale=1, double delta=0, int borderType=BORDER_DEFAULT )
void cvSobel( const CvArr* src, CvArr* dst, int xorder, int yorder, int aperture_size=3 ); /* src 输入图像. dst 输出图像. xorder x 方向上的差分阶数 yorder y 方向上的差分阶数 aperture_size 扩展 Sobel 核的大小,必须是 1, 3, 5 或 7。 除了尺寸为 1, 其它情况下, aperture_size ×aperture_size 可分离内核将用来计算差分。对 aperture_size=1的情况,
使用 3x1 或 1x3 内核 (不进行高斯平滑操作)。这里有一个特殊变量 CV_SCHARR (=-1),对应 3x3 Scharr 滤波器,可以给出比 3x3 Sobel 滤波更精确的结果。
对 x-方向 或矩阵转置后对 y-方向。 */
2.Laplacian变换
Laplacian变换功能1:用来检测物体的边缘信息
具体说明:
在图像平坦(灰度值无变换的区域),拉普拉斯滤波后的图像在该区域的强度值为0.在图像灰度值剧烈变换的区域(边缘),拉普拉斯滤波后的图像的强度值(绝对值)相对较大。
物体边缘一般在强度值的零交点(注意:并不是在强度值为0的点,而是在强度值从正变换到负,或从负变换到正的过程中,隐含存在的为0的亚像素级的点)。
Laplacian变换功能2:可用于图像增强(原图像减去拉普拉斯变换的图像)
原理大体为:
图像相对平坦的区域拉普拉斯变换后的值约等于0。像素(原)-0=像素(原),即该区域图像几乎没有变化。
在图像中强度值变换剧烈的地方,通常是物体的边缘处,拉普拉斯变换后的该区域的强度值(绝对值)较大。那么 像素(原)-像素(变换后),肯定会发生变化。例如:150(原)-50(变换后的 )=100,该点处的像素变黑。
函数:
void cvLaplace( const CvArr* src, CvArr* dst, int aperture_size=3 );
/* src 输入图像. dst 输出图像. aperture_size 核大小 (与 cvSobel 中定义一样) */
函数 cvLaplace 计算输入图像的 Laplacian变换,方法是先用 sobel 算子计算二阶 x- 和 y- 差分,再求和:
对 aperture_size=1 则给出最快计算结果,相当于对图像采用如下内核做卷积:
类似于 cvSobel 函数,该函数也不作图像的尺度变换,所支持的输入、输出图像类型的组合和cvSobel一致。