<图像处理> Canny边缘检测

2023-11-04

Canny边缘检测

边缘检测评判标准:

  1. 低错误率:在图像中精确地检测出尽可能多的边缘,并尽量减少漏检和误检;
  2. 高定位精度:检测出的边缘点应该精确地定位于边缘的中心;
  3. 边缘唯一性:图像中的每条边缘只被标记一次,同时避免由于噪声干扰产生虚假边缘;

Canny边缘检测的四个步骤

1、平滑处理

所有边缘都极易受到噪声的干扰,为了防止因噪声引起的错误检测,应对图像进行平滑处理滤除噪声,常用的低通滤波器为高斯滤波器,见 c v : : G a u s s i a n B l u r ( ) cv::GaussianBlur() cv::GaussianBlur()算子。

2、梯度检测

梯度是图像灰度值变化剧烈的地方,它可以通过梯度检测算子Roberts、Prewitt、Sobel等得到。Canny中用的梯度检测算子为Sobel算子,它由两个模板组成:
G x = [ − 1 0 1 − 2 0 2 − 1 0 1 ] G_x=\begin{bmatrix} -1 & 0&1\\ -2 & 0&2 \\-1&0&1\\ \end{bmatrix} Gx= 121000121
G y = [ 1 2 1 0 0 0 − 1 − 2 1 ] G_y=\begin{bmatrix} 1 & 2&1\\ 0 & 0&0 \\-1 &-2&1\\ \end{bmatrix} Gy= 101202101
把这两个模板分别与图像进行卷积,得到水平方向的梯度 G x G_x Gx和垂直方向的梯度 G y G_y Gy,最终的梯度幅值 G G G由欧几里距离(L2范数)求得:
G = G x 2 + G y 2 G=\sqrt{G_x^2+G_y^2} G=Gx2+Gy2
由于平方和平方根开销较大,为了简化计算,梯度值也可由曼哈顿距离(L1范数)求得:
G = ∣ G x ∣ + ∣ G y ∣ G=|G_x|+|G_y| G=Gx+Gy
梯度辐角 θ \theta θ为:
θ = a r c t a n ( ∣ G y ∣ ∣ G x ∣ ) \theta=arctan(\frac {|G_y|}{|G_x|}) θ=arctan(GxGy)

3、NMS非极大值抑制

这一步骤的目的是使边缘细化。非极大值抑制可以抑制那些局部不是梯度幅值最大的边缘,而保留下来的具有局部最大值的像素点正是灰度值变化最剧烈的地方。这里的局部最大值由 3 ∗ 3 3*3 33的邻域内梯度方向上比较梯度值得到。

  • 当梯度方向为 θ = 0 ° \theta=0° θ=时,在 3 ∗ 3 3*3 33的邻域内,当前像素与左右两个像素的梯度值进行比较,如果当前像素的幅值为最大时,则保留,否则剔除;
  • 当梯度方向为 θ = 90 ° \theta=90° θ=90°时,在 3 ∗ 3 3*3 33的邻域内,当前像素与上下两个像素的梯度值进行比较,如果当前像素的幅值为最大时,则保留,否则剔除;
  • 当梯度方向为 θ = 135 ° \theta=135° θ=135°时,在 3 ∗ 3 3*3 33的邻域内,当前像素与左上角与右下角两个像素的梯度值进行比较,如果当前像素的幅值为最大时,则保留,否则剔除;
  • 当梯度方向为 θ = 45 ° \theta=45° θ=45°时,在 3 ∗ 3 3*3 33的邻域内,当前像素与左下角和右上角两个像素的梯度值进行比较,如果当前像素的幅值为最大时,则保留,否则剔除;

4、滞后阈值处理

由于上一步得到的边缘仍有一小部分由于噪声或者颜色变化影响而不是真正的边缘,虽然他们的梯度幅值也满足局部最大值,但是与其他边缘相比,它们的梯度幅值较小。因此,Canny算法采用双阈值的方法,设置高、低两个阈值,通过判断:

  • 当梯度幅值大于高阈值时,则该边缘为强边缘
  • 当梯度幅值小于低阈值时,则该边缘需要被剔除
  • 当梯度幅值介于高低阈值之间时,则该边缘为弱边缘

强边缘需要被保留下来,弱边缘需要采用边缘跟踪的方法来判断是否为真正的边缘,在弱边缘的 3 ∗ 3 3*3 33的邻域内,如果有强边缘,则说明该若边缘属于这个强边缘,则需要被保留,否则被剔除。

OpenCV算子

void cv::Canny(InputArray image, OutputArray edges, double threshold1, double threshold2, int apertureSize = 3, bool L2gradient = false)

Parameters
image				8-bit输入图像;
edges				输出边缘图像,8-bit单通道图像;
threshold1			低阈值;
threshold2			高阈值;
apertureSize		Sobel算子滤波器核尺寸,默认3;
L2gradient			表示计算梯度幅值时是否使用L2范数,默认false,即采用L1范数;

参考

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

<图像处理> Canny边缘检测 的相关文章

  • 如何将 Mat (opencv) 转换为 INDArray (DL4J)?

    我希望任何人都可以帮助我解决这个任务 我正在处理一些图像分类并尝试将 OpenCv 3 2 0 和 DL4J 结合起来 我知道DL4J也包含Opencv 但我认为它没什么用 谁能帮我 如何转换成 INDArray 我尝试阅读一些问题here
  • 是否可以在 PyScript 中使用 OpenCV 模块?

    我想使用 opencv 模块 但无法导入 OpenCV 那么我该如何解决这个问题呢 顺便说一句 Pyodide 支持 OpenCV 示例代码 https i stack imgur com ahwex jpg 尚不支持 OpenCV 此时O
  • 如何在 cv2.VideoWriter 中使用 FPS 参数?

    好的 所以我正在制作视频 我想确切地知道如何使用 FPS 参数 它是一个浮点数 所以我假设这是我想要的每帧之间的间隔 你能给个例子吗 我只想知道视频会如何随着 FPS 参数值的变化而变化 因为我制作的视频现在太快了 谢谢 确实只是这样 fr
  • 为什么Android的ImageReader类这么慢?

    我尝试了适用于 Android 3 4 1 的全新 OpenCVJavaCamera2View但它太慢了 仅显示相机视图约 15 fps 当我尝试较旧的JavaCameraView相反 它给了我很好的结果 30fps 这是我相机的极限 我想
  • OpenCV SIFT 描述符关键点半径

    我正在深入研究OpenCV的SIFT描述符提取的实现 https github com Itseez opencv blob master modules nonfree src sift cpp 我发现了一些令人费解的代码来获取兴趣点邻域
  • OpenCV 2.2 和多 CPU - opencv_haartraining.exe 是多线程的吗?

    我在 VS 2010 上构建了 OpenCV 2 2 启用了 TBB 3 支持 我确保所有项目都有正确的 tbb lib 目录 并将 tbb lib 列为依赖项 通过隐藏 tbb dll 进行验证 果然 haartraining exe 抱
  • opencv水印周围的轮廓

    我想在图像中的水印周围画一个框 我已经提取了水印并找到了轮廓 但是 不会在水印周围绘制轮廓 轮廓是在我的整个图像上绘制的 请帮我提供正确的代码 轮廓坐标的输出为 array 0 0 0 634 450 634 450 0 dtype int
  • 从扫描文档中提取行表 opencv python

    我想从扫描的表中提取信息并将其存储为 csv 现在我的表提取算法执行以下步骤 应用倾斜校正 应用高斯滤波器进行去噪 使用 Otsu 阈值进行二值化 进行形态学开局 Canny 边缘检测 进行霍夫变换以获得表格行 去除重复行 10像素范围内相
  • 查找具有不同强度/亮度的相似图像

    假设我有如下图像 我可以选择什么来比较两个图像之间的相似度 显然它们是相同的图像 只是亮度不同 我找不到任何可行的方法 目前我最好的选择是训练 cnn 或自动编码器并比较输出的特征向量 但这似乎有点矫枉过正 任何提示将不胜感激 相当强大的工
  • 如何使用 AdaBoost 进行特征选择?

    我想使用 AdaBoost 从大量 100k 中选择一组好的特征 AdaBoost 的工作原理是迭代功能集并根据功能的执行情况添加功能 它选择对现有特征集错误分类的样本表现良好的特征 我目前正在 Open CV 中使用CvBoost 我得到
  • 让网络摄像头在 OpenCV 中工作

    我正在尝试让我的网络摄像头在 Windows 7 64 位中的 OpenCV 版本 2 2 中捕获视频 但是 我遇到了一些困难 OpenCV 附带的示例二进制文件都无法检测到我的网络摄像头 最近我发现这篇文章表明答案在于重新编译一个文件 o
  • 未加载库:@rpath/libopenblasp-r0.2.19.dylib

    我应该如何解决这个问题 Monas MacBook Pro 02 02 mona python Python 3 6 1 Anaconda custom x86 64 default May 11 2017 13 04 09 GCC 4 2
  • 旋转矩阵openCV

    我想知道如何找到框架中一组特征的旋转矩阵 我会更具体 我有 2 个具有 20 个特征的帧 假设第 1 帧和第 2 帧 我可以估计两个帧中特征的位置 例如 假设位置 x y 处的某个第 1 帧特征 并且我确切地知道它在哪里 所以假设为 x y
  • 相机校准:如何正确进行

    我正在尝试使用棋盘格通过众所周知的张氏方法进行校准 然后进行捆绑调整 该方法在 Matlab 和 OpenCV 中都可用 有很多经验指南 但从我个人的经验来看 准确性是相当随机的 它有时可能非常好 但有时也可能非常糟糕 实际上 只需将棋盘放
  • 如何用OpenCV解决图像处理相机IO延迟

    我有一个 OpenCV 程序 其工作原理如下 VideoCapture cap 0 Mat frame while true cap gt gt frame myprocess frame 问题是如果myprocess耗时较长 超过相机的I
  • 如何在python 3.8中安装opencv-python

    我在 pycharm 中安装 opencv python 时遇到问题 打开 pycharm 后 我单击 设置 然后单击 项目解释器 单击 并搜索正确的模块 我开始安装 但失败了 Could not find a version that s
  • Alpha 混合可消除图像中的接缝

    我缝合了两张图像 但在最终图像中存在可见的接缝 我正在尝试使用阿尔法混合去除那条接缝 我知道 Alpha 混合是使用cvAddweight 函数 但在此函数参数是两个图像 alpha beta gamma和目的地 我正在服用gamma 0
  • Python 2.7/OpenCV 3.3: cv2.initUn DistorifyMap 中出现错误。不显示不扭曲的校正图像

    我想扭曲并校正我的立体图像 为此 我在 Python 2 7 中使用了 Opencv 3 3 我使用的代码是 import cv2 import numpy as np cameraMatrixL np load mtx left npy
  • 结果显示图像上有衬里

    我正在使用 opencv 和 android ndk 下面是我的 jni 代码 void Vignete Mat img1 Mat img2 Mat out resize img1 img1 img2 size img1 convertTo
  • 使用 Brew 安装 OpenCV 永远不会完成

    所以我尝试使用 Homebrew 安装 opencv 但它不起作用 我用了brew tap homebrew science进而brew install opencv发生的情况是 gt Installing opencv from home

随机推荐

  • TCP的三次握手及四次挥手总结(从抓包角度理解)

    目录 TCP报文首部 TCP连接 传输及断开过程图 TCP状态图 三次握手过程理解 四次挥手过程理解 从抓包来理解TCP建立连接 数据传输以及断开连接的过程 建立连接过程 数据传输过程 连接断开过程 为什么连接的时候是三次握手 关闭的时候却
  • Keras查看model weights .h5 文件的内容

    Keras的模型是用hdf5存储的 如果想要查看模型 keras提供了get weights的函数可以查看 for layer in model layers weights layer get weights list of numpy
  • 多进程浏览器框架

    为什么浏览器采用多进程模型 转载于 http www wtoutiao com p s57age html Google Chrome源码剖析 一 多线程模型 转载于 http www ha97 com 2908 html 主流浏览器多进程
  • 【广州华锐互动】无人值守变电站AR虚拟测控平台

    无人值守变电站AR虚拟测控平台是一种基于增强现实技术的电力设备巡检系统 它可以利用增强现实技术将虚拟信息叠加在真实场景中 帮助巡检人员更加高效地完成巡检任务 这种系统的出现 不仅提高了巡检效率和准确性 还降低了巡检成本和风险 传统的变电站巡
  • TPM功能介绍

    文章来源 TPM功能介绍 百度文库 http wenku baidu com link url bQMQyb0A3gto0CCC2CN5ojpUrgHsh8BMXmejpFaqLS52v 013bXPHoRr36r0F0UrgPr8U6rv
  • MATLAB——FFT(快速傅里叶变换)

    基础知识 FFT即快速傅里叶变换 利用周期性和可约性 减少了DFT的运算量 常见的有按时间抽取的基2算法 DIT FFT 按频率抽取的基2算法 DIF FFT 1 利用自带函数fft进行快速傅里叶变换 若已知序列 x 4 3
  • 利用ChatGPT协助编写单元测试

    ChatGPT自从2022年推出以来受到很多人的喜欢 此篇博客重点介绍如何修改Prompt来自动生成较理想的单元测试 如下图所示的一段代码 该class中有一个public方法toLocale 其余都是private方法 toLocale
  • 编写代码的几个tip

    使用的大多是MVC的模式 那么视图就只管视图 逻辑就只管逻辑 一个自定义的cell 上面放了一个button button的点击事件用一个delegate在viewcontroller中来实现 比如先要变化cell的样式 那么代理方法中 不
  • 攻防世界WEB入门

    1 view source X老师让小宁同学查看一个网页的源代码 但小宁同学发现鼠标右键好像不管用了 WP 按F12即可在elements中看到flag 2 robots X老师上课讲了Robots协议 小宁同学却上课打了瞌睡 赶紧来教教小
  • ​LeetCode刷题实战214:最短回文串

    算法的重要性 我就不多说了吧 想去大厂 就必须要经过基础知识和业务逻辑面试 算法面试 所以 为了提高大家的算法能力 这个公众号后续每天带大家做一道算法题 题目就从LeetCode上面选 今天和大家聊的问题叫做 最短回文串 我们先来看题面 h
  • UE4 UMG中使用富文本

    UE4 UMG中使用富文本 一 新建DateTable 二 添加字体样式 注意 第一个RowName必须为Default 字体样式必须赋值 否则会乱码 我们将Default的字体改为白色 Red字体改为红色 字号改小 三 使用 拖一个富文本
  • serverTimezone设置

    在安装完mysql第一次使用IDEA进行数据库连接发现 You must configure either the server or JDBC driver via the serverTimezone configuration pro
  • uview2.0封装网络请求(微信小程序最新登录方式)

    一 网络请求和相应拦截器 此vm参数为页面的实例 可以通过它引用vuex中的变量 module exports vm gt 初始化请求配置 uni u http setConfig config gt config baseURL http
  • 计算机二级C语言三天能过吗,学工干货丨如何三天通过计算机二级

    原标题 学工干货丨如何三天通过计算机二级 不可能的 想都不要想 三天怎么可能过 不信你问考完了的 他们马上就可以 进行计算机二级考试成绩查询啦 计算机二级是什么 计算机二级怎么考 迷惘 彷徨 别怕 今天学工菌来助攻 考生在考后50个工作日
  • 博客园自定义主题代码

    发一下好看的 要开通js权限 皮肤用simple memory 最好禁用模板 侧边栏
  • 基于小脑模型神经网络的轨迹跟踪研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现 1 概述 1 在对人类神经学的研究中 得知它由一些神
  • class加载过程

    loading class文件 从硬盘 加载到 内存 linking 1 verification 校验 检查满不满足class文件的格式 2 preparation 将 静态变量 赋默认值 默认值是0 3 resolution 将 常量池
  • Code Embedding研究系列11-ContraFlow

    Path Sensitive Code Embedding via Contrastive Learning for Software Vulnerability Detection 一 引言 1 1 现有方法及其局限 1 2 作者的解决方
  • 24模型微调(finetune)

    一 Transfer Learning Model Finetune 1 1 Transfer Learning Transfer Learning 机器学习分支 研究源域 source domain 的知识如何应用到目标域 targetd
  • <图像处理> Canny边缘检测

    Canny边缘检测 边缘检测评判标准 低错误率 在图像中精确地检测出尽可能多的边缘 并尽量减少漏检和误检 高定位精度 检测出的边缘点应该精确地定位于边缘的中心 边缘唯一性 图像中的每条边缘只被标记一次 同时避免由于噪声干扰产生虚假边缘 Ca