#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)