Python 图分割

Python graph segmentation

我正在尝试使用激光雷达检测一扇开着的门。我有 270 度的 LIDAR 读数,我正在尝试从图中检测门:

门是100到150之间的巅峰。

门在 ~30 到 ~40 之间。

这里有一个“噪音”峰值。

我可以看到图中门“开始”和“结束”处有一个巨大的尖峰。我想知道是否是 scipy/numpy 或其他库函数可以检测到这一点。

谢谢

我不认为有这个功能,你的问题有点具体。 但是,我认为手动检测并不难,因为检测的其他部分没有这么高的导数。

你可以这样做:

dx = 2
dy = 4

spike_start = None
spike_end = None

for i in range(len(points)):
    # Detect high derivative when spike starts
    if spike_start is None and points[i] - points[i-dx] >= dy:
        spike_start = i

    # Detect high negative derivative when spike ends
    if spike_start is not None and points[i-dx] - points[i] >= dy:
        spike_end = i
        break

if spike_start is not None and spike_end is not None:
    print(f"Door is between {spike_start} and {spike_end}")
else:
    print("Door not found")

尝试 dxdy 以正确检测峰值。

查看这样的数据,peak-finding 算法有点嘈杂,但我建议尝试以下过程,其中峰值查找是在数据集的平滑版本上完成的。

import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import find_peaks
from scipy.ndimage import gaussian_filter

D = np.load('lidar.npy')
D2 = gaussian_filter(D, sigma=3)
A = find_peaks(D2, width=5, prominence=4, distance=10)

如您所见,我首先使用您的数据集 lidar.npy,然后使用

绘制找到的峰
for a in A[0]:
    plt.axvline(a)
plt.plot(D2)
plt.show()

像这样标志着一个高峰。

对于另一个数据集,使用相同的参数,程序给出