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范数)得出梯度:
//合并结果
Mat sobel;
Sobel(image,sobelX,CV_32F,1,0);
Sobel(image,sobelY,CV_32F,0,1);
//计算1范数
sobel= abs(sobelX)+abs(sobelY);
double sobmin,sobmax;
minMaxLoc(sobel,&sobmin,&sobmax);
//转换为8比特,进行尺度变换
Mat sobelImage;
sobel.convertTo(sobel