2017-10-04 17 views
1

私は画像リストimage_listを使って作業しています。 image_listの各項目は、形状(X、Y、3)のnumpy配列です。 Xは高さ、Yは幅、各画像は3色のチャンネルを持つ。numpyの画像を拡大し、余分なスペースをゼロで埋めてください

すべての画像の最大幅と高さを取得し、余分なスペースがある場合は、下端と右端が0で埋められるように各画像のサイズを変更します。私は最初の部分(最大の高さと最大幅を得ることができますが、私は2番目の(サイズ変更と右と下の余分な領域をゼロで埋める)と苦労しています。サイズを変更するには

max_height = 0 
max_width = 0 
for image in image_list: 
    shape = image.shape 
    if shape[0] > max_height: 
     max_height = shape[0] 
    if shape[1] > max_width: 
     max_width = shape[1] 

、私が試してみた:

image.resize((max_height, max_width, 3)) 

をしかし、それは時々しか動作します。あなたが同じイメージを複数回繰り返す他の時間。

答えて

1

アプローチ#1

ここAは、画像の入力リストされた状態で一つのアプローチだ -

M,N = np.max([i.shape[:2] for i in A],0) 
M_ext = [M-i.shape[0] for i in A] 
N_ext = [N-i.shape[1] for i in A] 
out = [img3D_pad(a,M_ext[i],N_ext[i]) for i,a in enumerate(A)] 

ヘルパー機能 -

def img3D_pad(a,m,n): 
    return np.pad(a,((0,m),(0,n),(0,0)),'constant') 

検証

は、

1)検証形状:

In [108]: A = [np.random.randint(11,99,(4,5,3)), np.random.randint(11,99,(2,6,3))] 

In [109]: [i.shape for i in out] 
Out[109]: [(4, 6, 3), (4, 6, 3)] 

2)値の検証:

In [110]: A[0][...,0] 
Out[110]: 
array([[53, 64, 41, 13, 85], 
     [74, 53, 88, 47, 54], 
     [35, 26, 93, 68, 80], 
     [38, 68, 50, 83, 77]]) 

In [111]: out[0][...,0] 
Out[111]: 
array([[79, 33, 41, 16, 76, 0], 
     [11, 49, 54, 56, 40, 0], 
     [38, 43, 98, 95, 23, 0], 
     [26, 26, 20, 59, 53, 0]]) 

In [112]: A[1][...,0] 
Out[112]: 
array([[76, 44, 29, 20, 91, 71], 
     [71, 90, 11, 51, 81, 22]]) 

In [113]: out[1][...,0] 
Out[113]: 
array([[57, 11, 42, 95, 87, 75], 
     [15, 70, 88, 88, 41, 95], 
     [ 0, 0, 0, 0, 0, 0], 
     [ 0, 0, 0, 0, 0, 0]]) 

アプローチ#2

zeros-initializationに基づく簡易1 -

M,N = np.max([i.shape[:2] for i in A],0) 
out = [img3D_create(a,M,N) for i,a in enumerate(A)] 
を10

ヘルパー機能 -

def img3D_create(a,M,N): 
    p,q,r = a.shape 
    out = np.zeros((M,N,r),dtype=a.dtype) 
    out[:p,:q] = a 
    return out 
関連する問題