2016-08-31 3 views
0

私はforループで取り込んでいる複数のイメージがあります。私はxとyの両方で1ピクセルずつイニシャルをローリングし、毎回ローリングイメージを保存することによって、各イメージに対して5つの疑似レイヤーを取得したいと考えています。Python:配列を複数回ローリングし、各繰り返しをイメージとして保存する

私は1枚の画像で練習していますが、そこから5つのレイヤーを得ることができますが、喜びはありません。

私のコードは以下のとおりですが、最初の画像のみを保存しています。出力はpl_0.tif

list_frames = glob.glob('*.gif') 
for index, fname in enumerate(list_frames): 
    im = Image.open(fname) 
    shift=1 
    imary0 = np.array(im) # initial image (first layer) 
    imary1x = np.roll(imary0, shift, axis=0) # shift image by one pixel to create second layer 
    imary1xy = np.roll(imary1x, shift, axis=1) 
    imary2x = np.roll(imary1xy, shift, axis=0) # shift previous image again to create third layer 
    imary2xy = np.roll(imary2x, shift, axis=1) 
    imary3x = np.roll(imary2xy, shift, axis=0) # shift previous image again to create fourth layer 
    imary3xy = np.roll(imary3x, shift, axis=1) 
    imary4x = np.roll(imary3xy, shift, axis=0) # shift previous image again to create fifth layer 
    imary4xy = np.roll(imary4x, shift, axis=1) 
    im0 = Image.fromarray(imary0) 
    im0.save('pl_{}.tif'.format(index)) 
    im1 = Image.fromarray(imary1xy) 
    im1.save('pl_{}.tif'.format(index)) 
    im2 = Image.fromarray(imary2xy) 
    im2.save('pl_{}.tif'.format(index)) 
    im3 = Image.fromarray(imary3xy) 
    im3.save('pl_{}.tif'.format(index)) 
    im4 = Image.fromarray(imary4xy) 
    im4.save('pl_{}.tif'.format(index)) 
    im.close() 

どのような提案ですか? 、

+1

'' pl _ {}。tif'.format(index) 'はあなたが何回も呼び出すと異なる結果になると思いますか? – njzk2

+0

@ njzk2:答えは:コーヒーブレークなしで同じコードを見ている時間が長すぎます。 –

+0

あなたは 'roll'呼び出しを1行にまとめることができ、forループを使ってファイルを書くことができます。それはあなたが何をしようとしているかのようです。 – Andrew

答えて

1

はあなたが唯一の画像を得ることを意味し、同じ出力ファイル内のすべての5枚の画像を保存im4

im0.save('pl_{}.tif'.format(index)) 
im1 = Image.fromarray(imary1xy) 
im1.save('pl_{}.tif'.format(index)) 
im2 = Image.fromarray(imary2xy) 
im2.save('pl_{}.tif'.format(index)) 
im3 = Image.fromarray(imary3xy) 
im3.save('pl_{}.tif'.format(index)) 
im4 = Image.fromarray(imary4xy) 
im4.save('pl_{}.tif'.format(index)) 

(メモして(これは簡単に修正がある場合は、私を嘲笑すること自由に感じなさい)そのインデックス)は、次のループまで変更されません

クイックフィックス:

im0.save('pl_{}0.tif'.format(index)) 
im1 = Image.fromarray(imary1xy) 
im1.save('pl_{}1.tif'.format(index)) 
im2 = Image.fromarray(imary2xy) 
im2.save('pl_{}2.tif'.format(index)) 
im3 = Image.fromarray(imary3xy) 
im3.save('pl_{}3.tif'.format(index)) 
im4 = Image.fromarray(imary4xy) 
im4.save('pl_{}4.tif'.format(index)) 
+0

ああそうですが、出力のインデックスを作成しても問題はありません。ありがとう! – vanoccupanther

+0

私はそれを受け取ります、乾杯! – vanoccupanther

+0

ファイル名の参照を追加することについて考えてみたいと思うかもしれません。私は、二番目のループが最初の 'im0.save( 'pl _ {} _)'の結果を上書きしないように、 {} 0.tif'.format(fname、index)) ' – Andrew

1

がテストされていないが、私は、これはあなたが目指している何をすべきだと思う。

変数を追加し、それを使用して変数を反復します。そして、np.rollへの呼び出しがネストされていると思います。

list_frames = glob.glob('*.gif') 
for index1, fname in enumerate(list_frames): 
    im = Image.open(fname) 
    shift=1 
    number_of_shifts = 4 
    image_list = [] 
    imary0 = np.array(im) # initial image (first layer) 
    for _ in range(number_of_shifts): 
     if not image_list: 
      image_list.append(imary0) 
     else: 
      image_list.append(np.roll(np.roll(image_list[-1], shift, axis=0), shift, axis=1)) 
    for index2, img in enumerate(image_list): 
     img.save("pl_{}_{}.tif".format(fname, index2)) 
    im.close() 
+0

はそれをテストすることはできませんが、OPコードを大幅に改善しているので、動作すればupvoteに値するでしょう。 –

+0

私はどのようにあなたがロールに入れ子が好きです、私はデッドラインに取り組んでいるように私は実装しようとしますが、今日はしないでしょう、私はすでに、ありがとう、それ以上のエラーを導入することを恐れています! – vanoccupanther

関連する問題