Python/scipy中的1D非极大值抑制

7 投票
3 回答
4410 浏览
提问于 2025-04-17 00:31

你有没有用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]

撰写回答