什么是非极大抑制

在目标检测中,通常会使用各种各样的方法来让计算机找到目标的所在位置,然而,计算机的输出往往并不是单一的,也就是说,一个目标可能会输出多个结果(如下图所示),这些结果有好有坏,因此就需要使用非极大抑制的方法来筛选出最优结果,说白了也就是一个剔除冗余的过程。

非极大值抑制(Non-Maximum Suppress,NMS)算法,其核心思想在于抑制非极大值的目标(去冗余),从而搜索出局部极大值的目标(找最优)。由于不同的目标框有不同的表示方式,因此NMS算法也具有不同的变体,本文通过目标检测的非极大抑制引入,简单讲述非极大抑制的思想以及其在边缘检测上的应用。

目标检测中的非极大抑制算法实现

(1)假设有n个候选预测框,将所有可能的预测框按类别划分n个集合,把整张图片也加入到集合当中,使得集合中存在n+1个元素
(2)用置信度最高的元素分别与其余元素之间计算IoU,如果IoU大于给定阈值,则将置信度较低的元素排除,保留置信度较高的元素。
IoU是两个区域重叠的部分除以两个区域的集合部分得出的结果,通过设定的阈值,与这个IoU计算结果比较。这里借用网络上的一张图片来帮助大家理解

(3)重复上述步骤,直到找出最优解为止。

非极大抑制在边缘检测中有什么作用

利用sobel算子可以计算图像梯度的幅值和方向,Sobel算子分为X方向和Y方向,表达如下
Sx=[−101−202−101]S_x = \begin{bmatrix} -1 & 0 & 1 \\ -2 & 0 & 2 \\ -1 & 0 & 1 \end{bmatrix}Sx​=​−1−2−1​000​121​​
Sy=[−1−2−1000121]S_y = \begin{bmatrix} -1 & -2 & -1 \\ 0 & 0 & 0 \\ 1 & 2 & 1 \end{bmatrix}Sy​=​−101​−202​−101​​
直接利用两个边缘检测卷积核,分别对图像进行边缘提取后再叠加,即可初步得到边缘图像。使用改算子进行卷积前,需要先将图像转化为单通道的灰度图。MATLAB代码如下:

conv1 = [1 0 -1 2 0 -2 1 0 -1]; conv2 = [1 2 1 0 0 0 -1 -2 -1]; % 也可以直接写成表达式
% 其中I为目标图像对应的二值图像
R=zeros(m,n);
for xi=2:1:m-1 for yi = 2:1:n-1 R(xi,yi)=abs(I(xi+1,yi+1)+2*I(xi,yi+1)+I(xi-1,yi+1)-I(xi-1,yi-1)-2*I(xi,yi-1)-I(xi+1,yi-1))+abs(I(xi-1,yi-1)+2*I(xi-1,yi)+I(xi-1,yi+1)-I(xi+1,yi+1)-2*I(xi+1,yi)-I(xi+1,yi-1)); end
end

做完这一步后,我们会发现,检测出来的边缘像素点有许多冗余,也就是同一个边缘可能检测了两条、三条甚至更多条。因此,我们就需要使用非极大抑制的方法来消除冗余,此处可参考J.Canny发表的论文

梯度方向上的非极大抑制

接下来进入本文的正题,
在John Canny提出的Canny算子的论文中,非最大值抑制就只是在0、90、45、135四个梯度方向上进行的,每个像素点梯度方向按照相近程度用这四个方向来代替。这四种情况也代表着四种不同的梯度,即
Gy>GxG_y > G_xGy​>Gx​,且两者同号
Gy>GxG_y > G_xGy​>Gx​,且两者异号
Gy<GxG_y < G_xGy​<Gx​,且两者同号
Gy<GxG_y < G_xGy​<Gx​,且两者异号

如上图所示,根据X方向和Y方向梯度的大小可以判断A点是靠近X轴还是Y轴,通过A1和A2的像素值则可计算A点的亚像素值,B点同理,不再赘述。上面两图为靠近Y轴的梯度大,下面两图为靠近X轴的像素大。
由于A、B两点的位置是通过梯度来确定的,那么A、B两点的梯度值也可以根据Q点的梯度计算,因此假设Q点在四个方向上的梯度分别为G1、G2、G3、G4G_{1}、G_{2}、G_{3}、G_{4}G1​、G2​、G3​、G4​。下面我们分情况来讨论

  1. 首先讨论Gy>GxG_y > G_xGy​>Gx​的情况,此时

w=GxGyw = \frac{G_x}{G_y}w=Gy​Gx​​
G2=G(i−1,j)G_2 = G(i-1, j)G2​=G(i−1,j)
G4=G(i+1,j)G_4 = G(i+1, j)G4​=G(i+1,j)
如果两者同号,则
G1=G(i−1,i−1)G_1 = G(i-1,i-1)G1​=G(i−1,i−1)
G3=G(i+1,i+1)G_3 = G(i+1,i+1)G3​=G(i+1,i+1)
否则
G1=G(i−1,i+1)G_1 = G(i-1,i+1)G1​=G(i−1,i+1)
G3=G(i+1,i−1)G_3 = G(i+1,i-1)G3​=G(i+1,i−1)

  1. 然后是Gy<GxG_y < G_xGy​<Gx​的情况

w=GyGxw = \frac{G_y}{G_x}w=Gx​Gy​​
G2=G(i,j−1)G_2 = G(i, j-1)G2​=G(i,j−1)
G4=G(i,j+1)G_4 = G(i, j+1)G4​=G(i,j+1)
如果两者同号
G1=G(i+1,i−1)G_1 = G(i+1,i-1)G1​=G(i+1,i−1)
G3=G(i−1,i+1)G_3 = G(i-1,i+1)G3​=G(i−1,i+1)
否则
G1=G(i−1,i−1)G_1 = G(i-1,i-1)G1​=G(i−1,i−1)
G3=G(i+1,i+1)G_3 = G(i+1,i+1)G3​=G(i+1,i+1)
如此便可以计算出两个相邻亚像素点的梯度值
gA=w∗G1+(1−w)∗G2g_A = w*G_{1} + (1-w)*G_2gA​=w∗G1​+(1−w)∗G2​
gB=w∗G3+(1−w)∗G4g_B = w*G_{3} + (1-w)*G_4gB​=w∗G3​+(1−w)∗G4​
比较三者的像素值,如果Q点像素值大于其余两者,则保留Q点作为边缘上的点,否则认为Q点为冗余点。

参考链接

(36条消息) 非极大值抑制算法详解_武乐乐~的博客-CSDN博客_非极大值抑制算法
(36条消息) Canny算子中的非极大值抑制(Non-Maximum Suppression)分析_Belial_2010的博客-CSDN博客_canny算子非极大值抑制
(36条消息) Canny边缘检测Step3——梯度幅值的非极大值抑制(NMS)详解_Polaris_T的博客-CSDN博客_canny 非极大值抑制

Canny边缘检测方法中的非极大抑制相关推荐

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

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

  2. 目标检测中NMS(非极大抑制)的概念理解

    参考博客 物体检测中常用的几个概念迁移学习.IOU.NMS理解 目标定位和检测系列(3):交并比(IOU)和非极大值抑制(NMS)的python实现 一.NMS(非极大抑制)概念 NMS即non ma ...

  3. (Object detection)目标检测从入门到精通——第三部分非极大抑制

    3.7 非极大值抑制(Non-max suppression) 到目前为止你们学到的对象检测中的一个问题是,你的算法可能对同一个对象做出多次检测,所以算法不是对某个对象检测出一次,而是检测出多次.非极 ...

  4. 非极大值抑制_【计算机视觉——RCNN目标检测系列】三、IoU与非极大抑制

    写在前面 在上一篇博客:[计算机视觉-RCNN目标检测系列]二.边界框回归(Bounding-Box Regression)( 戴璞微:[计算机视觉-RCNN目标检测系列]二.边界框回归(Boundi ...

  5. (转)非极大抑制(Non-Maximum Suppression)

    转载自非极大抑制(Non-Maximum Suppression). 参考文章: 1. Non-Maximum Suppression for Object Detection in Python 2 ...

  6. 深度学习——NMS(非极大抑制)

    博客地址:https://blog.csdn.net/zchang81/article/details/70211851 在物体检测中NMS(Non-maximum suppression)非极大抑制 ...

  7. 【R-CNN目标检测系列】三、IoU与非极大抑制

    写在前面 在上一篇博客:[计算机视觉--RCNN目标检测系列]二.边界框回归(Bounding-Box Regression)中我们主要讲解了R-CNN中边界框回归,接下来我们在这篇博客我们讲解R-C ...

  8. 睿智的目标检测31——非极大抑制NMS与Soft-NMS

    睿智的目标检测31--非极大抑制NMS与Soft-NMS 注意事项 学习前言 什么是非极大抑制NMS 1.非极大抑制NMS的实现过程 2.柔性非极大抑制Soft-NMS的实现过程 注意事项 Soft- ...

  9. 【YOLOv3 NMS】YOLOv3中的非极大值抑制

    文章目录 1 NMS问题由来 2 NMS操作流程 2.1 进行NMS前要先有什么 2.2 NMS流程 3 NMS代码解读 4 感谢链接 1 NMS问题由来 利用YOLOv3网络结构提取到out0.ou ...

最新文章

  1. centos 7 安装 mantisbt-2.12.0 —— 安装LAMP环境、安装mantisbt-2.12.0
  2. 工具用的好下班走的早
  3. bootstrap获取表格中选中行的值_这才是No.1的Excel表格核对技巧
  4. 【常用算法总结——最短路径四种方法】
  5. Struts2和Struts1.x的全面比较
  6. L1-028. 判断素数-PAT团体程序设计天梯赛GPLT
  7. vs2010使用教程c语言编程,VS2010的使用
  8. 市场热门身份证识别性能测评对比
  9. 直通车内测“定时上架”功能,商家可以提前锁定爆款了!
  10. ruby与ruby on rails环境部署
  11. 2019年小程序发展优势
  12. 手机像素与分辨率的关系
  13. 国产API管理工具Eolink太好用了,打造高效的研发利器
  14. 用户留存sql完整版
  15. 2018年我跑去做淘宝了(续篇)
  16. 金融知识国民读本(一)
  17. 国外软件外包项目网站(适用软件兼职)国外威客网站大盘点
  18. 不要黄泛区及东北人?地域歧视谁之责
  19. 如何使用Susy:超强大的Sass网格
  20. 博奥智源科技,浅谈智慧财经管理系统开发设计

热门文章

  1. 封装Vue组件的原则及技巧
  2. Docker中的资源分配详解
  3. 深入理解HTML表格秘籍
  4. [递推式求解、多指针、前缀和]XATU第七届算法大赛
  5. Python Tkinter Radiobutton控件
  6. umi中@umijs/plugin-dva的使用,及实现一套增删改
  7. 零点和极点的物理意义
  8. logging日志写入文件
  9. Python 高德地图经纬度与地址相互解析
  10. 统计 Git 代码行数