Sobel变换和拉普拉斯变换都是高通滤波器。什么是高通滤波器呢?就是保留图像的高频分量(变化剧烈的部分),抑制图像的低频分量(变化缓慢的部分)。而图像变化剧烈的部分,往往反应的就是图像的边沿信息了。
在OpenCV中,调用sobel函数很简单:
Mat image = imread("D:/picture/images/boldt.jpg",0);
if(!image.data)
return -1;
imshow("源图像",image);
Mat sobelX;
//参数为:源图像,结果图像,图像深度,x方向阶数,y方向阶数,核的大小,尺度因子,增加的值
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);
注意到,这里对sobel的结果进行了一些尺度变换来更好的显示。
有一点需要特别注意:
由于是对X方向求导,sobelX保留了很多垂直方向的信息,所以垂直的轮廓“看起来更加清楚”;y方向同理。
按照数学推倒,应该是把两个方向的值平方以后相加在开方(2范数),得到梯度。而实际上,为了简化运算,我们直接把他们的绝对值相加(1范数)得出梯度: