kongen kongen
首页
导航站
  • 学习教程

    • Opencv教程
    • C++基础教程
    • C++_Primer教程
    • CUDA编程
  • Opencv
  • CNN
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 面试题库

    • HTML
    • CSS
    • jQuery
    • Vue
    • 零碎
  • 面试心得

    • 杂言碎语
  • 十架道路

    • 十架七言系列
    • 基督徒生活观
    • 上帝的蓝图
  • 摘抄收录

    • ☆ 励志鸡汤
    • ❀ 人间烟火
  • 读书笔记

    • 《小狗钱钱》
    • 《穷爸爸富爸爸》
    • 《聪明人使用方格笔记本》
  • 学习
  • 面试
  • 心情杂货
  • 友情链接
关于
  • 网站
  • 资源
  • Vue资源
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Kongen

你好呀(✪ω✪)
首页
导航站
  • 学习教程

    • Opencv教程
    • C++基础教程
    • C++_Primer教程
    • CUDA编程
  • Opencv
  • CNN
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 面试题库

    • HTML
    • CSS
    • jQuery
    • Vue
    • 零碎
  • 面试心得

    • 杂言碎语
  • 十架道路

    • 十架七言系列
    • 基督徒生活观
    • 上帝的蓝图
  • 摘抄收录

    • ☆ 励志鸡汤
    • ❀ 人间烟火
  • 读书笔记

    • 《小狗钱钱》
    • 《穷爸爸富爸爸》
    • 《聪明人使用方格笔记本》
  • 学习
  • 面试
  • 心情杂货
  • 友情链接
关于
  • 网站
  • 资源
  • Vue资源
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • OpenCV简介

  • OpenCV中的 Gui特性

  • 核心操作

  • OpenCV中的图像处理

    • 改变颜色空间
    • 图像的几何变换
    • 图像阈值
    • 图像滤波
    • 形态变换
    • 图形梯度
    • Canny边缘检测
      • 目标:
      • 理论
        • 1. 这是一个多阶段算法,我们将了解其中的每个阶段。
        • 2. 降噪
        • 3. 计算图像的强度梯度
        • 4. 非极大值抑制
        • 5. 滞后阈值
      • OpenCV中的Canny边缘检测
    • 图像金字塔
    • 轮廓:入门
    • 轮廓特征
    • 轮廓属性
    • 轮廓:更多函数
    • 轮廓:层次结构
    • 直方图1:查找,绘画,分析
    • 直方图2:均衡直方图
    • 直方图3:2D直方图
    • 反投影直方图
    • 傅里叶变换
    • 模板匹配
    • 霍夫线变换
    • 霍夫圆变换
    • 基于GrabCut算法的交互式前景提取
    • 基于分水岭算法的图像分割
  • 特征检测和描述

  • 视频分析

  • 相机校准和3D重建

  • 机器学习

  • 计算摄影

  • 目标检测

  • Opencv基础原理
  • OpenCV中的图像处理
kongen
2019-06-11
目录

Canny边缘检测

# 目标:

  • Canny边缘检测的概念
  • OpenCV的功能:cv.Canny()

# 理论

Canny边缘检测是一种流行的边缘检测算法,它是由John F. Canny开发的。

# 1. 这是一个多阶段算法,我们将了解其中的每个阶段。

# 2. 降噪

由于边缘检测易受图像中的噪声影响,因此第一步是使用5x5高斯滤波器去除图像中的噪声。我们在之前的章节中已经看到了这一点。

# 3. 计算图像的强度梯度

然后在水平和垂直方向上用Sobel核对平滑后的图像进行滤波,以获得水平方向($$ G_{x} $$)和垂直方向($$ G_{y} $$)的一阶导数。从这两个图像中,我们可以找到每个像素的边缘梯度和方向,如下所示:

$$ Edge_Gradient\left ( G \right )= \sqrt{G_{x}^{2}+G_{y}^{2}} $$

$$ Angle\left ( \theta \right )= tan^{-1}\left ( \frac{G_{y}}{G_{x}} \right ) $$

渐变方向始终垂直于边缘。梯度方向被归为四类:垂直,水平,和两个对角线。

# 4. 非极大值抑制

在获得梯度的大小和方向之后,完成图像的全扫描以去除可能不构成边缘的任何不需要的像素。为此,在每个像素处,检查像素是否是其在梯度方向上的邻域中的局部最大值。检查下图:

image24

A点位于边缘(垂直方向)。渐变方向与边缘垂直。B点和C点处于梯度方向。因此,用点B和C检查点A,看它是否形成局部最大值。如果是这样,则考虑下一阶段,否则,它被抑制(置零)。

简而言之,你得到的结果是具有“细边”的二进制图像。

# 5. 滞后阈值

这个阶段决定哪些边缘都是边缘,哪些边缘不是边缘。为此,我们需要两个阈值,minVal和maxVal。强度梯度大于maxVal的任何边缘肯定是边缘,而minVal以下的边缘肯定是非边缘的,因此被丢弃。位于这两个阈值之间的人是基于其连通性的分类边缘或非边缘。如果它们连接到“可靠边缘”像素,则它们被视为边缘的一部分。否则,他们也被丢弃。见下图: image25 边缘A高于maxVal,因此被视为“确定边缘”。虽然边C低于maxVal,但它连接到边A,因此也被视为有效边,我们得到完整的曲线。但边缘B虽然高于minVal并且与边缘C的区域相同,但它没有连接到任何“可靠边缘”,因此被丢弃。所以我们必须相应地选择minVal和maxVal才能获得正确的结果。 假设边是长线,这个阶段也会消除小像素噪声。 所以我们最终得到的是图像中的强边缘。

# OpenCV中的Canny边缘检测

OpenCV将以上所有步骤放在单个函数cv.Canny()中。我们将看到如何使用它。第一个参数是我们的输入图像。第二个和第三个参数分别是我们的minVal和maxVal。第三个参数是aperture_size,它是用于查找图像渐变的Sobel卷积核的大小。默认情况下它是3。最后一个参数是L2gradient,它指定用于查找梯度幅度的等式。如果它是True,它使用上面提到的更准确的等式,否则它使用这个函数:$$ Edge_Gradient\left ( G \right )= \left | G_{x} \right |+\left | G_{y} \right | $$。默认情况下,它为False。

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt

img = cv.imread('messi5.jpg',0)
edges = cv.Canny(img,100,200)

plt.subplot(121),plt.imshow(img,cmap = 'gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(edges,cmap = 'gray')
plt.title('Edge Image'), plt.xticks([]), plt.yticks([])

plt.show()
1
2
3
4
5
6
7
8
9
10
11
12
13

窗口将如下图显示: image26

编辑 (opens new window)
图形梯度
图像金字塔

← 图形梯度 图像金字塔→

最近更新
01
附录L_CUDA底层驱动API
02-08
02
附录K_CUDA计算能力
02-08
03
附录J纹理获取
02-08
更多文章>
Theme by Vdoing | Copyright © 2024-2025 Kongen | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×