OpenCV第九讲:图像变换之边缘检测(Laplacian +Scharr 算子)

北城以北 提交于 2019-11-28 18:45:18

1. Laplacian 算子

Laplacian 算子(拉普拉斯), 是n维欧几里德空间中的一个二阶微分算子,定义为梯度的散度(参考:一阶为梯度,二阶为散度)。

拉普拉斯算子的定义:

Laplace(f)=2fx2+2fy2(f)=\frac{\partial^{2} f}{\partial x^{2}}+\frac{\partial^{2} f}{\partial y^{2}}

注意: 拉普拉斯算子使用了图像梯度,它的内部代码调用了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.小结

从这两节的边缘检测的测试可以看出:

  1. 在相同条件下,Canny算子检测不完全,有部分区域还没有去除;
  2. Sobel算子和Laplacian算子在某种程度上边缘检测比较完整;
  3. Scharr滤波器可能参数需要调整,或者该怎么配合Sobel使用是个问题,在这里测试发现在y方向的梯度误差太大
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!