web-dev-qa-db-ja.com

派手な配列をセンタークロップする

派手な配列[​​幅x高さx色]を事前定義された小さい次元にトリミングしようとしています。

私は自分のやりたいことを実行できるものを見つけましたが、それは[幅x高さ]の配列に対してのみ機能します。私はそれが色のために余分な次元を持っている派手な配列でどのように機能するかを知りません。

派手な画像の切り抜き中央部分

8
Vic

numpyを使用すると、範囲インデックスを使用できます。リストx[](単一次元)があるとすると、x[start:end]としてインデックスを作成できます。これはスライスと呼ばれます。

スライスは、次のような高次元でも使用できます。

x[start1:end1][start2:end2][start3:end3]

これはあなたが探しているものかもしれません。

ただし、これは新しい配列を生成しない(つまり、コピーしない)ことに注意してください。これに対する変更はxに反映されます。

あなたがリンクした質問から、それはコードのほんの小さな変更です:

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, :]

追加されたのは別の:を最後の行の終わりに、(未使用)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]]])
2
zbw

numpyはあらゆる次元で機能します

import numpy as np
X = np.random.normal(0.1, 1., [10,10,10])
X1 = X[2:5, 2:5, 2:5]
print(X1.shape)

最後の出力ステートメントは[3,3,3]配列になります。

0
narasimman