Отразить (перевернуть) изображение по вертикали с учетом его строки? - PullRequest
3 голосов
/ 19 ноября 2011

Итак, у меня есть строка данных изображения RGBA, каждый пиксель имеет длину байта. Я знаю разрешение изображения по x и y. Теперь я хочу отредактировать строку таким образом, чтобы изображение было перевернуто или перевернуто по вертикали, что означает, что первая «строка» пикселей становится последней строкой и наоборот, и так же, как и все остальные «строки». Есть ли быстрый способ сделать это?

Ответы [ 2 ]

5 голосов
/ 19 ноября 2011

Чтобы сделать то, что вы хотите на букву , это один из способов продолжить:

>>> img = 'ABCDEFGHIJKL'
>>> x, y = 4, 3
>>> def chunks(l, n):
...     for i in xrange(0, len(l), n):
...         yield l[i:i+n]
... 
>>> [row for row in chunks(img, x)]
['ABCD', 'EFGH', 'IJKL']
>>> ''.join(reversed([row for row in chunks(img, x)]))
'IJKLEFGHABCD'

ОДНАКО , если у вас нет очень маленьких изображений, вы быбыть лучше проходить через numpy , так как это как минимум на на порядок быстрее , чем типы данных Cpython.Вы должны взглянуть на функцию flipup .Пример:

>>> A
array([[ 1.,  0.,  0.],
       [ 0.,  2.,  0.],
       [ 0.,  0.,  3.]])
>>> np.flipud(A)
array([[ 0.,  0.,  3.],
       [ 0.,  2.,  0.],
       [ 1.,  0.,  0.]])

РЕДАКТИРОВАТЬ: думал добавить полный пример на случай, если вы никогда не работали с NumPy раньше.Конечно, преобразование стоит только для изображений, которые не имеют размер 2x2, поскольку создание экземпляра массива приводит к дополнительным затратам ....

>>> import numpy as np
>>> img = [0x00, 0x01, 0x02, 0x03]
>>> img
[0, 1, 2, 3]
>>> x = y = 2
>>> aimg = np.array(img).reshape(x, y)
>>> aimg
array([[0, 1],
       [2, 3]])
>>> np.flipud(aimg)
array([[2, 3],
       [0, 1]])
0 голосов
/ 19 ноября 2011

скажем, у вас есть изображение в массиве img, затем выполните

img.reverse();
#also need to flip each row
for row in img:
  row.reverse();
...