首先要明白的是:

(a.) canny算子中非最大抑制(Non-maximum suppression)是回答这样一个问题: “当前的梯度值在梯度方向上是一个局部最大值吗?” 所以,要把当前位置的梯度值与梯度方向上两侧的梯度值进行比较.
(b.) 梯度方向垂直于边缘方向, 这一点不要误解.

-

Q1: 插值是何意?为啥取g1,g2为一组,g3,g4为一组计算插值?
A: 首先, 虽然插值是有必要的,但是没有说必须要插值. 例如, Wikipedia里[1]的canny算子一文中的所讲的非最大值抑制就只是在0\90\45\135度梯度方向上进行的. 每个像素点梯度方向按照相近程度用这四个方向来代替,这种情况下,非最大值抑制所比较的相邻两个像素就是:
0 : 左边 和 右边
90 : 上边 和 下边
45 : 右上 和 左下
135: 左上 和 右下

这样做的好处是简单, 但是, 这种简化的方法无法达到最好的效果, 因为, 自然图像中的边缘梯度方向不一定是沿着这四个方向的. 因此, 就有很大的必要进行插值, 目的是找出在一个像素点上最能吻合其所在梯度方向的两侧的像素值.

然而, 通过argtan(gx/gy)得到的方向可以是-90~90度内的任何值, 但是, 因为实际数字图像中的像素点是离散的二维矩阵, 所以, 处在真正中心位置C处的梯度方向两侧的点是不一定存在的, 或者说是一个亚像素(sub pixel)点, 而这个不存在的点, 以及这个点的梯度值就必须通过对其两侧的点进行插值来得到.

至此, 插值的目的我讲述了一遍.

举个直观的例子,就是上面贴的那张图.
这个图给出的情况是, gy > gx 且 gx*gy > 0(注意: gx*gy>0是因为图像坐标系中y轴是朝下的.)

蓝色的直线代表梯度方向. g1, g2, g3, g4四个点以及插值点dTemp1, dTemp2 的位置如图所示.
对应的代码是:
g1 = pnMag[nPos-imageWidth-1] ;
g3 = pnMag[nPos+imageWidth+1] ;

g2 = pnMag[nPos-imageWidth] ;
g4 = pnMag[nPos+imageWidth] ;

下面解释, 插值公式为什么是:
dTmp1 = weight*g1 + (1-weight)*g2 ;
dTmp2 = weight*g3 + (1-weight)*g4 ;

这里: weight = fabs(gx)/fabs(gy) = ctan(theta), theta为梯度方向.
上面那个公式变一下就可以变换成:
weight = |dTemp1-g2|/|g1-g2| = |dTemp1-g2|/|C-g2| = ctan(theta);
而从我画的图中可以直观的看出,
在由 <,C, g2, dTemp1>组成的三角形中, 正好符合这个公式.(这里我没有太care正负号,只是为了给你一个直观解释)

讲到这里,应该你的后两个问题都不成问题了吧.

Q2: 原理上是比较3*3矩阵内相邻像素点是不是最大值,他为何比较g1,g2,g3,g4就完事了
A: 最大值抑制中的比较最大值不是看是不是3*3矩阵内的最大值, 而是看是不是梯度方向上的局部最大值. 否则就成了一个3*3的最大值滤波了. 为什么比较g1~g4, Q1的回答中已经讲清楚了.

Q3: 为何要分X,Y方向导数谁大两种情况比较
A: 把X, Y方向导数谁大两种情况分开只是为了编程上的方便. 你也可以分四种情况分别进行最大值抑制.

转载自:https://bbs.csdn.net/topics/370004267 中visionfans的回答

边缘检测中非极大值抑制简单解释相关推荐

  1. caffe-ssd中非极大值抑制NMS的原理和实现方法

    看论文觉得很好理解,但是一看源码,瞬间懵了,很正常的想法,到代码上就看不懂了,结合了下面博文讲解,终于看懂了caffe-ssd中nms的代码. https://blog.csdn.net/HappyR ...

  2. C++自定义非极大值抑制(Canny边缘检测,亚像素方法)

    Mat subPixleRestrainNoMax2(Mat img)//具有更清楚的物理解释,线插分法 {Mat oriImage = img;Mat newImage_x = Mat(img.si ...

  3. Susan角点检测python实现 (边缘检测、角点检测、重心计算、非极大值抑制)

    Susan角点检测(边缘检测.角点检测.重心计算.非极大值抑制) 写在前面 黄宁然--看过你看过的算法,觉得好难. 参考文献镇楼 [1]https://blog.csdn.net/tostq/arti ...

  4. 计算机视觉入门-梯度、算子、Canny边缘检测、非极大值抑制、双门限法

    第二章 边缘检测 边缘:信号突变的地方.能够紧凑描述图片的内容信息 边缘检测的几种类型: 表面不连续 深度不连续 表面颜色不连续 投影不连续 可以根据求导来判断是否为断点(边缘) x方向(为简便操作 ...

  5. 对梯度幅值进行非极大值抑制

    图象的边缘是指图象局部区域亮度变化显著的部分,该区域的灰度剖面一般可以看作是一个阶跃,既从一个灰度值在很小的缓冲区域内急剧变化到另一个灰度相差较大的灰度值.图象的边缘部分集中了图象的大部分信息,图象边 ...

  6. Non-Maximum Suppression,NMS非极大值抑制

    Non-Maximum Suppression,NMS非极大值抑制 概述 非极大值抑制(Non-Maximum Suppression,NMS),顾名思义就是抑制不是极大值的元素,可以理解为局部最大搜 ...

  7. 【目标检测系列】非极大值抑制(NMS)的各类变体汇总

    关注上方"深度学习技术前沿",选择"星标公众号", 技术干货,第一时间送达! [导读]前面已经先后为大家详细介绍过了目标检测领域的基础知识:[目标检测基础积累] ...

  8. 非极大值抑制(Non-Maximum Suppression,NMS)(转)

    概述 非极大值抑制(Non-Maximum Suppression,NMS),顾名思义就是抑制不是极大值的元素,可以理解为局部最大搜索.这个局部代表的是一个邻域,邻域有两个参数可变,一是邻域的维数,二 ...

  9. 目标窗口检测算法-NMS非极大值抑制

    1. NMS(non maximum suppression)的定义和算法步骤 NMS(non maximum suppression),中文名非极大值抑制,在很多计算机视觉任务中都有广泛应用,如:边 ...

最新文章

  1. 机器学习中的数学基础:(3)主成分分析(PCA)及其应用
  2. 程序员提交代码的 emoji 指南——原来表情文字不能乱用
  3. Js与Jsp、Jsp之间的中文乱码转换
  4. 浅析@Deprecated,调用方法时出现横线划掉样式
  5. oracle编程艺术在线,oracle编程艺术笔记-1
  6. 手机APP新“战场” 手机银行APP成了银行业的定时炸弹?
  7. SpringBoot基础系列-SpringCache使用
  8. 新瓶旧酒ASP.NET AJAX(6) - 客户端脚本编程
  9. web.xml中相关标签的加载顺序
  10. Android--OkHttp理解系列(一)
  11. 方立勋_30天掌握JavaWeb_Servlet Filter(过滤器)未完
  12. 计算机net use命令使用,网络命令net之net use应用
  13. html动画用css还是js,javascript与css3动画结合使用小结
  14. 《C++ Primer 第五版》(第6.3~6.7节)——返回指向数组/函数的指针,函数重载,默认形参、inline函数和constexpr函数
  15. (三)nodejs循序渐进-值传递和引用传递,深拷贝和浅拷贝(基础篇)
  16. scala 去除重复元素_Scala程序从列表中删除重复项
  17. “云时代架构”经典文章阅读感想八
  18. Linux system函数返回值
  19. 用windbg分析minidump
  20. VB连接oracle数据库

热门文章

  1. sort函数_MATLAB--数字图像处理 sort()函数
  2. sql两个时间之间的小时差_2年级学生每天上学路上有两个小时车程,该如何利用好这个时间?-知乎亲子热点快报/2020/09/04...
  3. OCR完整技术栈10天掌握!教程完全开源,更有产学研大佬们联合授课!
  4. 一个励志PM小哥哥的Java转型之路
  5. java架构师进阶独孤九剑系列(一):数据结构与算法
  6. BIO,NIO,AIO
  7. 数据结构与算法理论概述
  8. 第二阶段团队冲刺(十)
  9. 第一阶段 03Java的基本数据类型
  10. 源码调试debug_info 的作用和使用方法