之前刚接触 Canny 算子的时候,已经理解过一次。最近需要再次用到它,又花了很长的时间去理解。为方便下次理解,做了这次笔记。文中代码是我从 matlab edge函数中 canny_old 部分中粘贴出来的部分代码,只是用来配合理解非极大值抑制的原理,不能直接使用。

Canny 非极大值抑制分成 3 部分:

  • 确定像素的梯度方向
  • 对像素线性插值,找出极大值点。
  • 将像素值大于低阈值的极大值点作为弱边缘

本文中符号表示:

  • X :讨论像素
  • ix:x 方向梯度值
  • iy:y方向梯度值
  • direction:梯度方向 1-4
  • mag 梯度幅度

1 确定像素梯度方向


如上图所示,X 是需要讨论的像素点,梯度向量的每个四分之一圆被45°线分成两种情况,一种情况是倾向于水平,另一种倾向于竖直。一共 8 个方向,因为我们使用关于中心像素的对称点,所以对于非极大值抑制我们只考虑其中 4 个(1 和 (1) 属于一个方向)

以图中属于方向 1 的区间为例: iy < 0, ix > 0, ix > -iy。
其他也是类似的分法。

这部分 Matlab edge 函数代码是这样的,非常简单明确:

switch directioncase 1idx = find((iy<=0 & ix>-iy)  | (iy>=0 & ix<-iy));case 2idx = find((ix>0 & -iy>=ix)  | (ix<0 & -iy<=ix));case 3idx = find((ix<=0 & ix>iy) | (ix>=0 & ix<iy));case 4idx = find((iy<0 & ix<=iy) | (iy>0 & ix>=iy));
end

然后下面的部分我不理解,有知道的大佬望告知一下。
注释部分是:Exclude the exterior pixels(排除外部像素)外部像素是什么意思?

if ~isempty(idx)v = mod(idx, m);extIdx = (v == 1 | v == 0 | idx<=m | (idx > (n-1)* m)); idx(extIdx) = [];end
ixv = ix(idx);
iyv = iy(idx);
gradmag = mag(idx);

2 线性插值

如果梯度极大值不在像素点上,而在他们之间的某一点(亚像素点)。那么为了算出这个点,就需要进行线性插值

还是以属于方向 1 的区间为例,红色点的梯度值由绿色点和黄色点的梯度值算出。
那么红色点是靠近黄色点还是绿色点?这就需要一个数来表示它于黄色点和绿色点的距离,我们将它命名为权重 d
在方向 1 的区间中 d=iyixd = \frac{iy}{ix}d=ixiy​

红色点的梯度值 gradmag1 = mag(idx+m)(黄色点梯度值).*(1-d) + mag(idx+m-1)(绿色梯度值).*d;

这里有个小知识:
Matlab 中矩阵元素下标是按列数的。比如
A=[816357492]A = \begin{bmatrix} 8 &amp; 1 &amp; 6 \\ 3 &amp; 5 &amp; 7 \\ 4 &amp; 9 &amp; 2 \\ \end{bmatrix} A=⎣⎡​834​159​672​⎦⎤​
当寻找 A 中大于 5 的下标 find(A>5) 时:
A=[1678]A = \begin{bmatrix} 1 \\ 6 \\ 7 \\ 8 \\ \end{bmatrix} A=⎣⎢⎢⎡​1678​⎦⎥⎥⎤​
其中 8,9,6,7 的下标分别是 1,6,7,8.

这里注释是:对内部像素线性插值,一样没搞懂。

switch directioncase 1d = abs(iyv./ixv);gradmag1 = mag(idx+m).*(1-d) + mag(idx+m-1).*d;gradmag2 = mag(idx-m).*(1-d) + mag(idx-m+1).*d;case 2d = abs(ixv./iyv);gradmag1 = mag(idx-1).*(1-d) + mag(idx+m-1).*d;gradmag2 = mag(idx+1).*(1-d) + mag(idx-m+1).*d;case 3d = abs(ixv./iyv);gradmag1 = mag(idx-1).*(1-d) + mag(idx-m-1).*d;gradmag2 = mag(idx+1).*(1-d) + mag(idx+m+1).*d;case 4d = abs(iyv./ixv);gradmag1 = mag(idx-m).*(1-d) + mag(idx-m-1).*d;gradmag2 = mag(idx+m).*(1-d) + mag(idx+m+1).*d;
end
获取极大值
idxLocalMax = idx(gradmag>=gradmag1 & gradmag>=gradmag2);

之后便是非极大值抑制部分,这部分理解起来比较简单

     idxWeak = idxLocalMax(mag(idxLocalMax) > lowThresh);e(idxWeak) = 1;idxStrong = [idxStrong; idxWeak(mag(idxWeak) > highThresh)];

Canny 算子的非极大值抑制相关推荐

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

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

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

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

  3. Canny算法中的非极大值抑制

    在canny边缘检测算法中,为了检测边缘,其中会用到非极大值抑制的原理.其基本思想如下: 其目的就是寻找像素点局部最大值,将非极大值点所对应的灰度值置为0,这样可以剔除掉一大部分非边缘的点. 其中蓝色 ...

  4. C#图像处理程序实现--Canny实现 笔记整理(其中的非极大值抑制点)

    在Canny算法中,对于其中的非极大值抑制这一点做笔记整理,过程看之前的这一片,注意理解里面的关于梯度相关的概念 原理如下:(需要理解) 依据当前点的周围点的梯度模来推算中心点的模,然后与实际值比较, ...

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

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

  6. NMS(非极大值抑制)算法详解与示例

    一.NMS是什么? NMS(non maximum suppression)即非极大值抑制,广泛应用于传统的特征提取和深度学习的目标检测算法中. NMS原理是通过筛选出局部极大值得到最优解. 在2维边 ...

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

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

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

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

  9. Shi-tomasi角点检测python实现及基于opencv实现 (角点检测、非极大值抑制)

    写在前面: 已经是七月中旬,黄宁然,你依然在这里. 参考文献镇楼: [1]龚思宇宙,基于平面模板的摄像机标定及相关技术研究 [2]汪洋,扫地机器人定位算法设计与嵌入式系统实现 [3]Denny#,[o ...

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

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

最新文章

  1. mysql mgr应用场景_悄悄告诉你 MySQL MGR 牛在哪?
  2. output_buffering详细介绍
  3. lodop打印技巧与注意事项
  4. 前端培训_backbone
  5. php 日历重复_PHP 生成日历
  6. VTK:图片之ImageIdealHighPass
  7. 关于Unity实现AR功能(五)摄像头转换与闪光灯开关控制
  8. 为什么说RESTful对程序员如此重要
  9. plsql连接远程Oracle的方法
  10. JBuilder安装JDBC drive的方法略解
  11. 怎样查询人工智能的前沿论文?
  12. Linux下.o,.so,.a,.la文件
  13. Python之 if-elif-else
  14. linux 相关命令
  15. PTA-Hello World(C语言)
  16. matlab把图例放在左边,如何将图例放在p之外
  17. 微信小程序: wx:key详解
  18. 【线性代数(6)】范德蒙德行列式及克莱姆法则
  19. js+php+mysql写的rpg网页游戏引擎源码-DotK改进版
  20. 地震勘探原理(五)之地震勘探的野外工作

热门文章

  1. 红海竞争下,「社交+」在中东泛娱乐 App 市场的出海新机遇
  2. Java计算机毕业设计大学生企业推荐系统源码+系统+数据库+lw文档
  3. 小度wifi的使用说明
  4. 计算机网络中特有符号,计算机基础知识测试题-一肖中特免费公开资料.doc
  5. js使用正则分割字符串
  6. Qt之SQLite数据库可视化工具
  7. 手机也可以接USB摄像头了
  8. 防治计算机病毒微格教案反思,数字化微格教学实验室设备常见故障及处理方法...
  9. ftdi+usb转串口驱动+android,FTDI usb转串口驱动
  10. uygurqa输入法android,uygurqa维语输入法2021