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)分类…

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

枚举父接口 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…

CSS篇--transform

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

林浩然与杨凌芸的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 的两个节点…

揭开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…

php基础学习之可变函数(web渗透测试关键字绕过rce和回调函数)

可变函数 看可变函数的知识点之前&#xff0c;蒟蒻博主建议你先去看看php的可变变量&#xff0c;会更加方便理解&#xff0c;在本篇博客中的第五块知识点->php基础学习之变量-CSDN博客 描述 当一个变量所保存的值刚好是一个函数的名字&#xff08;由函数命名规则可知该值必…

anomalib1.0学习纪实-续1:增加新算法

0、基本信息 现在我要增加一个新算法&#xff1a;DDAD 他的代码&#xff0c;可以在github中找到&#xff1a;GitHub - arimousa/DDAD 一、基础操作&#xff1a; 1、修改anomalib\src\anomalib\models\__init__.py 我增加的第33行和61行&#xff0c; 2、 增加ddad文件夹和文…

Sora和Pika,RunwayMl,Stable Video对比!网友:Sora真王者,其他都是弟

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;所以创建了“AI信息Gap”这个公众号&#xff0c;专注于分享AI全维度知识…

《区块链公链数据分析简易速速上手小册》第1章:区块链基础(2024 最新版)

文章目录 1.1 区块链技术概览&#xff1a;深入探究与实用案例1.1.1 区块链的核心概念1.1.2 重点案例&#xff1a;供应链管理1.1.3 拓展案例 1&#xff1a;数字身份验证1.1.4 拓展案例 2&#xff1a;智能合约在房地产交易中的应用 1.2 主流公链介绍1.2.1 公链的核心概念1.2.2 重…

Sora:将文本转化为视频的创新之旅

一.能力 我们正致力于让 AI 掌握理解和模拟物理世界动态的能力&#xff0c;旨在培养能够协助人们解决现实世界互动问题的模型。 介绍 Sora——我们开发的文本到视频转换模型。Sora 能够根据用户的输入提示&#xff0c;生成最长达一分钟的高质量视频内容。 目前&#xff0c;Sora…

配置oracle连接管理器(cman)

Oracle Connection Manager是一个软件组件&#xff0c;可以在oracle客户端上指定安装这个组件&#xff0c;Oracle连接管理器代理发送给数据库服务器的请求&#xff0c;在连接管理器中&#xff0c;我们可以通过配置各种规则来控制会话访问。 简而言之&#xff0c;不同于专用连接…

Qt for android : Qt6.6.2 搭建 环境

环境说明 参考Qt助手: Assistant 6.6.2 (MinGW 11.2.0 64-bit) ***Gradle : Gradle wrapper, version 8.3***JDK11 SDK Tools / NDK 25.1.8937393 参考 Qt For Android : Qt5.13.1 Qt for android: Qt6.4搭建环境遇到的几个问题