Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.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_Algorithm_Computer Vision_Geometry_Computational Geometry - Fatal编程技术网

Python 将一个区域分成若干部分

Python 将一个区域分成若干部分,python,algorithm,computer-vision,geometry,computational-geometry,Python,Algorithm,Computer Vision,Geometry,Computational Geometry,我有一个正方形网格,其中一些点被标记为网格子部分的中心。我希望能够将网格中的每个位置分配给正确的子部分。例如,如果区域的子部分以黑点为中心,我希望能够将红点指定给右下角的区域,因为它是最近的黑点 目前,我通过迭代每个可能的红点,并比较它与每个黑点的距离来实现这一点。但是,网格中的黑点的宽度、长度和数量都非常高,所以我想知道是否有更有效的算法 我的特定数据的格式是这样的,其中数字只是与给定示例相对应的占位符: black_dots = [(38, 8), (42, 39), (5, 14), (6

我有一个正方形网格,其中一些点被标记为网格子部分的中心。我希望能够将网格中的每个位置分配给正确的子部分。例如,如果区域的子部分以黑点为中心,我希望能够将红点指定给右下角的区域,因为它是最近的黑点

目前,我通过迭代每个可能的红点,并比较它与每个黑点的距离来实现这一点。但是,网格中的黑点的宽度、长度和数量都非常高,所以我想知道是否有更有效的算法

我的特定数据的格式是这样的,其中数字只是与给定示例相对应的占位符:

black_dots = [(38, 8), (42, 39), (5, 14), (6, 49)]
grid = [[0 for i in range(0, 50)] for j in range(0, 50)]
作为参考,在示例中,我希望能够用整数1、2、3、4填充网格,这取决于它们是否最接近1、2、3、,或者第四个条目以黑点结束,这将允许我创建类似于下图的内容,其中每个整数对应一个彩色点,留作显示


总而言之,有什么更有效的方法来解决这个问题吗?

您可以使用广度优先遍历来解决这个问题

创建先进先出队列。队列首先遍历宽度

创建一个访问掩码,指示网格中的单元格是否已添加到队列中。将掩码设置为false

创建一个父掩码,指示单元格最终属于哪个黑点

将所有黑点放入队列中,在访问的掩码中标记它们,并在父掩码中为它们分配唯一的ID

开始从队列中逐个弹出单元格。对于每个单元,迭代单元的邻居。将每个邻居放入队列,将其标记为Visited,并将其在Parent中的值设置为与刚才弹出的单元格的值相等

继续,直到队列为空

宽度优先遍历产生一个从每个源单元格黑点向外扩展的波。因为所有的波都以相同的速度在你的网格中传播,所以每一个波都会吞噬离其源头最近的细胞


这将及时解决问题。

您可以使用宽度优先遍历来解决此问题

创建先进先出队列。队列首先遍历宽度

创建一个访问掩码,指示网格中的单元格是否已添加到队列中。将掩码设置为false

创建一个父掩码,指示单元格最终属于哪个黑点

将所有黑点放入队列中,在访问的掩码中标记它们,并在父掩码中为它们分配唯一的ID

开始从队列中逐个弹出单元格。对于每个单元,迭代单元的邻居。将每个邻居放入队列,将其标记为Visited,并将其在Parent中的值设置为与刚才弹出的单元格的值相等

继续,直到队列为空

宽度优先遍历产生一个从每个源单元格黑点向外扩展的波。因为所有的波都以相同的速度在你的网格中传播,所以每一个波都会吞噬离其源头最近的细胞


这及时解决了问题。

如果我理解正确,您真正需要的是构建您中心的Voronoi图:

它可以非常有效地构造,计算复杂度与计算其凸包类似

Voronoi图允许您构建最佳多边形或围绕中心,从而划定最接近中心的区域

有了Voronoi图,任务就简化为检测红点所在的多边形。因为Voronoi单元是凸的,所以需要一个算法来确定一个点是否在凸多边形内。但是,遍历所有多边形会增加复杂性

有几种加速点定位的算法,因此可以在Olog n中进行:

另见


如果我理解正确,你真正需要的是构建你中心的Voronoi图:

它可以非常有效地构造,计算复杂度与计算其凸包类似

Voronoi图允许您构建最佳多边形或围绕中心,从而划定最接近中心的区域

有了Voronoi图,任务就简化为检测红点所在的多边形。因为Voronoi单元是凸的,所以需要一个算法来确定一个点是否在凸多边形内。但是,遍历所有多边形会增加复杂性

有几种加速点定位的算法,因此可以在Olog n中进行:

另见


通过两次扫描线过程,可以在线性时间内有效地构建8向Voronoi图,而不是像素数。8路意味着将距离评估为车辆的长度 两个像素之间的最短8连通路径

为每个中心指定一种不同的颜色,并创建一个与图像大小相同的距离数组,在中心处初始化为0,在其他位置初始化为无穷大

在自上而下/左-右过程中,将所有像素的距离更新为四个相邻W、NW、N和NE的距离中的最小值加上一,并将达到最小值的相邻颜色分配给当前像素

在自底向上/左右传递中,将所有像素的距离更新为当前距离和四个相邻距离E、SE、S、SW加上一的最小值,并将达到最小值或保持当前颜色的相邻颜色指定给当前像素

也可以在线性时间内高效地计算欧几里德-沃罗诺图,但这需要更复杂的算法。它可以根据精彩的论文提出一种计算距离的通用算法
A.MEIJSTER“J.B.T.M.ROERDINK和W.H.HESSELINK”在线性时间内进行的变换,必须通过考虑导致最小距离的邻居来增强。通过两次扫描线处理,可以在线性时间内有效地构建8向Voronoi图。8路表示距离被评估为两个像素之间最短8路连接路径的长度

为每个中心指定一种不同的颜色,并创建一个与图像大小相同的距离数组,在中心处初始化为0,在其他位置初始化为无穷大

在自上而下/左-右过程中,将所有像素的距离更新为四个相邻W、NW、N和NE的距离中的最小值加上一,并将达到最小值的相邻颜色分配给当前像素

在自底向上/左右传递中,将所有像素的距离更新为当前距离和四个相邻距离E、SE、S、SW加上一的最小值,并将达到最小值或保持当前颜色的相邻颜色指定给当前像素

也可以在线性时间内高效地计算欧几里德-沃罗诺图,但这需要更复杂的算法。它可以根据精彩的论文提出一种计算距离的通用算法
A.MEIJSTER“J.B.T.M.ROERDINK和W.H.HESSELINK的线性时间变换,必须通过计算导致最小距离的相邻点来增强这一点。

BFS从每个点同时开始如何?您要寻找的是中心的Voronoi图。BFS从每个点同时开始如何?您要寻找的是中心的Voronoi图这种方法不是最好的主意。Voronoi图的计算速度确实非常快,除非中心数很大,否则它甚至可以是N阶,其中N是像素数。但是,从Voronoi单元到有效的点位置结构的转换并不那么酷,对于K个中心,填充地图的总工作量将是N LogK。一个更好的选择是使用扫描线算法填充每个Voronoi单元,这可以在时间OA中完成,其中A是多边形面积加上小的开销(取决于边的数量),总共为on+K Log K。这种方法不是最好的方法。Voronoi图的计算速度确实非常快,除非中心数很大,否则它甚至可以是N阶,其中N是像素数。但是,从Voronoi单元到有效的点位置结构的转换并不那么酷,对于K个中心,填充地图的总工作量将是N LogK。一个更好的选择是用扫描线算法填充每个Voronoi单元,这可以在时间OA中完成,其中A是多边形区域加上小的开销,具体取决于边的数量,总共为on+K Log K。