将二维数组数据视为定义形状的像素 - 是否可以创建内部和表面?
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()
假设我在 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()