中心裁剪一个 numpy 数组

Vic*_*Vic 10 python numpy crop

我正在尝试将一个 numpy 数组 [宽 x 高 x 颜色] 裁剪为预定义的较小尺寸。

我发现了一些应该做我想做的事情,但它只适用于 [width x height] 数组。我不知道如何使它适用于具有额外颜色维度的 numpy 数组。

裁剪 numpy 图像的中心部分

Aja*_*iya 10

有了numpy您可以使用一系列指标。假设您有一个列表x[](单维),您可以对其进行索引,因为x[start:end]这称为切片。

切片也可以用于更高的维度

x[start1:end1, start2:end2, start3:end3]
Run Code Online (Sandbox Code Playgroud)

这可能就是您要寻找的。

尽管记住这不会生成新数组(即它不会复制)。对此的更改将反映到x.

感谢@coderforlife指出我之前记下的错误符号中的错误。

  • 截至今天,更改不会反映到同一个数组中,而是返回一个新数组(python3)。 (2认同)

zbw*_*zbw 7

从您链接到的问题来看,这只是代码中的一个小变化:

def crop_center(img,cropx,cropy):
    y,x,c = img.shape
    startx = x//2 - cropx//2
    starty = y//2 - cropy//2    
    return img[starty:starty+cropy, startx:startx+cropx, :]
Run Code Online (Sandbox Code Playgroud)

添加的只是:最后一行末尾的另一个,以及c形状解包的一个(未使用的)。

>>> img
array([[[ 18,   1,  17],
        [  1,  13,   3],
        [  2,  17,   2],
        [  5,   9,   3],
        [  0,   6,   0]],

       [[  1,   4,  11],
        [  7,   9,  24],
        [  5,   1,   5],
        [  7,   3,   0],
        [116,   1,  55]],

       [[  1,   4,   0],
        [  1,   1,   3],
        [  2,  11,   4],
        [ 20,   3,  33],
        [  2,   7,  10]],

       [[  3,   3,   6],
        [ 47,   5,   3],
        [  4,   0,  10],
        [  2,   1,  35],
        [  6,   0,   1]],

       [[  2,   9,   0],
        [ 17,  13,   4],
        [  3,   0,   1],
        [ 16,   1,   3],
        [ 19,   4,   0]],

       [[  8,  19,   3],
        [  9,  16,   7],
        [  0,  12,   2],
        [  4,  68,  10],
        [  4,  11,   1]],

       [[  0,   1,  14],
        [  0,   0,   4],
        [ 13,   1,   4],
        [ 11,  17,   5],
        [  7,   0,   0]]])
>>> crop_center(img,3,3)
array([[[ 1,  1,  3],
        [ 2, 11,  4],
        [20,  3, 33]],

       [[47,  5,  3],
        [ 4,  0, 10],
        [ 2,  1, 35]],

       [[17, 13,  4],
        [ 3,  0,  1],
        [16,  1,  3]]])
Run Code Online (Sandbox Code Playgroud)