当前位置: 首页 > news >正文

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方向的梯度误差太大

相关文章:

  • OpenCV第十讲:图像几何形状识别之霍夫变换
  • OpenCV 第十一讲: 重映射、仿射变换、直方图均衡化
  • OpenCV第十二讲:角点检测与亚像素精度
  • OpenCV第十三讲:SURF特征点的检测与匹配详解
  • OpenCV第十四讲: Fast特征点与ORB特征点原理详解
  • DAVIS第一课: 事件相机的工作原理和相关核心功能简介
  • DAVIS第二课:基于事件相机的视觉里程计
  • Rtab-Map学习之rtabmap_ros源代码剖析
  • DAVIS前言:事件相机资料调研
  • DAVIS第三课: 基于事件相机的光流法计算
  • CUDA学习第一天: 基础概念扫盲
  • CUDA学习第二天: GPU核心与SM核心组件
  • DAVIS第四课:基于DAVIS的特征点检测和追踪
  • CUDA学习第三天:Kernel+grid+block关系
  • DAVIS第五课: 基于事件相机的一种几何实时3DSLAM算法
  • (三)从jvm层面了解线程的启动和停止
  • 2017-09-12 前端日报
  • 30秒的PHP代码片段(1)数组 - Array
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • Asm.js的简单介绍
  • Computed property XXX was assigned to but it has no setter
  • HashMap剖析之内部结构
  • interface和setter,getter
  • java8 Stream Pipelines 浅析
  • JavaScript中的对象个人分享
  • js学习笔记
  • miaov-React 最佳入门
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • nodejs实现webservice问题总结
  • Python - 闭包Closure
  • spring boot 整合mybatis 无法输出sql的问题
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 使用 @font-face
  • 我是如何设计 Upload 上传组件的
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • 字符串匹配基础上
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • ​一些不规范的GTID使用场景
  • # C++之functional库用法整理
  • # 数据结构
  • #define与typedef区别
  • (Redis使用系列) Springboot 整合Redisson 实现分布式锁 七
  • (vue)页面文件上传获取:action地址
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (二)c52学习之旅-简单了解单片机
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (排序详解之 堆排序)
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • (转)ABI是什么
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • .htaccess配置常用技巧
  • .net 受管制代码