Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从Python中的二维点云在正方形网格上创建二进制掩码?_Python_Image_Numpy_Matplotlib_Points - Fatal编程技术网

如何从Python中的二维点云在正方形网格上创建二进制掩码?

如何从Python中的二维点云在正方形网格上创建二进制掩码?,python,image,numpy,matplotlib,points,Python,Image,Numpy,Matplotlib,Points,我有一个二维点云的X和Y坐标,我想将其映射到一个二维均匀网格上,分辨率为imageResolution最初为全零。我希望网格中覆盖2D点云的所有像素都包含一个,以生成二值图像 请注意,在我的2D点云和统一网格中都有大量的点,因此循环在这里不是有效的解决方案 我看过凸包,但我的点不一定在凸集内 我尝试了以下代码,但它没有给我正确的二进制映射,因为它只将1s分配给距离点云中的点最近的网格点(参见下图): 请看这张图片,它显示了我的2D点云,我想要的二进制地图,以及我从上面的代码中得到的当前二进制地图

我有一个二维点云的X和Y坐标,我想将其映射到一个二维均匀网格上,分辨率为
imageResolution
最初为全零。我希望网格中覆盖2D点云的所有像素都包含一个,以生成二值图像

请注意,在我的2D点云和统一网格中都有大量的点,因此循环在这里不是有效的解决方案

我看过凸包,但我的点不一定在凸集内

我尝试了以下代码,但它没有给我正确的二进制映射,因为它只将1s分配给距离点云中的点最近的网格点(参见下图):

请看这张图片,它显示了我的2D点云,我想要的二进制地图,以及我从上面的代码中得到的当前二进制地图。请注意,红色像素在最后一张图像中很难看到

如何从Python中的二维点云在正方形网格上创建二进制掩码


谢谢

免责声明::未经测试的建议

如果我理解正确,您应该标记像素的邻域,而不是用
1
标记单个像素

您可以尝试在binaryMap[xIndex,yIndex]=1之前插入以下行:

DELTA_UPPER=2                                # Param. Needs fine-tuning
delta = np.arange(DELTA_UPPER).reshape(-1,1)
xIndex = xIndex + delta
xIndex [xIndex >= imageResolution] = imageResolution-1
yIndex = yIndex + delta
yIndex [yIndex >= imageResolution] = imageResolution-1

x_many, y_many = np.broadcast_arrays (xIndex[:,None], yIndex)

xIndex = x_many.reshape(-1)
yIndex = y_many.reshape(-1)
注意:


DELTA_UPPER
是一个参数,您必须通过使用它进行微调。(可能以DELTA_UPPER=3开头)

未测试的代码

在进一步澄清的基础上,发布第二个答案,以便更好地索引
二进制映射
,因为
包含浮点数

imageResoluton = 256
MAX_X = # Fill in here the max x value ever possible in `points`
MIN_X = # Fill in here the min x value ever possible in `points`
MAX_Y = # Fill in here the max y value ever possible in `points`
MIN_Y = # Fill in here the min y value ever possible in `points`

SCALE_FAC = imageResolution / max(MAX_X-MIN_X, MAX_Y-MIN_Y)

X = np.around(SCALE_FAC * points[:,0]).astype(np.int64)
Y = np.around(SCALE_FAC * points[:,1]).astype(np.int64)
X [X >= imageResolution] = imageResolution-1
Y [Y >= imageResolution] = imageResolution-1

binaryMap[X, Y] = 1

(不需要
查找索引()

嗨,谢谢你的回答。如果我标记一个像素邻域,形状的边界将无法在二进制文件上正确表示map@InternetUser0947引用:“我尝试了以下代码,但它没有给我正确的二进制映射,因为它只将1s分配给距离点云中的点最近的网格点。”。对我来说,这听起来像是你要求的关键。(我认为这意味着绘图的精确性导致事情变得不那么明显)。因此我发布了这个解决方案。请您重新澄清当前输出中的错误以及您对输出的期望。谢谢。@InternetUser0947——如果您正在寻找一种更精确的绘图方法,也许您可以尝试
binaryMap[X,Y]=1
,而不是
binaryMap[xIndex,yIndex]=1
(正如您已经定义的
X=points[:,0]
Y=points[:,1]
)。这假设
中的值严格为
范围(图像分辨率)
中的整数。
find_index()
函数需要什么?我是不是遗漏了什么?请看我在提问时的照片。特别是,请查看我想要的输出,与当前输出进行比较。我基本上希望在二维点云所在的域中,所有的点都是1,其他的点都是0。关于你的第二点,X和Y是1)不是整数,2)与2D网格点不重合的点。请看我刚刚发布的第二个答案。它舍入
X
Y
中的值,并确保它们可以安全地用作
binaryMap
的索引。请让我知道它是否有效。你好,这不起作用。因为X和Y是独立的点云坐标。它们与统一网格不重合。它们只是构成形状的点分散的x坐标和y坐标。
中的值是否有定义的最大和最小范围?一些永远不会超过的范围?如果是这样,您可以找到缩放因子,将
点的所有x和y值缩放到256x256的比例grid@InternetUser0947--我编辑了这个答案,以显示缩放逻辑的样子。让我知道这是否可行我刚刚尝试了这个解决方案,我可以确认它仍然不起作用。它生成的输出看起来类似于第三幅图像,其中只有几个点的值为1。我想要第二张图片。这可能意味着云太稀疏了,看不见(点之间的距离太远。这意味着,你可能需要标记像素的邻域,而不是单个像素。你能告诉我你在
点中有多少点吗?
?也许这个答案会有所帮助:Hi@user6386471,griddata使用凸包的概念,而我的数据点不一定在凸集中。我还有n关于凸数据点
imageResoluton = 256
MAX_X = # Fill in here the max x value ever possible in `points`
MIN_X = # Fill in here the min x value ever possible in `points`
MAX_Y = # Fill in here the max y value ever possible in `points`
MIN_Y = # Fill in here the min y value ever possible in `points`

SCALE_FAC = imageResolution / max(MAX_X-MIN_X, MAX_Y-MIN_Y)

X = np.around(SCALE_FAC * points[:,0]).astype(np.int64)
Y = np.around(SCALE_FAC * points[:,1]).astype(np.int64)
X [X >= imageResolution] = imageResolution-1
Y [Y >= imageResolution] = imageResolution-1

binaryMap[X, Y] = 1