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")
尝试 dx
和 dy
以正确检测峰值。
查看这样的数据,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()
像这样标志着一个高峰。
对于另一个数据集,使用相同的参数,程序给出
我正在尝试使用激光雷达检测一扇开着的门。我有 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")
尝试 dx
和 dy
以正确检测峰值。
查看这样的数据,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()
像这样标志着一个高峰。
对于另一个数据集,使用相同的参数,程序给出