Python/scipy中的1D非极大值抑制
你有没有用Python写的1D非极大值抑制算法?我需要这个算法来制作一个Canny边缘检测器,输入是一个1D的强度向量,使用scipy库。
我在网上查了很多资料,发现有很多关于Canny边缘检测器的介绍,还有一些用Java写的例子,但它们都是讲2D边缘检测的。
不过,scipy确实支持Canny边缘检测所需的其他算法,比如1D的高斯滤波和微分。
提前谢谢你。
3 个回答
-1
如果你的输入数据是变量“signal”,那么你需要的结果可以通过以下方式得到:
k = np.sum(np.abs(np.diff(signal>0)))
(使用Numpy库的函数)
0
我猜你数据不是周期性的。让我给你一些伪代码,希望这些能帮到你。
-- 对数据进行差分处理
-- 你需要关注差分结果中的符号变化。对于最大值来说,就是从正变负;零是一个特殊情况。numpy.sign()可以告诉你每个值的符号,返回-1、0和1,分别代表负数、零和正数。
-- 你可以再进行一次差分处理 -- 这时你要寻找-2和-1,或者为了最小值抑制,寻找2和1。要正确处理边界情况。
祝你好运,E
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
2
你是说最大值滤波吗?如果是的话,可以看看这个链接: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]