Python/scipy 中的一维非最大抑制

Posted

技术标签:

【中文标题】Python/scipy 中的一维非最大抑制【英文标题】:1D non-maximum suppression in Python/scipy 【发布时间】:2011-08-29 13:57:51 【问题描述】:

你是否碰巧有一个用 Python 编写的一维非极大值抑制算法。我需要它来使用 scipy 在 Python 中制作 Canny 边缘检测器,该检测器将一维强度向量作为输入。

我在网上四处查看,有很多描述 Canny 边缘检测器行为的信息和一些用 Java 编写的示例,但它们都描述了 2D 中的边缘检测。

但是 scipy 确实支持 Canny 边缘检测所需的其他算法,即一维的高斯滤波和微分。

提前致谢。

【问题讨论】:

【参考方案1】:

您只是指最大过滤器吗?如果是这样,请查看scipy.ndimage.maximum_filter1d

举个简单的例子:

import numpy as np
import scipy.ndimage as ndimage

input = np.sin(np.linspace(0, 4*np.pi, 20))
input = (input * 10).astype(np.int) # Makes it easier to read
output = ndimage.maximum_filter1d(input, 4)

print 'In: ', input
print 'Out:', output

这会产生:

In:  [ 0  6  9  9  4 -1 -7 -9 -8 -3  3  8  9  7  1 -4 -9 -9 -6  0]
Out: [ 6  9  9  9  9  9  4 -1 -3  3  8  9  9  9  9  7  1 -4  0  0]

【讨论】:

【参考方案2】:

我假设您的数据不是周期性的。让我给你一个伪代码,希望这就足够了。

-- 区分数据

-- 您正在寻找差异中的符号变化。对于 Max 来说,这将从正面变为负面;零是一个特例。 numpy.sign() 为您提供 -1、0、1 中每个值的符号,分别表示负值、零值和正值。

-- 你可以再次区分——你正在寻找 -2 和 -1 或最小抑制 2 和 1。正确处理边界。

祝你好运

import matplotlib.pyplot as plt
import numpy as np

dat= np.linspace(1, 5, 5)
dat2 = np.concatenate([dat, dat[::-1]+.5, dat,dat[::-1]])
## ignore above.

res = np.diff(np.sign(np.diff(dat2, prepend=[0])), append=0)
plt.plot(dat2)  ## NB end conditions, and you can ignore plotting
plt.plot(res)

干杯,E

【讨论】:

以上是关于Python/scipy 中的一维非最大抑制的主要内容,如果未能解决你的问题,请参考以下文章

非最大抑制,挑选和目标重叠框 yolo思想原理

目标检测的非最大值抑制-NMS

当我尝试在 matlab 中执行非最大抑制时,图像是一条线

非极大值抑制 NMS

特征点检测目标检测交并比非最大值抑制锚框YOLO算法候选区域

特征点检测目标检测交并比非最大值抑制锚框YOLO算法候选区域