1、Sobel导数
Sobel算子结合了高斯平滑和微分求导。可以用来计算图像灰度函数的近似梯度。计算时是将原图像分别与水平方向和竖直方向的奇数大小的内核进行卷积,然后再图像的每一点上进行计算(求根号下两数的平方和,有时会用两数的绝对值和)得出近似梯度。
当内核大小等于3时使用Sobel内核的误差会比较大,在这里可以使用Scharr内核进行计算(将内核大小设为-1时调用的是Scharr内核)。
在求导时,最好水平竖直分开求然后再加起来,效果会好一点。
还有就是要将输出类型设为CV_16S以防止溢出.
void Sobel( InputArray src, OutputArray dst, int ddepth,
int dx, int dy, int ksize = 3,
double scale = 1, double delta = 0,
int borderType = BORDER_DEFAULT );
前两个参数为输入输出图像,
第三个参数为输出图像的类型,
然后第四个和第五个参数为x,y方向上的导数的阶数
第六个参数为所使用的内核的大小,设为-1时使用Scharr内核
最后三个参数均使用默认值即可。
代码如下:
int main()
{
Mat a = imread("738b4710b912c8fc453a8235fe039245d7882178.jpg");
imshow("原图", a);
cvtColor(a, a, CV_RGB2GRAY); //转为灰度图
Mat ax, ay;
Mat axx, ayy;
Sobel(a, ax, CV_16S, 1, 0,-1);
Sobel(a, ay, CV_16S, 0, 1,-1);
convertScaleAbs(ax, axx); //将CV_16S转为CV_8U
convertScaleAbs(ay, ayy);
addWeighted(axx, 0.5, ayy, 0.5, 0,a); //将两图相加
imshow("效果图", a);
cvWaitKey(10000);
}
2、Laplace 算子
Laplacian 算子 的定义:
是对二维图像求的二阶偏导数,在函数中由于 Laplace使用了图像梯度,它内部调用了 Sobel 算子。
在Laplace算子中无法调用Scharr内核。同样输出图像的类型要定为CV_16S以防止溢出。
void Laplacian( InputArray src, OutputArray dst, int ddepth,
int ksize = 1, double scale = 1, double delta = 0,
int borderType = BORDER_DEFAULT );
第三个参数为输出图像的类型,然后是内核的大小。
后三个参数均使用默认就行了。
代码如下:
int main()
{
Mat a = imread("738b4710b912c8fc453a8235fe039245d7882178.jpg");
imshow("原图", a);
cvtColor(a, a, CV_RGB2GRAY); //转为灰度图
Mat aa;
Laplacian(a, aa, CV_16S,3);
Mat aaa;
convertScaleAbs(aa, aaa); //将CV_16S转为CV_8U
imshow("效果图", aaa);
cvWaitKey(10000);
}
效果图:
3、Canny算法
Canny 边缘检测算法 是 John F. Canny 于 1986年开发出来的一个多级边缘检测算法,也被很多人认为是边缘检测的 最优算法。调用也很简单,输入输出图像可以用同一幅。
代码如下:
int main()
{
Mat a = imread("738b4710b912c8fc453a8235fe039245d7882178.jpg");
imshow("原图", a);
cvtColor(a, a, CV_RGB2GRAY); //转为灰度图
Canny(a, a, 100, 300, 3);
imshow("效果图", a);
cvWaitKey(10000);
}
运行图: