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

图像掩码(Mask): 其思想是, 根据掩码矩阵(也称作核)重新计算图像中每个像素的值。掩码矩阵中的值表示近邻像素值(包括该像素自身的值)对新像素值有多大影响。从数学观点看,我们用自己设置的权值,对像素邻域内的值做了个加权平均。

1. Laplacian 算子

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

拉普拉斯算子的定义:

Laplace ( f ) = ∂ 2 f ∂ x 2 + ∂ 2 f ∂ y 2 (f)=\frac{\partial^{2} f}{\partial x^{2}}+\frac{\partial^{2} f}{\partial y^{2}} (f)=x22f+y22f

注意: 拉普拉斯算子使用了图像梯度,它的内部代码调用了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, 0, 1, 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方向的梯度误差太大
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱发呆de白菜头

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值