我正在处理通过numpy.array()创建的数组,并且需要在模拟图像的画布上绘制点。由于数组的中央部分周围包含有意义的数据有很多零值,因此我想“修剪”数组,擦除仅包含仅包含零的零的零行的列。

因此,我想知道一些本机的numpy函数,甚至要知道“修剪”或找到“边界框”以仅切成数组的数据部分。

(由于这是一个概念上的问题,所以我没有放任何代码,对不起,如果我愿意,我非常适合发布。)

谢谢阅读

有帮助吗?

解决方案

下面的代码,从 这个答案 在我的测试中运行最快:

def bbox2(img):
    rows = np.any(img, axis=1)
    cols = np.any(img, axis=0)
    ymin, ymax = np.where(rows)[0][[0, -1]]
    xmin, xmax = np.where(cols)[0][[0, -1]]
    return img[ymin:ymax+1, xmin:xmax+1]

接受的答案使用 argwhere 工作了,但是跑步较慢。我的猜测是,是因为 argwhere 分配一个巨大的输出数端索引。我在一个大的2D阵列(1024 x 1024图像,大约50x100非零区域)上进行了测试。

其他提示

这应该做到:

from numpy import array, argwhere

A = array([[0, 0, 0, 0, 0, 0, 0],
           [0, 0, 0, 0, 0, 0, 0],
           [0, 0, 1, 0, 0, 0, 0],
           [0, 0, 1, 1, 0, 0, 0],
           [0, 0, 0, 0, 1, 0, 0],
           [0, 0, 0, 0, 0, 0, 0],
           [0, 0, 0, 0, 0, 0, 0]])

B = argwhere(A)
(ystart, xstart), (ystop, xstop) = B.min(0), B.max(0) + 1 
Atrim = A[ystart:ystop, xstart:xstop]

就像是:

empty_cols = sp.all(array == 0, axis=0)
empty_rows = sp.all(array == 0, axis=1)

最终的阵列将是1D BOOLIAN阵列。从两端上循环以找到“边界框”。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top