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

qzlgjiam  于 2022-11-10  发布在  Python
关注(0)|答案(3)|浏览(129)

你有没有用Python写的一维非最大值抑制算法,我需要用它来用Python做一个Canny边缘检测器,用scipy输入一个一维强度矢量。
我在网上查了一下,有很多信息描述了Canny边缘检测器的行为,还有一些用Java编写的示例,但它们都描述了2D中的边缘检测。
然而,scipy确实支持Canny边缘检测所需的其他算法,即1D的高斯滤波和微分。
先谢谢你。

mutmk8jj

mutmk8jj1#

你只是指最大过滤器吗?如果是,请查看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]
ff29svar

ff29svar2#

我假设你的数据不是周期性的。让我给予你一个伪代码,希望这就足够了。
--对数据进行比较
--你在寻找diff中的符号变化。对于Max来说,这将是从正到负的变化;零是一种特殊情况。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

ev7lccsx

ev7lccsx3#

如果您的输入数据是变量“signal”,那么您需要的结果可以由下式给出:

k = np.sum(np.abs(np.diff(signal>0)))

(使用Numpy函数)

相关问题