ubuntu22.04@laptop OpenCV Get Started: 011_edge_detection

ubuntu22.04@laptop OpenCV Get Started: 011_edge_detection

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

1. 源由

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

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

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

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.jpg

0 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.jpg

0 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

增加两个新增阶段:

  1. 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边缘检测是执行边缘检测的首选和最广泛使用的方法。

  • 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.
  • 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》开始,一个章节一个章节的了解,循序渐进。

相关推荐
NAGNIP7 小时前
一文搞懂深度学习中的通用逼近定理!
人工智能·算法·面试
冬奇Lab8 小时前
一天一个开源项目(第36篇):EverMemOS - 跨 LLM 与平台的长时记忆 OS,让 Agent 会记忆更会推理
人工智能·开源·资讯
冬奇Lab8 小时前
OpenClaw 源码深度解析(一):Gateway——为什么需要一个"中枢"
人工智能·开源·源码阅读
AngelPP12 小时前
OpenClaw 架构深度解析:如何把 AI 助手搬到你的个人设备上
人工智能
宅小年12 小时前
Claude Code 换成了Kimi K2.5后,我再也回不去了
人工智能·ai编程·claude
九狼12 小时前
Flutter URL Scheme 跨平台跳转
人工智能·flutter·github
ZFSS12 小时前
Kimi Chat Completion API 申请及使用
前端·人工智能
天翼云开发者社区13 小时前
春节复工福利就位!天翼云息壤2500万Tokens免费送,全品类大模型一键畅玩!
人工智能·算力服务·息壤
知识浅谈13 小时前
教你如何用 Gemini 将课本图片一键转为精美 PPT
人工智能
Ray Liang14 小时前
被低估的量化版模型,小身材也能干大事
人工智能·ai·ai助手·mindx