Python 带孔numpy阵列形状边界的求法

Python 带孔numpy阵列形状边界的求法,python,numpy,scipy-spatial,Python,Numpy,Scipy Spatial,我试图沿着数组中由1表示的形状的边界获得一组点。我尝试使用 SimPy。Sual.ValueSokes 。但是由凸包创建的边界没有考虑到形状中间的孔(我也需要围绕孔的边界)。这就是我试图从数组中创建的边界。我如何解释形状上的洞 着色区域是计算边界点的区域。 这有点老套,但如果用正确的内核(v4或v8)卷积零,则得到外部加边界,因此如果对内部进行和操作,则只得到边界。下面是一个例子: import numpy as np from scipy.signal import convolve2d

我试图沿着数组中由1表示的形状的边界获得一组点。我尝试使用<代码> SimPy。Sual.ValueSokes 。但是由凸包创建的边界没有考虑到形状中间的孔(我也需要围绕孔的边界)。这就是我试图从数组中创建的边界。我如何解释形状上的洞

着色区域是计算边界点的区域。


这有点老套,但如果用正确的内核(v4或v8)卷积零,则得到外部加边界,因此如果对内部进行
操作,则只得到边界。下面是一个例子:

import numpy as np
from scipy.signal import convolve2d

arr = np.array([
    [1,1,1,1,1,1,0,0,0,1,0],
    [1,1,1,1,1,1,0,0,0,1,0],
    [1,1,0,0,0,1,1,1,1,1,0],
    [1,1,0,1,1,1,1,1,0,0,0],
    [1,1,1,1,1,1,0,0,0,0,0],
    [0,1,1,1,1,0,0,0,0,0,0],
])

# v4 example, 
kernel = np.array([
    [0,1,0],
    [1,0,1],
    [0,1,0],
])

# you have to zero pad first in order to get the edges
padded = np.pad(arr, ((1, 1), (1, 1)), 'constant', constant_values=0)

# the `astype(bool)` is for normalization
# the `and` operation in this case is the elementwise product
frontier = convolve2d(1-padded, kernel, mode='valid').astype(bool) * arr

我不清楚图像,例如,为什么
(3,2)
是边界的一部分,但
(1,3)
不是?@vlizana更新了图像以显示我正试图从感谢中划分边界的图像,但我仍然无法判断您是选择v4还是v8边界。例如,在您刚刚上传的图片中,使用v8邻域,每个点(1)都将是边界的一部分,在v4类型中,有一些是内部点。在图片中,我绘制了一个v4边界。我认为v4的方法与v8的方法相同
import numpy as np
from scipy.signal import convolve2d

arr = np.array([
    [1,1,1,1,1,1,0,0,0,1,0],
    [1,1,1,1,1,1,0,0,0,1,0],
    [1,1,0,0,0,1,1,1,1,1,0],
    [1,1,0,1,1,1,1,1,0,0,0],
    [1,1,1,1,1,1,0,0,0,0,0],
    [0,1,1,1,1,0,0,0,0,0,0],
])

# v4 example, 
kernel = np.array([
    [0,1,0],
    [1,0,1],
    [0,1,0],
])

# you have to zero pad first in order to get the edges
padded = np.pad(arr, ((1, 1), (1, 1)), 'constant', constant_values=0)

# the `astype(bool)` is for normalization
# the `and` operation in this case is the elementwise product
frontier = convolve2d(1-padded, kernel, mode='valid').astype(bool) * arr