Почему PIL + ndarrays работают только в черно-белом режиме? - PullRequest
0 голосов
/ 02 марта 2011

Позвольте мне вместо этого использовать кусок кода и более краткое описание.

import numpy as np
from PIL import Image as im

real_img = im.open('test.jpg').convert('L') #comment the .convert('L') and it no longer works
old_img = np.array(real_img)
new_img = np.zeros(old_img.shape)
for i_row in xrange(old_img.shape[0]):
    for i_col in xrange(old_img.shape[1]):
        new_img[i_row][i_col] = old_img[i_row][i_col]
new_real_img = im.fromarray(new_img).convert('L') #comment the .convert('L') and it no longer works
new_real_img.save('test2.jpg')

Этот код просто берет изображение и пытается скопировать его (в моем коде я делаю больше, чем это, но этого достаточно для примера, поскольку это иллюстрирует мою проблему). Если вы запустите его как есть (с изображением «test.jpg» в той же папке), это сработает. Однако, если вы удалите convert('L') в двух строках, которые он появляется, он больше не работает. Я также не могу преобразовать его в 'RGB' или другой полезный формат.

Итак, проблема в том, что я не могу использовать ndarrays с PIL, пока я использую цветные изображения. Есть ли способ это исправить?

1 Ответ

0 голосов
/ 02 марта 2011

найдено это .

"Image.fromarray () ожидает один бит на пиксель, но фактически получает один байт."

Таким образом, несмотря на то, что все, по-видимому, одинаково, кажется, что методы преобразования преобразуют значения в свои двоичные представления под капотом? Я не уверен, что Но это решает проблему:

import numpy as np
from PIL import Image as im

real_img = im.open('test.jpg')
old_img = np.array(real_img)
new_img = np.zeros(old_img.shape)
for i_row in xrange(old_img.shape[0]):
    for i_col in xrange(old_img.shape[1]):
        new_img[i_row][i_col] = old_img[i_row][i_col]
new_real_img = im.fromarray(new_img.astype('uint8'))
new_real_img.save('test2.jpg')

Итак, при возвращении к изображению преобразуйте ndarray в 'uint8', и все должно быть в порядке.

...