Преобразование массива в изображение

#python #image

#python #изображение

Вопрос:

Я уже несколько часов борюсь с этой крошечной проблемой. Я пытался внести некоторые изменения в изображение. Вот снипет кода :

 import numpy as np
from PIL import Image

#Conversion image array
img = Image.open('lena.jpg')
array = np.array(img)

def niv_de_gris(img):

    height = len(img)
    width = len(img[0])
    
    #Creation tableau vide
    new_img = ([[[0 for i in range(3)] for j in range(width)] for k in range(height)])

    for i in range(height):
        for j in range(width):
            m = np.mean(img[i][j])
            for k in range(3):
                new_img[i][j][k] = int(m)

    return np.array(new_img)

array_gris = niv_de_gris(array)
img_gris = Image.fromarray(array_gris)  #problem is here !!  

первое преобразование работает отлично: оно принимает изображение и преобразует его в массив. Программа работает без сбоев, модификация изображения работает, она отправляет мне обратно массив изображения, преобразованного в уровни серого.

Тем не менее, когда я хочу преобразовать этот массив в изображение к .show() нему, я получаю эту ошибку :

Скриншот ошибки

Кто-нибудь может помочь мне разобраться в этом, пожалуйста?

Хорошего дня!

Ответ №1:

Массив для PIL , возможно , потребуется обеспечить pixel values are not 0-1 but 0-255 , type is unit8 а затем определить mode as 'RGB' .

Попробуйте использовать —

 array_gris = niv_de_gris(array) * 255  #Skip this step if pixels are 0-255 already
array_gris = array_gris.astype(np.uint8)
img_gris = Image.fromarray(array_gris, mode='RGB')  
 

Это сработало для меня на случайном изображении, которое я выбрал. В зависимости от функции и изображения, я считаю, что единственным по-настоящему важным шагом является обеспечение того, чтобы они были законными значениями пикселей и имели тип uint8.

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

1. Работал нормально, просто нужно было удалить ключевое слово «model», которое не было принято! Спасибо большое!

2. О, это должен быть режим. Исправлено