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

OpenCV第八讲:图像变换之边缘检测(Canny+Sobel算子)

边缘检测的一般步骤: 滤波 去除噪声–> 增强 增强梯度显著变换的点 --> 检测 阈值化检测剔除不是边缘的点

最优边缘的三个主要评价标准:

  • 低错误率:标识出尽可能多的实际边缘,同时尽可能减少噪声产生的误差。

  • 高定位性:标识出的边缘要与图像中的实际边缘尽可能接近。

  • 最小响应 :图像中的边缘只能标识一次,并且噪声不应标识为边缘

1. Canny 算子

变分法, 一种寻找满足特定函数功能的函数方法,它的最优检测用4个指数函数项的和表示。

  • 高斯滤波降低噪声干扰

  • 计算梯度幅值和方向(此处是与Sobel算子一样的计算方法)

  • 非极大值抑制

    排除非边缘像素

  • 滞后阈值

    滞后阈值有两个:高阈值+低阈值; 一般推荐高低阈值比为2:1 或 3:1.

  • 代码剖析

		/*************************************************************
		 * Canny: image 8-bit input image ;
		 *
		 * 图像掩码: 掩码矩阵也称之为"核", 掩码矩阵实质上就是对某一区域内的像素赋予了跟原图像不一样的权值,
		 * 			
		 * **************************************************************/
		
		Mat grayImage, blurNoise, CannyEdge;
		GaussianBlur(srcImage, blurNoise, Size(5, 5), 0, 0 );
		imshow("GaussianBlur", blurNoise);
	
		cvtColor(srcImage, grayImage, COLOR_BGR2GRAY);
		Canny(grayImage, CannyEdge, 30, 10, 3);
		imshow("grayEdge", CannyEdge);
	
		Mat colorEdge;
		srcImage.copyTo(colorEdge, CannyEdge); // CannyEdge is mask which added into srcImage = colorEdge
		imshow("ColorEdge", colorEdge);
  • 运行结果

在这里插入图片描述

2. Sobel 算子

主要用于边缘检测的离散微分算子,它结合了高斯平滑微分求导,用来计算图像灰度函数的近似梯度; 在图像的任何一点使用此算子,都会产生对应的梯度矢量或是其法矢量。

  • 对图像分别在x, y两个方向上求导

  • 在x-y两个方向分别将图像与一个奇数内核(Gx, Gy)进行卷积

  • 得到近似梯度: x,y两个方向上的内核的平方和再开根号

    G = G x 2 + G y 2 G=\sqrt{G_{x}^{2}+G_{y}^{2}} G=Gx2+Gy2

  • 源代码剖析

		/*************************************************************
		 * Sobel(): 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 );
		 * ddepth: output image depth
		 * dx-dy-ksize:(X-axis) 0-1-3
		 * dx-dy-ksize:(Y-axis) 1-0-3
		 * 当内核大小(ksize == 3)时, Sobol可能产生比较明显的误差, OpenCV提供了一个替代函数Scharr()。
		 *	
		 * 该函数与Sobel函数一样快,但结果更加精确,但仅限制在内核为3的情况下使用。

		 **************************************************************/
		 //Scharr();
		Mat grad_x, grad_y;
		Mat abs_grad_x;
		Mat sobelImage;
	
		Sobel(srcImage, grad_x, -1, 0, 1, 3, 1, 1);
		//convertScaleAbs(grad_x, abs_grad_x);
		imshow("grad_x", grad_x);
		//imshow("abs_grad_x", abs_grad_x);
		Sobel(srcImage, grad_y, -1, 1, 0, 3, 1, 1);
		imshow("grad_y", grad_y);
	//合并梯度
		addWeighted(grad_x, 0.5, grad_y, 0.5, 0, sobelImage);
		imshow("Sobel", sobelImage);
  • 测试结果

在这里插入图片描述

从上图的对比中可以看出,在某些方面,Sobel算子明显要比canny算子获取更好的边缘的信息

相关文章:

  • V-SLAM 回环检测与后端优化重读
  • OpenCV第九讲:图像变换之边缘检测(Laplacian +Scharr 算子)
  • OpenCV第十讲:图像几何形状识别之霍夫变换
  • OpenCV 第十一讲: 重映射、仿射变换、直方图均衡化
  • OpenCV第十二讲:角点检测与亚像素精度
  • OpenCV第十三讲:SURF特征点的检测与匹配详解
  • OpenCV第十四讲: Fast特征点与ORB特征点原理详解
  • DAVIS第一课: 事件相机的工作原理和相关核心功能简介
  • DAVIS第二课:基于事件相机的视觉里程计
  • Rtab-Map学习之rtabmap_ros源代码剖析
  • DAVIS前言:事件相机资料调研
  • DAVIS第三课: 基于事件相机的光流法计算
  • CUDA学习第一天: 基础概念扫盲
  • CUDA学习第二天: GPU核心与SM核心组件
  • DAVIS第四课:基于DAVIS的特征点检测和追踪
  • .pyc 想到的一些问题
  • Android 控件背景颜色处理
  • extjs4学习之配置
  • httpie使用详解
  • JavaScript实现分页效果
  • vue-router 实现分析
  • 初识MongoDB分片
  • 从伪并行的 Python 多线程说起
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 订阅Forge Viewer所有的事件
  • 分布式熔断降级平台aegis
  • 每天10道Java面试题,跟我走,offer有!
  • 那些年我们用过的显示性能指标
  • 前端性能优化——回流与重绘
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 深入 Nginx 之配置篇
  • 什么软件可以提取视频中的音频制作成手机铃声
  • 一文看透浏览器架构
  • ​卜东波研究员:高观点下的少儿计算思维
  • #define 用法
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • $.each()与$(selector).each()
  • (1)SpringCloud 整合Python
  • (4)logging(日志模块)
  • (LeetCode 49)Anagrams
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (过滤器)Filter和(监听器)listener
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • (转载)深入super,看Python如何解决钻石继承难题
  • (轉貼) UML中文FAQ (OO) (UML)
  • ***通过什么方式***网吧
  • .Mobi域名介绍
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .net core IResultFilter 的 OnResultExecuted和OnResultExecuting的区别
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .net framework4与其client profile版本的区别
  • .NET6使用MiniExcel根据数据源横向导出头部标题及数据
  • .NET是什么