你碰巧有一个用 Python 编写的一维非极大值抑制算法。我需要它来使用 scipy 在 Python 中制作 Canny 边缘检测器,该检测器将一维强度向量作为输入。
我在网上四处查看,有很多信息描述了 Canny 边缘检测器的行为以及一些用 Java 编写的示例,但它们都描述了 2D 中的边缘检测。
然而 scipy 确实支持 Canny 边缘检测所需的其他算法,即一维的高斯滤波和微分。
提前致谢。
你碰巧有一个用 Python 编写的一维非极大值抑制算法。我需要它来使用 scipy 在 Python 中制作 Canny 边缘检测器,该检测器将一维强度向量作为输入。
我在网上四处查看,有很多信息描述了 Canny 边缘检测器的行为以及一些用 Java 编写的示例,但它们都描述了 2D 中的边缘检测。
然而 scipy 确实支持 Canny 边缘检测所需的其他算法,即一维的高斯滤波和微分。
提前致谢。
你只是说最大过滤器吗?如果是这样,请查看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]
我假设您的数据不是周期性的。让我给你一个伪代码,希望这就足够了。
-- 区分数据
-- 您正在寻找差异中的符号变化。对于 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