Как перейти от массива к списку и обратно с помощью PIL?

#python #numpy #python-imaging-library

#python #numpy #python-imaging-library

Вопрос:

Я пытаюсь поместить свое изображение в форму списка, чтобы вставить пиксели в изображение. Тем не менее, я сталкиваюсь с проблемами при обратном преобразовании в изображение после выполнения манипуляций со списком. Оказывается, просто переход от image -> array -> list -> array -> image довольно сильно портит изображение.

Однако переход от image -> array -> image, похоже, работает просто отлично. Это дополнительный шаг перехода к списку, который вызывает проблемы.

Ниже приведен код python3, который я запускаю. Кто-нибудь может сказать мне, что я делаю не так и как преобразовать 3D-список обратно в RGB-изображение, идентичное оригиналу? Как исходный, так и конечный массивы кажутся одинаковыми, поэтому не уверен, что PIL не нравится…

 import numpy as np
from PIL import Image              

img = Image.open('1.jpg') 
array = np.array(img)              

list1 = array.tolist()             
arrayF = np.array(list1)                                                

img2 = Image.fromarray(arrayF,"RGB")
img2.save('trial.jpg')

print(array)
print(arrayF)
  

Комментарии:

1. Попробуйте распечатать dtype ваши массивы Numpy, например print(arrayF.dtype)

2. PIL — это библиотека только для Python 2, которая не обновлялась в течение десятилетия.

3. @MarkSetchell Спасибо, скорее всего, это так. array.dtype = uint8 amp; arrayF.dtype = int64. Я посмотрю, как преобразовать.

4. Eightbitarray = sixtyfourbitarray.astype(np.uint8)

5. @MarkSetchell Это сработало. Спасибо! отправьте сообщение в качестве ответа, и я отмечу его как принятый.

Ответ №1:

Если вы проверите dtype свои массивы с print(array.dtype) помощью, вы увидите, что array это 8-разрядный и arrayF 64-разрядный … что неприемлемо для PIL для изображения RGB.

Сделать arrayF обратно в 8-битный с:

 arrayF = arrayF.astype(np.uint8)