Jython/Python — переворачивание изображения по горизонтали

Я пытаюсь «разрезать» изображение пополам и перевернуть обе стороны по горизонтали. См. ссылку ниже.

http://imgur.com/a/FAksh

Исходное изображение:

введите здесь описание изображения

Что должно быть на выходе:

введите здесь описание изображения

Что я получаю

введите здесь описание изображения

Это то, что у меня есть, но все, что он делает, это переворачивает картинку по горизонтали

def mirrorHorizontal(picture):
  mirrorPoint = getHeight(picture)/2
  height = getHeight(picture)
  for x in range(0, getWidth(picture)):
    for y in range(0, mirrorPoint):
      topPixel = getPixel(picture, x, y)
      bottomPixel = getPixel(picture, x, height - y - 1)
      color = getColor(topPixel)
      setColor(bottomPixel, color)

Итак, как мне перевернуть каждую сторону по горизонтали, чтобы она выглядела как на второй картинке?


person John Calzone    schedule 23.10.2012    source источник
comment
Какой модуль вы используете для обработки изображений? (Что обеспечивает getPixel, setColor и другие методы?)   -  person jsbueno    schedule 23.10.2012
comment
Почти наверняка JES.   -  person nneonneo    schedule 23.10.2012
comment
Логика не совсем верна, но есть одна вещь, которая с самого начала выглядит неправильно: вы модифицируете пиксель, а затем модифицируете его аналог, который на самом деле является самим собой к тому времени, когда Python доберется туда. Предположим, у вас есть два пикселя, top и bottom. За одну итерацию вы измените top, назначив ему bottom. Затем, когда вы доберетесь до bottom, вы попытаетесь установить для него цвет top, только теперь top является bottom. Таким образом, половина вашего изображения останется неизменной. Простой способ избежать этого — создать другое изображение с теми же размерами и сопоставить с ним вещи из вашего оригинала.   -  person NullUserException    schedule 23.10.2012


Ответы (2)


Одним из подходов было бы определение функции для отражения части изображения по горизонтали:

def mirrorRowsHorizontal(picture, y_start, y_end):
    ''' Flip the rows from y_start to y_end in place. '''
    # WRITE ME!

def mirrorHorizontal(picture):
    h = getHeight(picture)
    mirrorRowsHorizontal(picture, 0, h/2)
    mirrorRowsHorizontal(picture, h/2, h)

Надеюсь, это даст вам начало.

Совет. Возможно, вам придется поменять местами два пикселя; для этого вам нужно использовать временную переменную.

person nneonneo    schedule 23.10.2012
comment
Я думаю, что это страдает от той же проблемы, которую я указал в комментариях. - person NullUserException; 23.10.2012
comment
Я работаю исходя из предположения, что изображение необходимо изменить на месте (что требует замены). Если OP может создавать новые изображения, то создание нового изображения и его заполнение будет проще. - person nneonneo; 23.10.2012
comment
Я думаю, что это сработает, но мне нужно, чтобы функция принимала только один вход, и этот вход был изображением. О, и я действительно не знаком с обменом изображениями. Я просто пытаюсь отредактировать этот вывод таким, каким он должен быть. - person John Calzone; 23.10.2012
comment
mirrorHorizontal принимает только один вход. mirrorRowsHorizontal — вспомогательная функция. - person nneonneo; 23.10.2012
comment
Ничего, я до сих пор не могу понять. Есть ли еще какой-нибудь намек, который ты мог бы мне дать, @nneonneo? Я чувствую себя глупо, что не понимаю этого. - person John Calzone; 23.10.2012

Год спустя, я думаю, мы можем дать ответ:

def mirrorRowsHorizontal(picture, y_start, y_end):
    width = getWidth(picture)

    for y in range(y_start/2, y_end/2):
        for x in range(0, width):
            sourcePixel = getPixel(picture, x, y_start/2 + y)
            targetPixel = getPixel(picture, x, y_start/2 + y_end - y - 1)
            color = getColor(sourcePixel)
            setColor(sourcePixel, getColor(targetPixel))
            setColor(targetPixel, color)

def mirrorHorizontal(picture):
    h = getHeight(picture)
    mirrorRowsHorizontal(picture, 0, h/2)
    mirrorRowsHorizontal(picture, h/2, h)

Взято из вертикального переворота здесь.

Пример с 3 полосами:

mirrorRowsHorizontal(picture, 0, h/3)
mirrorRowsHorizontal(picture, h/3, 2*h/3)
mirrorRowsHorizontal(picture, 2*h/3, h)

До :

введите здесь описание изображения

После :

введите здесь описание изображения

person Gauthier Boaglio    schedule 16.06.2013