基于https://www.cnblogs.com/techyan1990/p/7291771.html的步骤实现Canny边缘检测

源文件下载地址:https://pan.baidu.com/s/1EB7L7YC29U5gQgT0RA84jQ

最终效果:

调整参数,改变描边效果

Canny边缘检测算法5个步骤:

1、使用高斯滤波器除去杂色。

2、计算梯度强度、梯度方向。

3、梯度强度非极大值抑制,细化边缘。

4、梯度强度双阈值检测。

5、抑制孤立的弱边缘,即移除未与强边缘连通的弱边缘。

步骤1:高斯滤波器使用《UnityShader入门精要》12章的高斯模糊相关代码和shader,对应文件:GaussianBlur.shader。

步骤2、3、4对应文件:CannyEdgeEetection.shader。

步骤5在CannyEdgeEetection.cs中的RemoveUnconnectPoints方法。

其中特别说明一下:

1、非极大值抑制:

(图片来自https://www.cnblogs.com/techyan1990/p/7291771.html)

uv数组对应顺序如下

假如梯度方向在(E,NE),也就是(0,1),那么负方向则是(W,SW),也就是(4,5),可以发现,总是相差4(正4或负4),根据这个规律,就可以省去多个if的判断。

2、双阈值检测的具体实现

使用堆栈实现深度优先算法,保留与强边缘连通的弱边缘,移除未与强边缘连通的弱边缘

实现过程:

1、遍历强边缘,强边缘入栈,进入2

2、Pop一个强边缘,遍历强边缘周围像素,如果强边缘中周围有弱边缘,就把这个弱边缘改为强边缘,并且把这个新强边缘入栈

3、重复2,直到栈为空,回到1

存在的问题,有待优化:

1、抑制孤立的弱边缘在cpu中实现,每帧执行的话,帧数大幅下降

2、当前使用高斯滤波,是整体模糊,可以改进为选择性模糊,使其更适合于保留边缘,除去杂色。

3、精度问题导致梯度方向不准确

以下图(10像素X10像素)为例,

原图:

​canny边缘检测后(正确效果):

这个图描边的最佳效果是竖线周围只有一像素的边围起来,但是以sobel算法,上下各两行像素,左右各1列像素

canny边缘检测后(实际效果):

x方向梯度强度

y方向梯度强度

梯度强度

梯度方向

理论上,边缘右上角的x方向梯度强度、y方向梯度强度是相同的,梯度方向是45,因为精度原因,右上角的x方向梯度强度是0.7874999,y方向梯度强度是0.7874998,梯度方向变成45.00066,因此,在非极大值抑制时,就产生偏差,其他3个角也如此。(右下角也有精度问题,但是刚好结果正确)

在Unity实现Canny边缘检测相关推荐

  1. OpenCV 笔记(03)— 读取视频、通过摄像头采集视频、采集视频 canny 边缘检测

    我们本节学习如何利用 OpenCV 中的 VideoCapture 类,来对视频进行读取显示,以及调用摄像头. VideoCapture 它提供了从摄像机或视频文件捕获视频的 C++ 接口, 作用是从 ...

  2. OpenCV 笔记(02)— 图像显示、保存、腐蚀、模糊、canny 边缘检测(imread、imshow、namedWindow、imwrite)

    OpenCV 提供两种用户界面选项: 基于原生用户界面的基本界面,适用于 Mac OS X 的 cocoa 或 carbon,以及适用于 Linux 或 Windows 用户界面的 GTK ,这些界面 ...

  3. OpenCV+python:Canny边缘检测算法

    1,边缘处理 图像边缘信息主要集中在高频段,通常说图像锐化或检测边缘,实质就是高频滤波.我们知道微分运算是求信号的变化率,具有加强高频分量的作用. 在空域运算中来说,对图像的锐化就是计算微分.由于数字 ...

  4. Python,Opencv cv2.Canny()边缘检测

    Python,Opencv的Canny边缘检测 1. 效果图 2. 源码 参考 这篇博客将介绍Canny边缘检测的概念,并利用cv2.Canny()实现边缘检测: Canny边缘检测是一种流行的边缘检 ...

  5. 【OpenCV 】Sobel 导数/Laplace 算子/Canny 边缘检测

    canny边缘检测见OpenCV [七]----边缘提取算子(图像边缘提取)--canny算法的原理及实现 1 Sobel 导数 1.1.1 原因 上面两节我们已经学习了卷积操作.一个最重要的卷积运算 ...

  6. python边缘检测代码_python Canny边缘检测算法的实现

    图像边缘信息主要集中在高频段,通常说图像锐化或检测边缘,实质就是高频滤波.我们知道微分运算是求信号的变化率,具有加强高频分量的作用.在空域运算中来说,对图像的锐化就是计算微分.对于数字图像的离散信号, ...

  7. opencv Canny边缘检测用法

    <span style="color:#000080">1. cv2.Canny(image, threshold1, threshold2[, edges[, ape ...

  8. python opencv 边缘检测_opencv-python-学习笔记十四(Canny边缘检测)

    原理 Canny边缘检测是一种常用的边缘检测算法.由 John F. Canny提出 这是一个多阶段的算法,我们将经历每个阶段. 1.降低噪音 由于边缘检测容易受到图像中噪声的影响,第一步是用5x5高 ...

  9. 利用Canny边缘检测算子进行边缘检测的原理及OpenCV代码实现

    图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 Canny算子是John Canny在1986年 ...

最新文章

  1. C语言中auto,register,static,const,volatile的区别
  2. Centos 6.3 x86_64安装与配置bacula
  3. Silverlight实例_人立方
  4. 使用fliter实现ie下css中rgba的效果
  5. python批量识别图片中文字_利用Python批量进行图片文字识别
  6. k-gram 拼写校正 java_拼写纠错-基于lucene-ngram实现拼写纠错
  7. C#打造自己的文件浏览器
  8. 我密集面试了若干位Java后端的候选人,给广大程序员的一点建议
  9. 运行tuxedo自带例子simpapp,测试tuxedo安装
  10. java mvc 源码分析_SpringMVC 源码解读笔记
  11. ibatis 存储过程 结果集 map_大数据之MapReduce shuffle过程
  12. !DOCTYPE标签的定义与用法
  13. 如何将Blocs v2项目迁移到Blocs v3?
  14. nmake的调用方法
  15. “《三国演义》人物出场统计“实例讲解
  16. elasticsearch 出现yellow 分片有unassigned现象原因
  17. Pytorch 锚框
  18. 一元三次方程通用求解方法
  19. 开放云将使业务焕然一新
  20. 职业操盘手的止损法则

热门文章

  1. 【PP-2】定义生产调度员
  2. Linus 大神的在家办公经验(他也撸猫)
  3. luoguP2711 小行星
  4. 计算机文化基础案例教程第三版答案,计算机文化基础案例教程教学课件作者第3版谭宁教学课件素材排骨做法.doc...
  5. win10加装机械硬盘卡_以微软的技术实力,win10还会出现硬盘100%占用的问题,为什么呢...
  6. android-23是什么手机,Android 8.1!首款helio P23/MT6763T手机曝光!
  7. ubuntu的学习记录-安装vmtols,更换软件源,开启远程服务
  8. FFmpeg - Windows下使用MSYS2和VS编译FFmpeg
  9. Python爬虫——Urllib
  10. 能耗指标与数据中心规模-孙长青