代码:

butub1/Edge-detection​github.com

哭了,实现了的一个赞没有,上面讲理论的一堆赞......................

Catalog

  1. Filters
  2. Noise
  3. Dark light
  4. HedHED(Holistically-Nested Edge Detection ( 整体嵌套 边缘检测 ))
  5. ~~Corrosion & Expansion(腐蚀膨胀) 划掉,没实现

Filters

prewitt:

(点击放大,查看细节)

可以看出 x, y 分别提取x方向和y方向的边缘

使用绝对值(l1范数)和使用l2范数效果上看是差不多的,所以很多时候大家直接使用绝对值来加速计算。stardard是skimage的接口.

prewitt两个算子对于横向和纵向的边缘很敏感,检测墙壁边缘的话,非常合适。

对于圆形或者说弧形边缘的提取也不错,但实际上laplace算子处理弧形边缘的效果更好。

laplace

这里laplace的standard做法和我的实现的不同地方在于,卷积之后得到的矩阵,在归一化到[0, 255]时,如果矩阵名为img, 我做的操作是output = img * 255 / img.max(), 而standard实现应该是直接截断,也就是output = np.clip(img, 0, 255), 所以图[4]比图[1]要亮很多。图[2]是原图+边缘产生的锐化效果,图[3]则是原图-边缘得到的模糊边缘的效果。

这是另外一个laplace filter kernel, 效果上感觉差不多。

对于横向和纵向的边缘提取,可想而知,比较无力。

但是对于弧形的边缘,就十分敏感,包括小一些的纹理,都能检测出来,比prewitt算子效果好很多。

sobel

Sobel算子应当是最常用的算子了,用Lenna.jpg来测试,感觉看不出什么。图[3]是x和y方向的边缘的简单绝对值加和,图[3]为x,y边缘均方根, 图[6]diff是计算图[4]和图[5]平均每个pixel的像素值差异,算这个是想评估一下自己的方法和标准做法的区别,不过标准做法应该是用的和图[3]一样的l1范数。

显然Sobel算子和Prewitt算子都对水平和竖直的边缘敏感,Sobel对于大的边缘应当更加敏感。

对于弧形的边缘就效果比较差了,边缘上有不少断点,这里的标准做法就表现的比较奇怪,看起来像是x和y的简单叠加,但却有明显的十字形。

scharr

Scharr算子是sobel算子的改进型,效果直观上确实会更好一些,对于大边缘的捕捉更好。

对于弧形边缘,断点的问题也比sobel要轻。

Canny 算法

Canny算法应当是目前被使用最多的边缘检测的传统方法,用的是Sobel算子。算法上会先取一下Gauss Blur(可选参数有sigma,即Gauss kernel的方差,越大越模糊,图上写成了gamma) 然后用Sobel计算梯度,得到每个点的梯度和梯度方向,再然后做所谓的非极大值抑制,其实就是对于单个点来说,在它的梯度方向,如果它是最大的,那么它很可能就是边缘,实际实现上,将所有的点在4个不同的方向上[0-45, 45-90, 90-135, 135-180]寻找符合要求的点,就能得到一个候选的bool值的矩阵,然后在这个基础上卡边缘点的阈值,确认真实边缘和潜在的边缘,最后还有一步抑制孤立点的操作。

其中非常需要注意的一个特性是能够生成,单个pixel的边缘,这在指纹识别中特别有用。

因为使用的是Sobel算子,所以对于水平、竖直边缘的识别效果不错,当然Gauss blur加得太大是提取不到什么边缘的。

对于圆形的边缘,在加适当的Gauss blur的时候,能比较好地提取出图片的轮廓,这或许能用在图像分割上。

我把skimage的实现代码的中间输出打出来看,其中 local_maxima就是选取过对应局部极大点的图,pts是检测到梯度方向在对应区间的点的图,可以明显看到,就是确实是分成了四个不同的方向区间去进行计算的。这里的阈值统一取[50, 100]

细节上就看不出来多东西,这应该是因为图太简单了。

把Gauss加大, 方向就百年的非常明显。

再加大一点就.......

Noise

一开始加在255*255的图中加了一万个点,啥都看不出来,之后就只加1000个点,取看对于单个噪声,不同kernel的表现。

prewitt

用prewiit的时候,单个噪声点,过一个x方向的filter,就变成了6个点,因为在过filter的时候,会对输出取绝对值,把负梯度转换成正的梯度,所以是6个点没有在错。但这样噪声就被放大了,用Gauss blur,可以一定程度上把噪声的影响弱化。

这是加了Gauss blur的噪声再过prewitt算子的结果,可以发现噪声变模糊,数值上变小了。

laplace

对于laplace也有放大噪声同样的问题。

嗯,其实还是蛮有趣的,有点像万花筒。十字万花筒!

sobel

回字万花筒!注意图[3]这个回字,再后面Canny的情况下,出现了同样的回字,印证了,Canny算法确实使用了Sobel算子,而且用的还是l1范数的实现,相比于l2范数,可以加速运算。这里图5的标准实现就不知道加了什么奇怪的操作了。

scharr

canny 算法

再没有加Gauss blur前(虽然Canny自己也有Gauss blur),还是能够找到噪声点,呈现回字型。

加了Gauss blur就什么都没有了,一定程度上说明,加Gauss blur确实可以抑制噪声(但这里可能是连正常的而边缘都模糊没了)

整体上来看,canny算法对于噪声还是非常鲁棒的,即便加了10000个噪声点,也能检测到比较好的边缘。当然需要比较合适的参数。

Gauss blur 加大就分不清噪声和边缘了。

再加大,就变成了染色体分裂示意图,染色体分裂,纺锤丝形成,这个高考要考!!

通常情况下是不会有10000那么多噪声的,1000应该够吧。

Dark light

暗光最常见的场景就是拍摄天体了,这时候边缘很难检测出来,不同的算子的表现能力也不同。

prewiit

检测到了一部分的边缘,但是断断续续,不连贯,效果显然是不好的。这种暗光情况,首先要做的就是做直方图均衡化!

均衡化之后,能够检测到更多的边缘,但是噪声也因此更多了。

lalplace

sobel

scharr

canny

canny算法提取道的特征还是相对好的,而且边缘更加连续一点。

均衡化之后什么都没提取到..., 这个bug下次de

Hed

有数据集就可以搞网络了。HED是15年的文章,是全卷积网络,权值用的Vgg16, 导出中间输出叫做side output, 过1x1卷积还原通道然后反卷积还原尺寸,5张图通过fusion层融合,一起取算loss.

代码参见:https://github.com/moabitcoin/holy-edge

paper: https://arxiv.org/pdf/1504.06375.pdf

从上到小依次是 side 1, side 2, side 3, side 4, side 5, fusion, output

话说有什么拼接图片比较常用的软件嘛?用PS太麻烦,用PPT如上图。

canny算子 轮廓闭合_python实现:prewitt, laplace,sobel,scharr, canny, hed相关推荐

  1. sobel边缘检测python_python实现:prewitt, laplace,sobel,scharr, canny, hed

    代码:butub1/Edge-detection​github.com 哭了,实现了的一个赞没有,上面讲理论的一堆赞...................... CatalogFilters Nois ...

  2. 【图像处理】——Python图像分割边缘检测算法之一阶梯度算子(Roberts、Prewitt、Sobel、 Kirsch、Canny算子)

    目录 前言 一.边缘检测算法 1.一阶算子 2.二阶算子 二.一阶算子 原图像lena 1.Roberts算子 不同方向的算子模板 梯度的计算 系统代码: 自定义函数代码 结果 2.Prewitt 不 ...

  3. 【OpenCV入门教程之十二】OpenCV边缘检测:Canny算子,Sobel算子,Laplace算子,Scharr滤波器合辑

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/25560901 作者:毛星云(浅墨) ...

  4. 计算机视觉中Canny算子详解

    文章目录 前言 一.Canny的实现步骤 二.具体实现 1.高斯平滑滤波 2.计算梯度大小和方向 3.非极大抑制 4.双阈值(Double Thresholding)和滞后边界跟踪 总结 前言 Can ...

  5. python的opencv操作记录12——Canny算子使用

    文章目录 Canny算子 非极大值抑制 非极大值抑制中的插值 滞后阈值 实际应用 直接使用Canny算子 使用膨胀 先阈值分割 Canny算子 上一篇说到,我在一个小项目里需要在一幅图像中提取一根试管 ...

  6. C++ Canny算子进行边缘检测

    C++实现Canny算子 进行边缘检测 文章目录 C++实现Canny算子 进行边缘检测 前言 一.Canny算子原理 二.C++实现Canny算子 1.步骤 2.C++代码如下 三.Canny算子运 ...

  7. 图像算法八:【图像分割】边缘检测(Roberts,Sobel,canny)、霍夫变换(hough)、阈值分割、区域分割

    1.我们主要学习以下四种差分算子 Roberts算子 Sobel算子 Prewitt算子 canny算子 % Matlab图像边缘检测梯度算子–Roberts.Prewitt.Sobel.LOG.Ca ...

  8. 几种边缘检测算子的比较Roberts,Sobel,Prewitt,LOG,Canny

    from:https://blog.csdn.net/gdut2015go/article/details/46779251 边缘检测是图像处理和计算机视觉中的基本问题,边缘检测的目的是标识数字图像中 ...

  9. Matlab图像边缘检测Roberts\Sobel\Prewitt\Canny算子

    确定图像中的物体边界的一种方法是先检测每个像素和其直接淋雨的状态已决定该像素是否确实处于一个物体的边界上.具有这种特性的像素被标记为边缘点.当图像中各个像素的灰度级用来反映各像素要求的程度时,这种图像 ...

  10. Roberts、Prewitt、Sobel、Laplacian、LoG 和 Canny 边缘检测算子(MATLAB自写函数实现)

    文章目录 Roberts.Prewitt.Sobel.Laplacian.LoG 和 Canny 边缘检测算子(MATLAB自写函数实现) 1理论 1.1 知识引入 1.1.1 图像边缘边缘[1] 1 ...

最新文章

  1. Android开发--图形图像与动画(二)--Animation实现图像的 渐变、缩放、位移、旋转
  2. 问题(待完成):微服务,失败回滚?保持事务的原子性?多步骤调用,如何来实现...
  3. mysql隐式锁定辅助索引_当Mysql - InnoDB行锁遇到复合主键和多列索引-Go语言中文社区...
  4. julia(5)-变量与内部常量
  5. GridView更新出现异常的解决过程
  6. Nodejs学习笔记(四)——http协议与服务器
  7. Leetcode每日一题:22.generate-parentheses(括号生成)
  8. php操作elasticsearch
  9. Json文件转Map(三)之获取嵌套Map值
  10. 如何用php 图片合成一张图片,怎么用PHP把多张图片合成一张
  11. 【数据结构基础_双向链表(有[*pHead]和[*pEnd])_(C++)】
  12. Java微信公众号开发之初步认识微信公众平台
  13. 53.大数据之旅——java分布式项目14-信息检索技术之Lucene,Solr
  14. java8 stream collectors.joining
  15. 进销存软件修改调整商品的成本(库存成本)
  16. python唐诗分析综合_Python利器之胎教《唐诗三百首》文本分析
  17. 深度残差网络RESNET
  18. 卷土重来的FCoin日本站,你被割了吗?
  19. 34.14. 切换字符集
  20. 物联网无线通信模块的新选择

热门文章

  1. 【持久化框架】SpringMVC+Spring4+Mybatis3集成,开发简单Web项目+源码下载 【转】...
  2. iOS HTML5的JS交互
  3. 如何识别一个字符串是否Json格式
  4. No.3小白的HTML+CSS心得篇
  5. weak属性需要在dealloc中置nil么?
  6. [转载]AWS使用小记之EC2(Elastic Compute Cloud)
  7. zabbix监控第一台服务器(10)
  8. RichContentLabel使用注意
  9. 安装jdk-linux-i586.rpm.bin
  10. 浏览器-09 javascript引擎和Chromium网络栈