【问题标题】:Getting the boundary of numpy array shape with a hole用孔获取numpy数组形状的边界
【发布时间】:2019-04-15 20:49:23
【问题描述】:

我正在尝试沿数组中用 1 表示的形状的边界获取点的 ndarray。我尝试使用scipy.spatial.ConvexHull,但凸包创建的边界并没有考虑到形状中间的孔(我也需要围绕孔的边界)。这是我试图从数组中创建的那种边界。我该如何解释形状上的洞?

彩色区域是应该计算边界点的区域。

import numpy as np
from skimage.measure import label, regionprops
import matplotlib.pyplot as plt
from scipy.spatial import Voronoi, voronoi_plot_2d, ConvexHull


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],])

coords = []
for x in range(arr.shape[0]):
    for y in range(arr.shape[1]):
        if arr[x][y] > 0:
            tile = [x,y]
            coords.append(tile)
            # print("tile", tile)
coords = np.array(coords)
# print(coords)

hull = ConvexHull(coords)
plt.plot(coords[:,0], coords[:,1], 'o')
for simplex in hull.simplices:
    plt.plot(coords[simplex, 0], coords[simplex, 1], 'k-')

plt.plot(coords[hull.vertices,0], coords[hull.vertices,1], 'r--', lw=2)
plt.plot(coords[hull.vertices[0],0], coords[hull.vertices[0],1], 'ro')

【问题讨论】:

  • 图像对我来说不是很清楚,例如,为什么(3, 2) 是边界的一部分而(1, 3) 不是?
  • @vlizana 更新了图像以显示我正在尝试从中创建边界的图像
  • 谢谢,但我仍然不知道您是要进入 v4 还是 v8 前沿。例如,在您刚刚上传的图片中,使用 v8 邻域,每个点 (1) 都是边界的一部分,而在 v4 类型中,有一些是内部点。
  • 在图片中我画了一个v4边界。我认为 v4 的方法与 v8 的方法相同

标签: python numpy scipy-spatial


【解决方案1】:

这有点 hacky,但是如果你用正确的内核(v4 或 v8)卷积零,你会得到外部部分加上边界,所以如果你对内部部分进行 and 类型的操作,你会得到只有边境。这是一个例子:

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

【讨论】:

    猜你喜欢
    • 2018-02-03
    • 2015-10-02
    • 2017-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-12
    • 1970-01-01
    相关资源
    最近更新 更多