2011-10-23 23 views
0

pypngを使用して画像を水平方向に(左から右に)反転しようとしています。次のコードを書いていますが、動作していないようです。ここで間違ってる?pypngでPython上の画像を水平に反転する

def horizontal_flip(image): 
    rows = len(image) 
    cols = len(image[0]) 
    new_image = [] 
    for r in range(rows): 
     new_row = [] 
     for c in range(0,cols,3): 
      if c != cols/2: 
       image[c:c+3], image[-c-3: -c] = image[-c-3: -c], image[c:c+3] 
       new_row.append(image[r][c]) 
     new_image.append(new_row) 
    return new_image 
+0

'は動作していないようです'というのはむしろあいまいです。あなたは、あなたが見ている問題のある行動を記述することができれば、答えを得ることができます。 – retracile

+0

numpyスライス: 'my_arr [...、:: - 1]' – JBernardo

答えて

0

new_row.append(image[r][c])ifの外でなければなりません。

また、イメージを水平方向に2回反転しています。 forループの使用をrange(0,cols/2,3)にしてください。 (ifの必要性もなくなるかもしれません)

また、元のイメージをインプレースで修正しています。あなたはそれをしたいと思いますか?

新しいイメージの行に追加すると、各行を逆順にループする方が簡単だと思われます。

0

内部ループロジックが間違っているが、特に、この行:

image[c:c+3], image[-c-3: -c] = image[-c-3: -c], image[c:c+3] 

は、インプレースimage変数を変更されていますが、r変数の行を忘れるように見えました。今は行を変更しています。あなたの否定的なスライシングはちょっとです。 c=0の場合はimage[-3:0]となり、これは有効なスライスではなく、[]を返します。

あなたのコードから判断すると、imageをインプレースで変更することを意味するわけではなく、new_imageを作成する必要があります。ちなみに

def horizontal_flip(image): 
    rows = len(image) 
    cols = len(image[0]) 
    new_image = [] 
    for r in range(rows): 
     new_row = [] 
     for c in range(0,cols,3): 
      new_row = image[r][c:c+3] + new_row 
     new_image.append(new_row) 
    return new_image 

、あなたはまた、インプレースimageを変更、しかし、注意してくださいすることができます:あなたがやるべきことはnew_rowの最後にスライスを挿入しています。 listを渡しているときは、変更前に元の内容に変更しないでコピーしてください。ここではそのバージョンは以下のとおりです。

def horizontal_flip(image): 
    cols = len(image[0])/3 

    #make a copy so that original image is not altered 
    image = [row[:] for row in image] 

    for row in image: 
     for c in range(int(cols/2)): # int() is not needed for Python 2.x, since integer division yields integer 
            # This also takes care of odd n cases, middle chunk is not changed. 
      row[3*c:3*c+3], row[3*(cols-c-1):3*(cols-c-1)+3] = row[3*(cols-c-1):3*(cols-c-1)+3], row[3*c:3*c+3] 

    return image 

これは、単一の行のリスト内包で行うことができますが、それは読みにくくなります。あなたが好きなら、ここにあなたがそれをする方法があります:

from itertools import chain 
flipped_image = [list(chain(*[row[3*i:3*i+3] for i in range(len(image[0])/3-1,-1,-1)])) for row in image] 
関連する問題