0

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
4

2 に答える 2

0

new_row.append(image[r][c])の外にある必要がありifます。

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

また、元の画像をインプレースで変更しています。本当にやりたいですか?

より簡単な解決策は、各行を逆にループして、新しい画像の行に追加することかもしれません。

于 2011-10-23T02:49:11.167 に答える
0

内側のループ ロジックは間違っていますが、特に次の行は次のとおりです。

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

変数をその場で変更してimageいますが、行変数を忘れているようですr。だから今、あなたは行を変えています。そして、あなたのネガティブスライスは少しずれています。の場合c=0image[-3:0]これは有効なスライスではなく、 が返され[]ます。

しかし、コードから判断すると、そのimage場で変更するつもりはなく、作成したいnew_image. あなたがすべきことは、の最後にスライスを挿入することですnew_row:

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インプレースも変更できますが、注意が必要です。を渡している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

これは、1 行のリスト内包表記でも実行できますが、読みにくくなります。必要に応じて、次の方法で実行できます。

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]
于 2011-10-23T04:00:16.647 に答える