Python 从二维点查找边
我有几组分散的2d数据,我想找到它们的边缘。某些边可能是开放线,其他边可能是多边形 例如,这里有一个图有一个开放的边缘,我希望能够保持。实际上,我想从开放边创建一个多边形,这样我就可以使用Python 从二维点查找边,python,image-processing,edge-detection,convex-hull,scikits,Python,Image Processing,Edge Detection,Convex Hull,Scikits,我有几组分散的2d数据,我想找到它们的边缘。某些边可能是开放线,其他边可能是多边形 例如,这里有一个图有一个开放的边缘,我希望能够保持。实际上,我想从开放边创建一个多边形,这样我就可以使用point\u in\u poly来检查是否有另一个点在里面。关闭多边形的点是绘图区域的边界,顺便说一句。 关于从哪里开始有什么想法吗 编辑: 以下是我已经尝试过的: 来自sklearn的KernelDensity。边缘点密度变化很大,无法与大部分点完全区分 kde = KernelDensity()
point\u in\u poly
来检查是否有另一个点在里面。关闭多边形的点是绘图区域的边界,顺便说一句。
关于从哪里开始有什么想法吗
编辑:
以下是我已经尝试过的:
kde = KernelDensity()
kde.fit(my_data)
dens = np.exp(kde.score_samples(ds))
dmax = dens.max()
dens_mask = (0.4 * dmax < dens) & (dens < 0.8 * dmax)
ax.scatter(ds[dens_mask, 0], ds[dens_mask, 1], ds[dens_mask, 2],
c=dens[dens_mask], depthshade=False, marker='o', edgecolors='none')
,以及我问过的其他一些问题,这些问题显示了我所看到的更多内容。因此我能够以一种迂回的方式完成这项工作 我使用SolidWorks生成的xy平面模型切片图像来区分感兴趣的区域 如果你看到它们,我在模型中放置的图片角落中有一些点,以已知距离作为参考。这些点允许我确定每毫米的像素数。从那里,我将分析集中的点映射到像素,并检查像素的颜色。如果像素是白色的,它将被遮罩
def mask_z_level(xi, yi, msk_img, x0=-14.3887, y0=5.564):
im = plt.imread(msk_img)
msk = np.zeros(xi.shape, dtype='bool')
pxmm = np.zeros((3, 2))
p = 0
for row in range(im.shape[0]):
for col in range(im.shape[1]):
if tuple(im[row, col]) == (1., 0., 0.):
pxmm[p] = (row, col)
p += 1
pxx = pxmm[1, 1] / 5.5
pxy = pxmm[2, 0] / 6.5
print(pxx, pxy)
for j in range(xi.shape[1]):
for i in range(xi.shape[0]):
x, y = xi[i, j], yi[i, j]
dx, dy = x - x0, y - y0
dpx = np.round(dx * pxx).astype('int')
dpy = -np.round(dy * pxy).astype('int')
if tuple(im[dpy, dpx]) == (1., 1., 1.):
msk[i, j] = True
return msk
以下是显示遮罩效果的曲线图:
我仍然在微调边界,但我有一个非常容易管理的任务,现在面具已经基本完成。原因是某些遮罩点不正确,导致带状
所以我能够以一种迂回的方式完成这项工作 我使用SolidWorks生成的xy平面模型切片图像来区分感兴趣的区域 如果你看到它们,我在模型中放置的图片角落中有一些点,以已知距离作为参考。这些点允许我确定每毫米的像素数。从那里,我将分析集中的点映射到像素,并检查像素的颜色。如果像素是白色的,它将被遮罩
def mask_z_level(xi, yi, msk_img, x0=-14.3887, y0=5.564):
im = plt.imread(msk_img)
msk = np.zeros(xi.shape, dtype='bool')
pxmm = np.zeros((3, 2))
p = 0
for row in range(im.shape[0]):
for col in range(im.shape[1]):
if tuple(im[row, col]) == (1., 0., 0.):
pxmm[p] = (row, col)
p += 1
pxx = pxmm[1, 1] / 5.5
pxy = pxmm[2, 0] / 6.5
print(pxx, pxy)
for j in range(xi.shape[1]):
for i in range(xi.shape[0]):
x, y = xi[i, j], yi[i, j]
dx, dy = x - x0, y - y0
dpx = np.round(dx * pxx).astype('int')
dpy = -np.round(dy * pxy).astype('int')
if tuple(im[dpy, dpx]) == (1., 1., 1.):
msk[i, j] = True
return msk
以下是显示遮罩效果的曲线图:
我仍然在微调边界,但我有一个非常容易管理的任务,现在面具已经基本完成。原因是某些遮罩点不正确,导致带状
尝试图像处理标签;他们一直在处理这类发现。:-)你要做的是找到一组点的“凸包”。你可以使用很多方法来实现这一点。看起来你的图中有一些结构。有可能利用这一点吗?或者这是一个非典型的例子?在这里,您似乎只对最左边的边缘感兴趣。这是一般的吗?Scipy可以帮你找到凸面外壳:是的,但那条线不是凸面外壳。OP想要接近点的东西,即使它们的“边缘”不是凸的;他们一直在处理这类发现。:-)你要做的是找到一组点的“凸包”。你可以使用很多方法来实现这一点。看起来你的图中有一些结构。有可能利用这一点吗?或者这是一个非典型的例子?在这里,您似乎只对最左边的边缘感兴趣。这是一般的吗?Scipy可以帮你找到凸面外壳:是的,但那条线不是凸面外壳。OP想要接近点的东西,即使它们的“边”不是凸的。