2016-08-31 4 views
0

Итак, я пытаюсь преобразовать BMP в массив NumPy, где-то хранить массив, а затем преобразовать его обратно в образ bmp на более поздней время.Использование PIL для открытия изображения с палитрой и сохранения этого изображения с той же палитрой

bmp = Image.open(fn_bmp) 
data = np.array(bmp.convert('P', palette=Image.WEB)) 

Эти данные временно хранятся в другом файле, а затем я отправляюсь на его получение позже.

bmp = Image.fromarray(np.array(dataset).convert('P', palette=Image.WEB)) 
bmp.save(fn) 

Обратите внимание, что набор данных представляет собой объект преобразуется обратно в NumPy массива и np.array (набор данных) == данные по всем индексам.

По какой-то причине, когда я показываю или сохраняю полученное изображение, значение «14», соответствующее цвету палитры, интерпретируется как значение шкалы серого и сохраняется как таковое. Как сохранить изображение в виде растрового изображения цветной палитры? Я попытался добавить параметры к сохранению (например, mode = 'P', palette = Image.WEB) безрезультатно. Спасибо за помощь.

EDIT:

В учебнике части документации PIL, он определяет ограничения преобразований.

Библиотека поддерживает преобразования между каждым поддерживаемым режимом и режимами «L» и «RGB». Для преобразования между другими режимами вам может потребоваться промежуточное изображение (обычно это изображение «RGB»).

Итак, чтобы выполнить то, что я делаю, мне нужно преобразовать изображение в RGB в первом массиве и преобразовать обратно в P во втором.

Однако изображение (только с 4 цветами) искажается при преобразовании из RGB обратно в P. Есть ли причина для этого?

ответ

0

В этом случае Image.fromarray(data) возвращает изображение в оттенках серого. Когда вы преобразуете это изображение в другой режим изображения, он останется серым цветом!

Вместо этого вы должны предоставить информацию о цвете в виде палитры:

# first part 
bmp = Image.open(fn_bmp) 
bmp_P_web = bmp.convert('P', palette=Image.WEB) 
web_palette = bmp_P_web.getpalette() # <--- 
data = np.array(bmp_P_web) 

# second part 
bmp = Image.fromarray(data) 
bmp.putpalette(web_palette) # <--- 

Понятия не имею, как получить web_palette непосредственно от PIL, но вот способ создания it с NumPy:

web_palette = np.zeros(3*256, int) 
web_palette[30:-90] = np.mgrid[0:256:51, 0:256:51, 0:256:51].ravel('F') 

 Смежные вопросы

  • Нет связанных вопросов^_^