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.hqwc.cn/news/471336.html

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

相关文章

开源PDF工具 Apache PDFBox 认识及使用(知识点+案例)

文章目录 前言源码获取一、认识PDFBox二、导入依赖三、基础功能demo1:读取pdf所有内容demo2:读取所有页内容(分页)demo3:添加页眉、页脚demo4:添加居中45文字水印demo5:添加图片到右上角 参考文…

IMX6ULL移植U-Boot 2022.04

目录 目录 1.编译环境以及uboot版本 2.默认编译测试 3.uboot中新增自己的开发板 3.编译测试 4.烧录测试 5.patch文件 1.编译环境以及uboot版本 宿主机Debian12u-boot版本lf_v2022.04 ; git 连接GitHub - nxp-imx/uboot-imx: i.MX U-Boot交叉编译工具gcc-arm-10.3-2021.0…

磁盘database数据恢复: ddrescue,dd和Android 设备的数据拷贝

ddrescue和dd 区别: GNU ddrescue 不是 dd 的衍生物,也与 dd 没有任何关系 除了两者都可用于将数据从一台设备复制到另一台设备。 关键的区别在于 ddrescue 使用复杂的算法来复制 来自故障驱动器的数据,尽可能少地造成额外的损坏。ddrescue…

C 语言 devc++ 使用 winsock 实现 windows UDP 局域网发送消息

U参考来源 U 这里移植到windows 上 &#xff0c;使用 devc 开发。 服务端代码 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <winsock2.h>int main() {WORD sockVersion MAKEWORD(2, 2);WSAD…

2024年【危险化学品经营单位安全管理人员】考试报名及危险化学品经营单位安全管理人员考试资料

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 危险化学品经营单位安全管理人员考试报名是安全生产模拟考试一点通总题库中生成的一套危险化学品经营单位安全管理人员考试资料&#xff0c;安全生产模拟考试一点通上危险化学品经营单位安全管理人员作业手机同步练习…

二叉树相关OJ题

创作不易&#xff0c;感谢三连&#xff01;&#xff01; 一、选择题 1、某二叉树共有 399 个结点&#xff0c;其中有 199 个度为 2 的结点&#xff0c;则该二叉树中的叶子结点数为&#xff08; &#xff09; A.不存在这样的二叉树 B.200 C.198 D.199解析&#xff1a;选B&…

模拟算法总结(Java)

目录 模拟算法概述 练习 练习1&#xff1a;替换所有的问号 练习2&#xff1a;提莫攻击 练习3&#xff1a;Z字形变换 模拟算法概述 模拟&#xff1a;根据题目要求的实现过程进行编程模拟&#xff0c;即题目要求什么就实现什么 解决这类题目&#xff0c;需要&#xff1a; 1…

canal监听binlog记录业务数据的变更;canalAdmin对instance做web配置

概述 平时在开发中会通过logback打印一些开发日志&#xff0c;有时也会需要记录一些业务日志&#xff0c;简单的就直接用log记录一下&#xff0c;但是系统中需要记录日志的地方越来越多时&#xff0c;不能每个地方都写一套log记录&#xff1b; 由于平常用的大多都是mysql&…

做一个AI 红包封面,会火起来吗?

支持文生图 输入图片提示词&#xff0c;即可生成图片。 支持图生图 体验地址 关注公众号&#xff1a;回复红包 &#xff0c;获取体验地址

《区块链公链数据分析简易速速上手小册》第10章:未来趋势和挑战(2024 最新版)

文章目录 10.1 区块链技术的发展方向10.1.1 基础知识10.1.2 重点案例&#xff1a;构建一个简单的智能合约步骤1: 创建智能合约步骤2: 部署智能合约步骤3: 使用Python与智能合约交互结语 10.1.3 拓展案例 1&#xff1a;探索 DeFi 应用准备工作实现步骤步骤1: 获取Compound市场数…

Peter算法小课堂—哈希与哈希表

额……字符串我们是第一次学&#xff0c;给大家铺一些基础的不能再基础的基础&#xff0c; 字符串比较大小 字符串大小的比较&#xff0c;不是以字符串的长度直接决定&#xff0c;而是从最左边第一个字符开始比较&#xff0c;大者为大&#xff0c;小者为小&#xff0c;若相等…

【白话前端】一篇文章区分js库和js框架

假定你选择自助游&#xff0c;你需要找不同服务商帮你解决吃住行的问题&#xff0c;这些服务商就是js库。你也可以选择旅行社&#xff0c;给你全解决&#xff0c;这是js框架。 JavaScript库和框架都是用于简化Web开发的工具&#xff0c;但它们之间有一些区别。 JavaScript库&a…