将二维数组数据视为定义形状的像素 - 是否可以创建内部和表面?

Treating 2d array data as pixels defining a shape - is it possible to create an inside and a surface?

假设我在 python 中有以下 array/matrix(老实说,任何语言都可以)。 A =

[0 0 0 0 0 0 0 0 0 0
 0 0 1 1 1 1 0 0 0 0
 0 1 1 1 1 1 0 0 0 0
 0 1 1 1 1 1 1 0 0 0
 0 0 1 1 1 1 1 1 0 0
 0 0 1 1 1 1 1 0 0 0
 0 0 1 1 1 1 1 0 0 0
 0 0 0 1 1 1 0 0 0 0
 0 0 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0]

是否有任何简单的方法来操纵此数组中的条目,就好像它们是像素一样。例如,是否有任何方法可以创建任意长度的内部和表面,例如:

[0 0 0 0 0 0 0 0 0 0
 0 0 1 1 1 1 0 0 0 0
 0 1 1 0 0 1 0 0 0 0
 0 1 1 0 0 0 1 0 0 0
 0 0 1 0 0 0 1 1 0 0
 0 0 1 0 0 0 1 0 0 0
 0 0 1 1 0 1 1 0 0 0
 0 0 0 1 1 1 0 0 0 0
 0 0 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0]

也许有某种方法可以递归地解决这个问题,或者可能以不同的方式,这将依赖于每个元素周围的条目。有什么想法吗?

您可以只检查每个像素的值和直接邻域:您得到的图像是 1,其中:

  • 原值为 1
  • 并且至少有一个邻居是 0

其他地方都是0。下图可能有助于说明我的意思:

  • 第一个红色块的中心像素将保持为 1,因为它在原始图像中为 1,并且有一个相邻的 0。
  • 蓝色块的中心像素将保持为 0,因为它在原始图像中为 0。
  • 绿色块的中心像素是一个有趣的情况:它在原始图像中是 1,但它的所有邻居也是 1。因此它在结果中变为0。

为每个数组条目测试这些条件。请注意边界。

如果您可以访问图像处理库,则可以采用另一种方法:创建图像的副本,errode it 一个像素,然后从原始图像中减去它。

您似乎需要边缘检测。 @maddin45 是对的,但您也可以为此使用 scikit-image,例如使用 canny 边缘检测器:

import numpy as np
from skimage import filters
import matplotlib.pyplot as plt

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

plt.figure()
plt.imshow(filters.canny(arr), interpolation='nearest')
plt.show()