是否有 SciPy 自动裁剪图像的方法,我。秒。 trim 来自 2d `numpy.ndarray` 的零点?

Is there a SciPy method to autocrop an image, i. e. trim zeros from a 2d `numpy.ndarray`?

1d numpy.ndarraynumpy.trim_zerosnumpyscipy 中的哪种方法可以用于 trim 二维数组的零?

>>> import numpy as np
>>> a = np.array([[0, 0, 0, 0], [4, 1, 2, 0], [0, 3, 6, 0], [0, 0, 0, 0], [0, 0, 0, 0]])
>>> a
array([[0, 0, 0, 0],
       [4, 1, 2, 0],
       [0, 3, 6, 0],
       [0, 0, 0, 0],
       [0, 0, 0, 0]])

我想得到的结果:

array([[4, 1, 2],
       [0, 3, 6]])

您可以尝试使用一些 numpy 方法来理解列表:

>>> np.array([sub[~(sub == 0)].tolist() for sub in a if sub[sub != 0].tolist()])
array([[4, 1, 2], [3, 6]], dtype=object)
>>> 

我会搜索最左边、最右边、最上面和最下面的非零值的位置,然后按照以下方式对该数组进行切片:

import numpy as np
a = np.array([[0, 0, 0, 0], [4, 1, 2, 0], [0, 3, 6, 0], [0, 0, 0, 0], [0, 0, 0, 0]])
nzero = np.nonzero(a)
top,bottom = np.min(nzero[0]),np.max(nzero[1])
left,right = np.min(nzero[1]),np.max(nzero[1])
out = a[top:bottom+1,left:right+1] # +1 as second argument is exclusive
print(out)

输出:

[[4 1 2]
 [0 3 6]]

请注意,通过添加 nearestfarthest,也可以很容易地将此​​方法应用于 3D 数组,它们分别是 np.minnp.max of [=16] =]