gpt4 book ai didi

python - 从 3D numpy 像素数组中删除空的 'rows' 和 'columns'

转载 作者:行者123 更新时间:2023-11-28 22:39:28 25 4
gpt4 key购买 nike

我基本上想用 numpy 裁剪图像——我有一个 3 维 numpy.ndarray 对象,即:

[ [0,0,0,0], [255,255,255,255], ....]
[0,0,0,0], [255,255,255,255], ....] ]

我想删除空格的地方,在上下文中,已知空格是 [0,0,0,0] 的整行或整列。

对于这个例子,让每个像素只是一个数字,我试图从本质上做到这一点:

鉴于此:*编辑:选择一个稍微复杂的例子来澄清

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

我正在尝试创建这个:

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

我可以用循环暴力破解,但直觉上我觉得 numpy 有更好的方法来做到这一点。

最佳答案

通常,您需要查看 scipy.ndimage.labelscipy.ndimage.find_objects 来提取满足条件的连续区域的边界框。

但是,在这种情况下,您可以使用“普通”numpy 轻松完成。

我假设您在这里有一个 nrows x ncols x nbands 数组。 nbands x nrows x ncols 的其他约定也很常见,因此请查看数组的形状。

考虑到这一点,您可能会做类似的事情:

mask = im == 0
all_white = mask.sum(axis=2) == 0
rows = np.flatnonzero((~all_white).sum(axis=1))
cols = np.flatnonzero((~all_white).sum(axis=0))

crop = im[rows.min():rows.max()+1, cols.min():cols.max()+1, :]

对于您的 2D 示例,它看起来像:

import numpy as np

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

mask = im == 0
rows = np.flatnonzero((~mask).sum(axis=1))
cols = np.flatnonzero((~mask).sum(axis=0))

crop = im[rows.min():rows.max()+1, cols.min():cols.max()+1]
print crop

让我们稍微分解一下二维示例。

In [1]: import numpy as np

In [2]: im = np.array([[0,0,0,0,0,0],
...: [0,0,1,1,1,0],
...: [0,1,1,0,1,0],
...: [0,0,0,1,1,0],
...: [0,0,0,0,0,0]])

好的,现在让我们创建一个满足我们条件的 bool 数组:

In [3]: mask = im == 0

In [4]: mask
Out[4]:
array([[ True, True, True, True, True, True],
[ True, True, False, False, False, True],
[ True, False, False, True, False, True],
[ True, True, True, False, False, True],
[ True, True, True, True, True, True]], dtype=bool)

另外,请注意 ~ 运算符在 bool 数组上的作用与 logical_not 相同:

In [5]: ~mask
Out[5]:
array([[False, False, False, False, False, False],
[False, False, True, True, True, False],
[False, True, True, False, True, False],
[False, False, False, True, True, False],
[False, False, False, False, False, False]], dtype=bool)

考虑到这一点,要找到所有元素都为假的行,我们可以跨列求和:

In [6]: (~mask).sum(axis=1)
Out[6]: array([0, 3, 3, 2, 0])

如果没有元素为 True,我们将得到 0。

与查找所有元素均为假的列类似,我们可以跨行求和:

In [7]: (~mask).sum(axis=0)
Out[7]: array([0, 1, 2, 2, 3, 0])

现在我们需要做的就是找到第一个和最后一个不为零的。 np.flatnonzerononzero 简单一些,在这种情况下:

In [8]: np.flatnonzero((~mask).sum(axis=1))
Out[8]: array([1, 2, 3])

In [9]: np.flatnonzero((~mask).sum(axis=0))
Out[9]: array([1, 2, 3, 4])

然后,您可以根据最小/最大非零元素轻松切出区域:

In [10]: rows = np.flatnonzero((~mask).sum(axis=1))

In [11]: cols = np.flatnonzero((~mask).sum(axis=0))

In [12]: im[rows.min():rows.max()+1, cols.min():cols.max()+1]
Out[12]:
array([[0, 1, 1, 1],
[1, 1, 0, 1],
[0, 0, 1, 1]])

关于python - 从 3D numpy 像素数组中删除空的 'rows' 和 'columns',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34730738/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com