2016-07-08 18 views
0

固定サイズの2乗ウィンドウでさまざまな場所で画像を切り抜き、numpy配列を得るにはかなり長いループがあります。
私はcropからPILイメージライブラリを使用していました。それから私はnp.asarraynumpyの配列としてそれを変換します。パッディング=切り取りを使った切り抜きの高速Python実装

from PIL import Image 
import numpy as np 
im=Image.open("image.png") 
box=(left,top,left+width,top+width) 
res=np.asarray(im.crop(box)) 

のみパディングが実装しかし(あなたの作物の中心が少ない境界線の幅/ 2よりもである)0で一定であると私はそれがnumpyのパッドドキュメントのようにパディングを「ラップ」になりたいです。

私の解決策は、このようなことです。

array=np.asarray(Image.open("image.png")) 
padded_array=np.pad(array,((width/2,width/2),(width/2,width/2),(0,0)),"wrap") 
res=padded_array[top+width/2:top+width/2+width,left+width/2:left+width/2+width] 

もっと効率的なやり方があるのだろうかと思っていました。

答えて

1

あなたは3x3のクロップウィンドウで、たとえば、numpy.takeを使用して、エッジの上にラップすることができます:インスタンス2クロップウィンドウのため、

a = numpy.arange(100).reshape((10,10)) 
a.take([8,9,10], mode="wrap", axis=1).take([9,10,11], mode="wrap", axis=0) 

また、インデックスのリストのリストを受け付けます。

b = a.take([[8,9,10],[3,4,5]], mode="wrap", axis=1).take([[9,10,11],[9,10,11]], mode="wrap", axis=0) 

その後、切り取ったウィンドウを復元できます。

window1 = b[0,:,0::2].reshape(3,3) 
>>> array([[98, 99, 90], 
      [ 8, 9, 0], 
      [18, 19, 10]]) 
window2 = b[1,:,1::2].reshape(3,3) 
>>> array([[93, 94, 95], 
      [ 3, 4, 5], 
      [13, 14, 15]]) 

小さいこのようにすると効率的かもしれませんが、大きなウィンドウの場合は、一度に1つのインデックスセットをループ内で指定することができます。

+0

ありがとうございます!私はこの機能を知らなかった。確かにそれは本当に高速ですが、私はチェックするつもりです。 – jean

+0

取得しようとしているウィンドウの数とサイズによって異なります。パディングを使用する際の問題は、いくつかのウィンドウをパディングする必要があるかもしれないが、他のウィンドウはパディングする必要があるかもしれない(いくつかのラップアラートといくつかはしない)ので、すべてのウィンドウに対してパッキングする必要がある。 – Benjamin

+0

はいいいえ、私はそれが再構成が無駄な詰め物に比べて取る時間までに沸騰すると思います。 – jean

関連する問題