是否有 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
。我可以使用numpy
或scipy
中的哪种方法来修剪二维数组的零点?
>>> 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]]
请注意,通过添加nearest
和farthest
,这种方法也可以很容易地应用于3D 数组,它们分别是np.min
和np.max
的nzero[2]
【讨论】:
以上是关于是否有 SciPy 方法来自动裁剪图像,即。 e.从 2d `numpy.ndarray` 中修剪零? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
当我们上传图像时,是不是有任何反应原生包可以像 instagram 一样自动裁剪图像?