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 中的一维非最大抑制的主要内容,如果未能解决你的问题,请参考以下文章