洪水填充 NumPy 数组 `numpy.ndarray`,i。 e.为元素分配新值并更改相同值的相邻元素
Flood fill NumPy Array `numpy.ndarray`, i. e. assign new value to element and change neighboring elements of the same value, too
另一个类似的 post 称为 Flood Fill in Python 是一个关于洪水填充的非常普遍的问题,答案仅包含一个广泛的伪代码示例。我正在寻找 numpy
或 scipy
.
的明确解决方案
我们以这个数组为例:
a = np.array([
[0, 1, 1, 1, 1, 0],
[0, 0, 1, 2, 1, 1],
[0, 1, 1, 1, 1, 0]
])
对于选择元素 0, 0
并用值 3
进行洪水填充,我预计:
[
[3, 1, 1, 1, 1, 0],
[3, 3, 1, 2, 1, 1],
[3, 1, 1, 1, 1, 0]
]
对于选择元素 0, 1
并用值 3
进行洪水填充,我预计:
[
[0, 3, 3, 3, 3, 0],
[0, 0, 3, 2, 3, 3],
[0, 3, 3, 3, 3, 0]
]
对于选择元素 0, 5
并用值 3
进行洪水填充,我预计:
[
[0, 1, 1, 1, 1, 3],
[0, 0, 1, 2, 1, 1],
[0, 1, 1, 1, 1, 0]
]
这应该是一个相当基本的操作,不是吗?我忽略了哪个 numpy
或 scipy
方法?
方法 #1
模块 scikit-image
提供 built-in 与 skimage.segmentation.flood_fill
-
做同样的事情
from skimage.morphology import flood_fill
flood_fill(image, (x, y), newval)
样本运行 -
In [17]: a
Out[17]:
array([[0, 1, 1, 1, 1, 0],
[0, 0, 1, 2, 1, 1],
[0, 1, 1, 1, 1, 0]])
In [18]: flood_fill(a, (0, 0), 3)
Out[18]:
array([[3, 1, 1, 1, 1, 0],
[3, 3, 1, 2, 1, 1],
[3, 1, 1, 1, 1, 0]])
In [19]: flood_fill(a, (0, 1), 3)
Out[19]:
array([[0, 3, 3, 3, 3, 0],
[0, 0, 3, 2, 3, 3],
[0, 3, 3, 3, 3, 0]])
In [20]: flood_fill(a, (0, 5), 3)
Out[20]:
array([[0, 1, 1, 1, 1, 3],
[0, 0, 1, 2, 1, 1],
[0, 1, 1, 1, 1, 0]])
方法 #2
我们可以使用 skimage.measure.label
和一些 array-masking
-
from skimage.measure import label
def floodfill_by_xy(a,xy,newval):
x,y = xy
l = label(a==a[x,y])
a[l==l[x,y]] = newval
return a
要使用基于 SciPy 的 label
函数 - scipy.ndimage.measurements.label
,它大部分是相同的 -
from scipy.ndimage.measurements import label
def floodfill_by_xy_scipy(a,xy,newval):
x,y = xy
l = label(a==a[x,y])[0]
a[l==l[x,y]] = newval
return a
注意:这些将作为 in-situ 编辑。
另一个类似的 post 称为 Flood Fill in Python 是一个关于洪水填充的非常普遍的问题,答案仅包含一个广泛的伪代码示例。我正在寻找 numpy
或 scipy
.
我们以这个数组为例:
a = np.array([
[0, 1, 1, 1, 1, 0],
[0, 0, 1, 2, 1, 1],
[0, 1, 1, 1, 1, 0]
])
对于选择元素 0, 0
并用值 3
进行洪水填充,我预计:
[
[3, 1, 1, 1, 1, 0],
[3, 3, 1, 2, 1, 1],
[3, 1, 1, 1, 1, 0]
]
对于选择元素 0, 1
并用值 3
进行洪水填充,我预计:
[
[0, 3, 3, 3, 3, 0],
[0, 0, 3, 2, 3, 3],
[0, 3, 3, 3, 3, 0]
]
对于选择元素 0, 5
并用值 3
进行洪水填充,我预计:
[
[0, 1, 1, 1, 1, 3],
[0, 0, 1, 2, 1, 1],
[0, 1, 1, 1, 1, 0]
]
这应该是一个相当基本的操作,不是吗?我忽略了哪个 numpy
或 scipy
方法?
方法 #1
模块 scikit-image
提供 built-in 与 skimage.segmentation.flood_fill
-
from skimage.morphology import flood_fill
flood_fill(image, (x, y), newval)
样本运行 -
In [17]: a
Out[17]:
array([[0, 1, 1, 1, 1, 0],
[0, 0, 1, 2, 1, 1],
[0, 1, 1, 1, 1, 0]])
In [18]: flood_fill(a, (0, 0), 3)
Out[18]:
array([[3, 1, 1, 1, 1, 0],
[3, 3, 1, 2, 1, 1],
[3, 1, 1, 1, 1, 0]])
In [19]: flood_fill(a, (0, 1), 3)
Out[19]:
array([[0, 3, 3, 3, 3, 0],
[0, 0, 3, 2, 3, 3],
[0, 3, 3, 3, 3, 0]])
In [20]: flood_fill(a, (0, 5), 3)
Out[20]:
array([[0, 1, 1, 1, 1, 3],
[0, 0, 1, 2, 1, 1],
[0, 1, 1, 1, 1, 0]])
方法 #2
我们可以使用 skimage.measure.label
和一些 array-masking
-
from skimage.measure import label
def floodfill_by_xy(a,xy,newval):
x,y = xy
l = label(a==a[x,y])
a[l==l[x,y]] = newval
return a
要使用基于 SciPy 的 label
函数 - scipy.ndimage.measurements.label
,它大部分是相同的 -
from scipy.ndimage.measurements import label
def floodfill_by_xy_scipy(a,xy,newval):
x,y = xy
l = label(a==a[x,y])[0]
a[l==l[x,y]] = newval
return a
注意:这些将作为 in-situ 编辑。