ubuntu22.04@laptop OpenCV Get Started: 011_edge_detection

ubuntu22.04@laptop OpenCV Get Started: 011_edge_detection

  • 1. 源由
  • 2. edge_detection应用Demo
    • 2.1 C++应用Demo
    • 2.2 Python应用Demo
  • 3. 重点逐步分析
    • 3.1 GaussianBlur去噪
    • 3.2 Sobel边缘检测
      • 3.2.1 `Sobel`X方向边缘检测
      • 3.2.2 `Sobel`Y方向边缘检测
      • 3.2.3 `Sobel`XY方向边缘检测
    • 3.3 Canny边缘检测
  • 4. 总结
  • 5. 参考资料
  • 6. 补充

1. 源由

边缘检测是一种图像处理技术,用于识别图像中对象或区域的边界(边缘)。边缘是与图像相关联的最重要的特征之一。

像素强度的突然变化是边缘的特征,在相邻像素中找到这种变化,就找到了边缘,通过图像的边缘了解图像的基本结构。因此,计算机视觉处理应用中广泛使用边缘检测。

接下来,让我们使用OpenCV中提供的两种重要边缘检测算法进行探索:

  • Sobel边缘检测
  • Canny边缘检测

2. edge_detection应用Demo

011_edge_detection是OpenCV通过两种边缘检测技术展示的示例程序。

2.1 C++应用Demo

C++应用Demo工程结构:

011_edge_detection/CPP$ tree .
.
├── CMakeLists.txt
├── edge_detection.cpp
└── test.jpg0 directories, 3 files

确认OpenCV安装路径:

$ find /home/daniel/ -name "OpenCVConfig.cmake"
/home/daniel/OpenCV/installation/opencv-4.9.0/lib/cmake/opencv4/
/home/daniel/OpenCV/opencv/build/OpenCVConfig.cmake
/home/daniel/OpenCV/opencv/build/unix-install/OpenCVConfig.cmake$ export OpenCV_DIR=/home/daniel/OpenCV/installation/opencv-4.9.0/lib/cmake/opencv4/

C++应用Demo工程编译执行:

$ mkdir build
$ cd build
$ cmake ..
$ cmake --build . --config Release
$ cd ..
$ ./build/edge_detection

2.2 Python应用Demo

Python应用Demo工程结构:

011_edge_detection/Python$ tree .
.
├── edge_detection.py
├── requirements.txt
└── test.jpg0 directories, 3 files

Python应用Demo工程执行:

$ workoncv-4.9.0
$ python edge_detection.py

3. 重点逐步分析

3.1 GaussianBlur去噪

严重的噪声对于边缘检测是非常不利的因素之一。因此,在边缘检测过程之前,先进行一个去噪的动作。

这里采用了一个3x3的矩阵进行 GaussianBlur(src, dst, ksize, sigmaX, sigmaY)去噪。

C++:

// Blur the image for better edge detection
Mat img_blur;
GaussianBlur(img, img_blur, Size(3,3), SigmaX=0, SigmaY=0);

Python:

# Blur the image for better edge detection
img_blur = cv2.GaussianBlur(img,(3,3), SigmaX=0, SigmaY=0) 

在这里插入图片描述

3.2 Sobel边缘检测

Sobel边缘检测的主要依据就是像素灰度微分变化出现极值,如下图所示:

在这里插入图片描述
在这里插入图片描述

在计算机二维运算过程中 A A A表示像素矩阵数据,用 G x G_x Gx代表 X X X方向上的微分, G y G_y Gy代表 Y Y Y方向上的微分, G G G代表图像总的微分值。

在这里插入图片描述
在这里插入图片描述
微分变化方向可以通过三角函数获取 θ \theta θ

在这里插入图片描述

在这里插入图片描述

3.2.1 SobelX方向边缘检测

C++:

Sobel(img_blur, sobelx, CV_64F, 1, 0, 5);

Python:

sobelx = cv2.Sobel(src=img_blur, ddepth=cv2.CV_64F, dx=1, dy=0, ksize=5) # Sobel Edge Detection on the X axis

在这里插入图片描述

3.2.2 SobelY方向边缘检测

C++:

Sobel(img_blur, sobely, CV_64F, 0, 1, 5);

Python:

sobely = cv2.Sobel(src=img_blur, ddepth=cv2.CV_64F, dx=0, dy=1, ksize=5) # Sobel Edge Detection on the Y axis

在这里插入图片描述

3.2.3 SobelXY方向边缘检测

C++:

Sobel(img_blur, sobelxy, CV_64F, 1, 1, 5);

Python:

sobelxy = cv2.Sobel(src=img_blur, ddepth=cv2.CV_64F, dx=1, dy=1, ksize=5) # Combined X and Y Sobel Edge Detection

在这里插入图片描述

3.3 Canny边缘检测

Canny边缘检测是当今使用的最流行的边缘检测方法之一,因为它非常稳健和灵活。

除了前面两个阶段:

  1. Noise Reduction
  2. Calculating the Intensity Gradient of the Image

增加两个新增阶段:
3. Suppression of False Edges

如果当前像素的梯度大小大于其相邻像素,则保持不变。否则,当前像素的大小将设置为零。正如你所看到的,与老虎皮毛相关的许多“边缘”都被显著地抑制了。
在这里插入图片描述

  1. Hysteresis Thresholding
  • 如果梯度幅度值高于较大的阈值,则这些像素与实体边缘相关联,并被包括在最终的边缘图中。
  • 如果梯度幅度值低于较小的阈值,则像素被抑制并从最终边缘图中排除。
  • 梯度幅度在这两个阈值之间的所有其他像素都被标记为“弱”边缘(即,它们成为被包括在最终边缘图中的候选者)。
  • 如果“弱”像素连接到与实心边相关联的像素,则它们也会包含在最终的边贴图中。

C++:

// Canny edge detection
Mat edges;
Canny(img_blur, edges, 100, 200, 3, false);

Python:

# Canny Edge Detection
edges = cv2.Canny(image=img_blur, threshold1=100, threshold2=200) 

在这里插入图片描述

4. 总结

本文通过SobelCanny方法对图像进行边缘检测操作,从原理上讲解了Canny边缘检测实际上是如何使用Sobel算子来计算数值导数的。

Canny算法的稳健和灵活,甚至使用非最大值抑制和滞后阈值来最大限度地发挥优势,使得Canny边缘检测是执行边缘检测的首选和最广泛使用的方法。

  • Sobel(src, ddepth, dx, dy))
  • src input image.
  • ddepth output image depth, see combinations; in the case of 8-bit input images it will result in truncated derivatives.
  • dx order of the derivative x.
  • dy order of the derivative y.
  • Canny(image, threshold1, threshold2)
  • image 8-bit input image.
  • edges output edge map; single channels 8-bit image, which has the same size as image .
  • threshold1 first threshold for the hysteresis procedure.
  • threshold2 second threshold for the hysteresis procedure.

5. 参考资料

【1】ubuntu22.04@laptop OpenCV Get Started
【2】ubuntu22.04@laptop OpenCV安装
【3】ubuntu22.04@laptop OpenCV定制化安装

6. 补充

学习是一种过程,对于前面章节学习讨论过的,就不在文中重复了。

有兴趣了解更多的朋友,请从《ubuntu22.04@laptop OpenCV Get Started》开始,一个章节一个章节的了解,循序渐进。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/685712.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PyTorch 快速安装 - 基于 JupyterHub 并运行 K8s

PyTorch 快速安装 - 基于 JupyterHub 并运行 K8s 运行 PyTorch 可以直接逻辑运行、容器中运行、KubeFlow 中运行以及基于 JupyterHub(独立运行或运行在 K8s 之上)等多种模式。这里介绍运行在 K8s 上基于 JupyterHub 的 PyTorch 方法,这也是运…

基于边缘计算的智能家居能源管理系统

一、项目背景 随着智能家居设备的普及,能源消耗问题日益凸显。为了更有效地管理家庭能源使用,减少浪费,并可能实现能源自给自足,我们提出了基于边缘计算的智能家居能源管理系统 该系统能够实时监控和分析家庭能源消耗数据&#xf…

MySQL的日志

一:概述 (1)介绍 在任何一种数据库中,都会有各种各样的日志,记录着数据库工作的方方面面,以帮助数据库管理员追踪数据库曾经发生过的各种事件,MySQL也不例外。 (2)分类…

中断系统(单片机)

中断概念: 中断系统是为使CPU具有对外界紧急事件的实时处理能力而设置的。当中央处理机CPU正在处理某件事的时候外界发生了紧急事件请求,要求CPU暂停当前的工作,转而去处理这个紧急事件,处理完以后,再回到原来被中断的地方&#…

课时33:脚本交互_基础知识_shell登录解读

2.1.1 shell登录解读 学习目标 这一节,我们从 基础知识、简单实践、小结 三个方面来学习。 基础知识 shell配置文件 系统级别生效配置文件/etc/profile系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行/etc/profile.d/*.sh被/etc/profile文件调用&…

WordPress绑定,实现任意域名访问

编辑wp-config.php将以下代码插入define( WP_DEBUG 下一行: /* 自适应任意访问域名. */ define(WP_SITEURL, http:// . $_SERVER[HTTP_HOST]); define(WP_HOME, http:// . $_SERVER[HTTP_HOST]); 效果:wordpress会自适应任意解析到这个站点的域名&#x…

【精品】关于枚举的高级用法

枚举父接口 public interface BaseEnum {Integer getCode();String getLabel();/*** 根据值获取枚举** param code* param clazz* return*/static <E extends Enum<E> & BaseEnum> E getEnumByCode(Integer code, Class<E> clazz) {Objects.requireNonN…

【JavaScript】localStorage 和 sessionStorage

文章目录 1. localStorage和sessionStorage的概念localStoragesessionStorage 2. localStorage和sessionStorage的使用设置数据读取数据删除数据清空所有数据 3. localStorage和sessionStorage的应用场景localStoragesessionStorage 4. 安全性注意事项5. 总结 在前端开发中&…

CSS篇--transform

CSS篇–transform 使用transform属性实现元素的位移、旋转、缩放等效果 位移 // 语法 transform:translate(水平移动距离&#xff0c;垂直移动距离) translate() 如果只给一个值&#xff0c;表示x轴方法移动距离 单独设置某个方向的移动距离&#xff1a;translateX() transla…

Debezium发布历史133

原文地址&#xff1a; https://debezium.io/blog/2022/10/26/debezium-1-9-7-final-released/ 欢迎关注留言&#xff0c;我是收集整理小能手&#xff0c;工具翻译&#xff0c;仅供参考&#xff0c;笔芯笔芯. Debezium 1.9.7.Final Released October 26, 2022 by Chris Cranfo…

林浩然与杨凌芸的Java时光魔法:格式化历险记

林浩然与杨凌芸的Java时光魔法&#xff1a;格式化历险记 The Java Time Odyssey of Lin Haoran and Yang Lingyun: A Formatting Adventure 在编程世界的一隅&#xff0c;有一个名叫林浩然的程序员。他是个Java大侠&#xff0c;对代码世界的法则了如指掌&#xff0c;尤其擅长驾…

用HTML和CSS打造跨年烟花秀视觉盛宴

目录 一、程序代码 二、代码原理 三、运行效果 一、程序代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>跨年烟花秀</title><meta name"viewport" content"widthdevi…

HCIA-HarmonyOS设备开发认证V2.0-轻量系统内核基础-信号量semaphore

目录 一、信号量基本概念二、信号量运行机制三、信号量开发流程四、信号量接口五、代码分析&#xff08;待续...&#xff09;坚持就有收获 一、信号量基本概念 信号量&#xff08;Semaphore&#xff09;是一种实现任务间通信的机制&#xff0c;可以实现任务间同步或共享资源的…

[02] Vue指令(1)

目录 Vue中的常用指令内容渲染指令条件渲染指令事件绑定指令内联语句事件处理函数调用传参 Vue中的常用指令 概念&#xff1a;指令&#xff08;Directives&#xff09;是Vue提供的带有v- 前缀的特殊标签属性。 vue 中的指令按照不同的用途可以分为如下 6 大类&#xff1a; 内容…

Ubuntu学习笔记-Ubuntu搭建禅道开源版及基本使用

文章目录 概述一、Ubuntu中安装1.1 复制下载安装包路径1.2 将安装包解压到ubuntu中1.3 启动服务1.4 设置开机自启动 二、禅道服务基本操作2.1 启动&#xff0c;停止&#xff0c;重启&#xff0c;查看服务状态2.2 开放端口2.3 访问和登录禅道 卜相机关 卜三命、相万生&#xff0…

算法学习——LeetCode力扣二叉树篇7

算法学习——LeetCode力扣二叉树篇7 236. 二叉树的最近公共祖先 236. 二叉树的最近公共祖先 - 力扣&#xff08;LeetCode&#xff09; 描述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点…

正则表达式预查寻也称断言,限定左右相邻内容

正则表达式预查寻也称断言,限定左右相邻内容 正则表达式预查寻分为 4 种: 正向肯定预查: (?pattern) (?pattern)正向否定预查: (?!pattern) (?!pattern)反向肯定预查: (?<pattern) (?<pattern)反向否定预查: (?<!pattern) (?<!pattern) 比如: 匹配 babc…

揭开Markdown的秘籍:引用|代码块|超链接

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;Markdown指南、网络奇遇记 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. ⛳️Markdown 引用1.1 &#x1f514;引用1.2 &#x1f514;嵌套引用1.3 &…

中科院一区论文复现,改进蜣螂算法,Fuch映射+反向学习+自适应步长+随机差分变异,MATLAB代码...

本期文章复现一篇发表于2024年来自中科院一区TOP顶刊《Energy》的改进蜣螂算法。 论文引用如下&#xff1a; Li Y, Sun K, Yao Q, et al. A dual-optimization wind speed forecasting model based on deep learning and improved dung beetle optimization algorithm[J]. Ener…

从本次战疫,作为普通人可以学到的东西

前人不忘&#xff0c;后事之师。 从本次疫情的控制&#xff0c;可以学到什么&#xff1f; 早发现&#xff0c;早隔离&#xff0c;早识别&#xff0c;早就诊。 定位传染源&#xff0c;传播途径&#xff0c;传播方法&#xff0c;确定潜伏期&#xff0c;检测方法&#xff0c;确认…