Как перетасовать пиксели изображения, используя Python Подушка? - PullRequest
0 голосов
/ 05 апреля 2020

Моя цель - перетасовать все пиксели в 512x512 Python образе подушки. Кроме того, мне нужно, чтобы показатели времени были относительно хорошими. Что я пробовал:

from PIL import Image
import numpy as np

orig = Image.open('img/input2.jpg')
orig_px = orig.getdata()

np_px = np.asarray(orig_px)
np.random.shuffle(np_px)
res = Image.fromarray(np_px.astype('uint8')).convert('RGB')

res.show()

Приложение Preview выдает мне следующую ошибку:

Не удалось открыть файл «tmp11g28d6z.PNG». Возможно, он поврежден или использует формат файла, который Preview не распознает.

Не могу понять, что пошло не так. Буду признателен за любые предложения по исправлению этого кода или использованию другого подхода к решению этой проблемы.

1 Ответ

1 голос
/ 05 апреля 2020

Основная проблема в том, что getdata предоставляет вам 1d массив, а для фромаррэйма требуется 2d или 3d массив. см исправленный код. Вы можете заметить две изменения. Итак, сначала измените массив пикселей. Каждый пиксель имеет 3 значения. Чем перетасовать их, чем изменить образ. Если вы прокомментируете np.random.shuffle (orig_px), вы получите оригинальное изображение как есть.

from PIL import Image
import numpy as np

orig = Image.open('test.jpg')
orig_px = orig.getdata()

orig_px = np.reshape(orig_px, (orig.height * orig.width, 3))
np.random.shuffle(orig_px)

orig_px = np.reshape(orig_px, (orig.height, orig.width, 3))

res = Image.fromarray(orig_px.astype('uint8'))
res.save('out.jpg')
...