在Unity实现Canny边缘检测
基于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边缘检测相关推荐
- OpenCV 笔记(03)— 读取视频、通过摄像头采集视频、采集视频 canny 边缘检测
我们本节学习如何利用 OpenCV 中的 VideoCapture 类,来对视频进行读取显示,以及调用摄像头. VideoCapture 它提供了从摄像机或视频文件捕获视频的 C++ 接口, 作用是从 ...
- OpenCV 笔记(02)— 图像显示、保存、腐蚀、模糊、canny 边缘检测(imread、imshow、namedWindow、imwrite)
OpenCV 提供两种用户界面选项: 基于原生用户界面的基本界面,适用于 Mac OS X 的 cocoa 或 carbon,以及适用于 Linux 或 Windows 用户界面的 GTK ,这些界面 ...
- OpenCV+python:Canny边缘检测算法
1,边缘处理 图像边缘信息主要集中在高频段,通常说图像锐化或检测边缘,实质就是高频滤波.我们知道微分运算是求信号的变化率,具有加强高频分量的作用. 在空域运算中来说,对图像的锐化就是计算微分.由于数字 ...
- Python,Opencv cv2.Canny()边缘检测
Python,Opencv的Canny边缘检测 1. 效果图 2. 源码 参考 这篇博客将介绍Canny边缘检测的概念,并利用cv2.Canny()实现边缘检测: Canny边缘检测是一种流行的边缘检 ...
- 【OpenCV 】Sobel 导数/Laplace 算子/Canny 边缘检测
canny边缘检测见OpenCV [七]----边缘提取算子(图像边缘提取)--canny算法的原理及实现 1 Sobel 导数 1.1.1 原因 上面两节我们已经学习了卷积操作.一个最重要的卷积运算 ...
- python边缘检测代码_python Canny边缘检测算法的实现
图像边缘信息主要集中在高频段,通常说图像锐化或检测边缘,实质就是高频滤波.我们知道微分运算是求信号的变化率,具有加强高频分量的作用.在空域运算中来说,对图像的锐化就是计算微分.对于数字图像的离散信号, ...
- opencv Canny边缘检测用法
<span style="color:#000080">1. cv2.Canny(image, threshold1, threshold2[, edges[, ape ...
- python opencv 边缘检测_opencv-python-学习笔记十四(Canny边缘检测)
原理 Canny边缘检测是一种常用的边缘检测算法.由 John F. Canny提出 这是一个多阶段的算法,我们将经历每个阶段. 1.降低噪音 由于边缘检测容易受到图像中噪声的影响,第一步是用5x5高 ...
- 利用Canny边缘检测算子进行边缘检测的原理及OpenCV代码实现
图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 Canny算子是John Canny在1986年 ...
最新文章
- C语言中auto,register,static,const,volatile的区别
- Centos 6.3 x86_64安装与配置bacula
- Silverlight实例_人立方
- 使用fliter实现ie下css中rgba的效果
- python批量识别图片中文字_利用Python批量进行图片文字识别
- k-gram 拼写校正 java_拼写纠错-基于lucene-ngram实现拼写纠错
- C#打造自己的文件浏览器
- 我密集面试了若干位Java后端的候选人,给广大程序员的一点建议
- 运行tuxedo自带例子simpapp,测试tuxedo安装
- java mvc 源码分析_SpringMVC 源码解读笔记
- ibatis 存储过程 结果集 map_大数据之MapReduce shuffle过程
- !DOCTYPE标签的定义与用法
- 如何将Blocs v2项目迁移到Blocs v3?
- nmake的调用方法
- “《三国演义》人物出场统计“实例讲解
- elasticsearch 出现yellow 分片有unassigned现象原因
- Pytorch 锚框
- 一元三次方程通用求解方法
- 开放云将使业务焕然一新
- 职业操盘手的止损法则
热门文章
- 【PP-2】定义生产调度员
- Linus 大神的在家办公经验(他也撸猫)
- luoguP2711 小行星
- 计算机文化基础案例教程第三版答案,计算机文化基础案例教程教学课件作者第3版谭宁教学课件素材排骨做法.doc...
- win10加装机械硬盘卡_以微软的技术实力,win10还会出现硬盘100%占用的问题,为什么呢...
- android-23是什么手机,Android 8.1!首款helio P23/MT6763T手机曝光!
- ubuntu的学习记录-安装vmtols,更换软件源,开启远程服务
- FFmpeg - Windows下使用MSYS2和VS编译FFmpeg
- Python爬虫——Urllib
- 能耗指标与数据中心规模-孙长青