是否有 SciPy 方法来自动裁剪图像,即。 e.从 2d `numpy.ndarray` 中修剪零? [复制]

Posted

技术标签:

【中文标题】是否有 SciPy 方法来自动裁剪图像,即。 e.从 2d `numpy.ndarray` 中修剪零? [复制]【英文标题】:Is there a SciPy method to autocrop an image, i. e. trim zeros from a 2d `numpy.ndarray`? [duplicate] 【发布时间】:2019-05-29 09:51:51 【问题描述】:

对于 1d numpy.ndarray,有 numpy.trim_zeros。我可以使用numpyscipy 中的哪种方法来修剪二维数组的零点?

>>> 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]])

【问题讨论】:

如果第二列全为零怎么办? a=np.transpose(a[np.sum(a,1)==0]) 两次 【参考方案1】:

您可以使用一些numpy 方法尝试列表推导:

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

【讨论】:

【参考方案2】:

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

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.maxnzero[2]

【讨论】:

以上是关于是否有 SciPy 方法来自动裁剪图像,即。 e.从 2d `numpy.ndarray` 中修剪零? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

c# 自动裁剪图像

当我们上传图像时,是不是有任何反应原生包可以像 instagram 一样自动裁剪图像?

使用 Imagemagick 从图像中自动裁剪文本(签名)并更改背景颜色

Android自动裁剪相机捕获的图像

PHP图像从顶部,底部,左侧和右侧裁剪

是否有 JMagick 和 ImageBuffer/ImageIO for Java 的替代品来调整/裁剪图像?