2014-01-14 5 views
0

Я пытаюсь выполнить задачу редактирования изображений в своей обучающей книге Python. Мне нужна помощь с горизонтальным переворотом.Flipping Images

Инструкции: Напишите функцию под названием «flip_horizontal», которая будет переворачивать изображение по горизонтали. То есть пиксель, расположенный на крайнем правом конце строки, заканчивается в крайнем левом углу строки и наоборот (не забудьте сохранить порядок RGB!).

Мой код не переворачивает изображение по горизонтали, когда я его открываю. Кроме того, как я могу писать свои эффекты для разных файлов (использовать исходный файл и применить одну функцию к исходному файлу и вывести его, а затем применить другую функцию к исходному файлу и вывести ее в другой файл). Пожалуйста, имейте в виду, что мне всего 11 лет, и я имею очень основное представление о Python и редактировании изображений, это просто мой интерес.

class PPM(object): 
    def __init__(self, infile, outfile): 
     self.infile=infile 
     self.outfile=outfile 

     #Read in data of image 
     data= open(self.infile,"r") 
     datain=data.read() 
     splits=datain.split() 

     #Header info 
     self.type=splits[0] 
     self.columns=splits[1] 
     self.row=splits[2] 
     self.colour=splits[3] 
     self.pixels=splits[4:] 

    def negate_red(self): 
     for b in range (0, (len(self.pixels)) , 3): 
      remainder=255-self.colour 

    def writetofile(self): 
     dataout= open(self.outfile,"w") 
     dataout.write(self.type +"\n" + self.columns + "\n" + self.row +"\n"+ self.colour +"\n"+ " ".join (self.pixels)) 

    def grey_scale(self): 
     if int(self.columns) > 1000: 
      return "ERROR!! Number of columns is larger than what can be held in a buffer." 
     else: 
      for b in range(0, (len(self.pixels)) , 3): 
       sum = int(self.pixels[b]) + int(self.pixels[b+1]) + int(self.pixels[b+2]) 
       avg = int(sum/3) 

       self.pixels[b] = str(avg) 
       self.pixels[b+1] = str(avg) 
       self.pixels[b+2] = str(avg) 

    def flatten_red(self): 
     for colour in range (0,len(self.pixels),3): 
      self.pixels [colour]=str(0) 

    #Create a 2d lists with the smaller lists containing the rgb values and append lists of lists 
    def horizontal_flip(self): 
     if int(self.columns) > 1000: 
      return "ERROR!! Number of columns is larger than what can be held in a buffer." 
     else: 
      temp_list = [] 
      for b in range(int(self.row)): 
       column_list = [] 
       column_list += self.pixels[0:int(self.columns) * 3] 
       self.pixels = self.pixels[int(self.columns) * 3 : ] 
       temp_list.append(column_list) 
      #print temp_list 
      new_list = [] 
      for i in range(int(len(temp_list))): 
       new_list.append (temp_list[i][0]) 
       new_list.append (temp_list[i][1]) 
       new_list.append (temp_list[i][2]) 
       temp_list[i] = temp_list[i][::-1] 

sample= PPM("cake.ppm", "Replica.ppm") 
sample.flatten_red() 
sample.horizontal_flip() 
sample.greyscale() 
sample.negate_red() 
+0

Вы написали «Мой код ничего не делает, и делает переворачивать изображение по горизонтали, когда я открываю его.» Полагаю, вы имели в виду «* не * переворачивать изображение по горизонтали»? –

+0

@ AdiInbar- Да, это то, что я имел в виду, - Извините, – user3192593

+0

Хорошо, другая часть, о которой я смущен ... », а затем применить другую функцию к исходному файлу и вывести его в другой файл« ... кажется, что есть отсутствует "или" там, как в "исходном файле * или * "? –

ответ

0

Представьте себе ряд пикселей.

i.imgur.com/1iZesZL.jpg

Теперь, что мы хотим сделать, это перевернуть ее так, чтобы самый правый пиксель находится на самом левом месте, не так ли?

Итак, если у нас есть пиксель в левом углу с координатами (x, y), то пиксель в крайнем правом углу имеет координаты (x + n, y), где n = ширина изображения в пиксели.

i.imgur.com/EE7Qj5r.jpg

Теперь, горизонтальный флип будет выглядеть так, верно?

i.imgur.com/fbNLCuX.jpg

Так что мы делаем, мы переходим от ультраправых и крайнее левое положение, поменять местами значения текущих пикселей и сделать еще один шаг вправо и один шаг налево, пока они не встретились посередине.

В псевдокоде это может выглядеть примерно так:

n = width 
x = 0 
y = whatever row we're on currently 
while n != width/2 
    temporary = (x,y) # (x,y) refers to a specific pixel in the picture 
    (x,y) = (n, y) 
    (n, y) = temporary 
    n = n-1 
    x = x+1 

Как вы думаете, что достаточно, чтобы решить самостоятельно отдохнуть? Не хотел бы получать удовольствие от этого :-)

+0

@ ejbs- Единственная проблема в том, что я полностью застрял и нуждаюсь в помощи с кодом, который я уже написал, или полным решением, которое затем я могу использовать, чтобы понять, где я поступил неправильно мое решение – user3192593

+0

@ ejbs- Я пытаюсь выяснить, что не так с моим решением – user3192593

+0

@ user3192593 Я мог бы написать вам полное решение, но я не понимаю, какую структуру данных вы используете. Не могли бы вы объяснить, что такое self.pixels? – ejbs

0

Вам действительно 11 лет?

Похоже, каждый элемент вашего temp_list столбец изображения, чтобы изменить порядок столбцов вы просто должны сделать temp_list = temp_list[::-1], но вы делаете temp_list[i] = temp_list[i][::-1], которые я думаю, переворачивает изображение вверх-вниз (я мог бы имейте это назад, хотя). В любом случае, как только вы получите флип, вам нужно выравнивать изображение снова и заменить self.pixels, что-то вроде:

pixels = [] 
for column in temp_list: 
    pixels.extend(column) 
self.pixels = pixels 

Вы не делаете много с new_list, я не думаю, что вам это нужно.Кроме того, если вы хотите, чтобы сохранить изображение в различные файлы, взять имя файла в качестве аргумента writetofile, если вы делаете, что вам не нужно иметь его в __init__, так что-то вроде:

class PPM(object): 

    def __init__(self, infile): 
     self.infile=infile 
     # More code here 

    def writetofile(self, outfile): 
     dataout = open(outfile,"w") 
     dataout.write(self.type +"\n" + self.columns + "\n" + self.row +"\n"+ self.colour +"\n"+ " ".join (self.pixels)) 
     dataout.close() 

sample = PPM("cake.ppm") 
sample.horizontal_flip() 
sample.writetofile("Replica1.ppm") 
sample.negate_red() 
sample.writetofile("Replica2.ppm") 
0

Может быть не для вас, так как вы хотите попрактиковаться, но я пришел сюда, чтобы найти решение той же проблемы после исследования. Я нашел это и хотел бы поделиться следующим: OpenCV предоставляет функцию для перевода изображения.

void flip(array src, array dst, int flipCode) 

переворачивается 2D-массив вокруг вертикальных, горизонтальных или обеих осей.

Параметры:

  • src - Источник массива
  • dst - массив назначения; будут иметь тот же размер и тот же тип, что и src
  • flipCode - Указывает, как перевернуть массив: 0 означает переброс вокруг оси x, положительный (например, 1) означает переворачивание вокруг оси y и отрицательный (например, 1) означает перемещение вокруг обеих осей. Функция flip переворачивает массив одним из трех способов (индексы строк и столбцов основаны на 0).

Пример кода:

cv.flip(original_image,flip_image,1);