Измените пиксели изображения PIL и отобразите его впоследствии -> результат черная горизонтальная линия

#python-3.x #python-imaging-library

#python-3.x #python-imaging-library

Вопрос:

Рассмотрим следующий код

 # Get an list of pixels of the current image and convert it into an array
from PIL import Image
im = Image.open('path_to_your_image')
pixels = np.array(list(im.getdata())) # get rbg values of each pixel and store it in an array
 

Для моего случая я получаю, например:

 pixels[:6]  --->

array([[ 60, 101,  59],
   [ 60, 101,  59],
   [ 60, 101,  59],
   [ 60, 101,  59],
   [ 60, 101,  59],
   [ 60, 101,  59]])
 

Я хочу вручную изменить каждый пиксель (например: ядро фильтра), а затем отобразить результат в виде изображения. Допустим, я просто умножил каждое значение rbg на единицу (= изображение не изменилось), и я хочу знать, чтобы отобразить результат (пиксели должны быть преобразованы обратно в изображение):

 im_new = Image.fromarray(pixels)
im_new.show()
 

На картинке будет просто прямая горизонтальная черная линия. Я проверил значения пикселей для нового изображения

 test = np.array(img_new.getdata())
test[:6]

---> array([ 60, 101,  59,  60, 101,  59])
 

Image.fromarray(пиксели) создает одномерный массив предыдущего пикселя 2D-массива. Вероятно, это причина, по которой отображается одномерная строка. Кто-нибудь знает, как я могу это исправить?

Ответ №1:

getdata сглаживает пиксели в одномерный список (см. Документы).

Чтобы сохранить структуру, используйте это (из документов):

 from PIL import Image
import numpy as np
im = Image.open('hopper.jpg')
a = np.asarray(im)

# change array here

im = Image.fromarray(a)