gpt4 book ai didi

二进制二维矩阵的 python 轮廓

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:59:10 28 4
gpt4 key购买 nike

我想计算二元 NxM 矩阵中某个形状周围的凸包。凸包算法需要一个坐标列表,所以我采用 numpy.argwhere(im) 来获得所有形状点坐标。然而,这些点中的大多数对凸包没有贡献(它们位于形状的内部)。因为凸包计算时间至少与其作为输入获得的点数成正比,所以我想出了一个想法来预先过滤掉过多的无用点,只让那些跨越轮廓的点通过。这个想法很简单,对于二进制 NxM 矩阵中的每一行,我只取最小和最大索引。例如:

im = np.array([[1,1,1,0],
[1,0,1,1],
[1,1,0,1],
[0,0,0,0],
[0,1,1,1]], dtype=np.bool)
outline = somefunc(im)

然后大纲应该是这样的(在元组中或作为 5x2 numpy 数组,我不介意):

[(0,0),(0,2),(1,0),(1,3),(2,0),(2,3),(4,1),(4,3)]

紧围绕此形状 (im) 的任何凸包必须是这些点(轮廓)的子集。换句话说,如果“somefunc()”能够有效地过滤内部点,那么它可以节省凸包计算的时间。

我有执行上述技巧的代码,但我希望有人有更聪明(读取速度更快)的方法,因为我需要多次运行它。我的代码是:

# I have a 2D binary field. random for the purpose of demonstration.
import numpy as np
im = np.random.random((320,360)) > 0.9

# This is my algorithm so far. Notice that coords is sorted.
coords = np.argwhere(im)
left = np.roll(coords[:,0], 1, axis=0) != coords[:,0]
outline = np.vstack([coords[left], coords[left[1:]], coords[-1]])

我的另一个想法是使用 Python 的 reduce(),这样我只需要遍历坐标列表一次。但是我很难找到一个好的归约函数。

如有任何帮助,我们将不胜感激!

编辑

与此同时,我发现了一种从 im 直接转到 outline 的更快方法。至少对于大图像,这要快得多。在显然没有外部解决方案的情况下,我将其作为这个问题的解决方案。

不过,如果有人知道更快的方法,请说出来:)

最佳答案

如果没有可接受的答案,我会发布我最好的工作代码作为解决方案。

def outline(im):
''' Input binary 2D (NxM) image. Ouput array (2xK) of K (y,x) coordinates
where 0 <= K <= 2*M.
'''
topbottom = np.empty((1,2*im.shape[1]), dtype=np.uint16)
topbottom[0,0:im.shape[1]] = np.argmax(im, axis=0)
topbottom[0,im.shape[1]:] = (im.shape[0]-1)-np.argmax(np.flipud(im), axis=0)
mask = np.tile(np.any(im, axis=0), (2,))
xvalues = np.tile(np.arange(im.shape[1]), (1,2))
return np.vstack([topbottom,xvalues])[:,mask].T

关于二进制二维矩阵的 python 轮廓,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1601613/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com