Горизонтальное отражение изображения на Python с pypng - PullRequest
0 голосов
/ 23 октября 2011

Я пытаюсь перевернуть изображение (слева направо) по горизонтали на Python, используя PyPNG, я написал следующие коды, но, похоже, это не работает, у кого-нибудь есть идеи, что я здесь делаю неправильно?

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

Ответы [ 2 ]

0 голосов
/ 23 октября 2011

Логика внутреннего цикла неверна, но особенно эта строка:

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. Что вы должны сделать, это вставить кусочки в конце 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

Это также может быть сделано с пониманием списка в одной строке, но оно будет менее читабельным. Если вам нравится, вот как вы можете это сделать:

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]
0 голосов
/ 23 октября 2011

new_row.append(image[r][c]) должно быть за пределами if.

Кроме того, вы переворачиваете изображение по горизонтали ... дважды.Сделайте ваши для использования цикла range(0,cols/2,3).(Это также может устранить необходимость в этом if.)

Вы также изменяете исходное изображение на месте;Вы уверены, что хотите это сделать?

Кажется, более простым решением было бы перебрать каждую строку в обратном порядке, добавив строку для нового изображения.

...