1. Laplacian 算子
Laplacian 算子(拉普拉斯), 是n维欧几里德空间中的一个二阶微分算子,定义为梯度的散度(参考:一阶为梯度,二阶为散度
)。
拉普拉斯算子的定义:
Laplace
注意: 拉普拉斯算子使用了图像梯度,它的内部代码调用了Sobel算子
, 且如果让一幅图像减去它的Laplacian算子可以增强对比度
。
- 源代码剖析
/************************************************************
* void Laplacian( InputArray src, OutputArray dst, int ddepth,
int ksize = 1, double scale = 1, double delta = 0,
int borderType = BORDER_DEFAULT );
*
* ksize = 1, 内核大小为3*3
*
* src: image 8-bit input image ;
*
* ******************************************************************/
Mat lapImage;
Laplacian(grayImage, lapImage, -1, 1, 1, 0);
imshow("Laplacian", lapImage);
- 测试结果对比
2. Scharr算子 – Scharr 滤波器
一般称其为Scharr滤波器
, 它主要是配合Sobel算子的运算而存在。
Scharr() 函数: 计算图像差分, 分别计算x, y 方向上的图像差分
。它的参数变量除了没有ksize核参数,其他参数变量与Sobel基本一样
。
- 源代码剖析
/***************************************************************
* Scharr( InputArray src, OutputArray dst, int ddepth,
int dx, int dy, double scale = 1, double delta = 0,
int borderType = BORDER_DEFAULT );
* *************************************************************/
Mat grad_x_2, grad_y_2, abs_grad_x_2, abs_grad_y_2;
Mat schImage;
Scharr(srcImage, grad_x_2, -1, 1, 0, 1, 0 );
// Scahrr 滤波器中这一步不可少
convertScaleAbs(grad_x, abs_grad_x_2);
//imshow("grad_x_2", grad_x_2);
imshow("abs_grad_x_2", abs_grad_x_2);
Scharr(srcImage, grad_y_2, -1, 1, 0, 1, 0); // y方向上的梯度有点差
convertScaleAbs(grad_y_2, abs_grad_y_2);
imshow("abs_grad_y_2", abs_grad_y_2);
addWeighted(abs_grad_x_2, 0.8, abs_grad_y_2, 0.2, 0, schImage);
imshow("Scharr", schImage);
- 测试结果对比
在上图中,从左至右分别是 Sobel --> Scharr --> Laplacian
3.小结
从这两节的边缘检测的测试可以看出:
- 在相同条件下,Canny算子检测不完全,有部分区域还没有去除;
- Sobel算子和Laplacian算子在某种程度上边缘检测比较完整;
- Scharr滤波器可能参数需要调整,或者
该怎么配合Sobel使用
是个问题,在这里测试发现在y方向的梯度误差太大
。
来源:https://blog.csdn.net/qq_29797957/article/details/100108663