7

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

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

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

提前致谢。

4

2 回答 2

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]
于 2011-09-06T18:15:53.573 回答
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

于 2022-01-23T21:22:12.037 回答