Изображения, сохраненные в формате HDF5, не окрашены - PullRequest
0 голосов
/ 30 августа 2018

В настоящее время я работаю над программой, которая конвертирует текстовые файлы и jpg-изображения в формат HDF5. Кажется, что изображения, открытые в HDFView 3.0, сохраняются только в оттенках серого.

hdf = h5py.File("Sample.h5")
img = Image.open("Image.jpg")
data = np.asarray((img), dtype="uint8")
hdf.create_dataset("Photos/Image 1", data=data, dtype='uint8')

dset = hdf.get("Photos/Image 1")
dset.attrs['CLASS'] = 'IMAGE'
dset.attrs['IMAGE_VERSION'] = '1.2'
arr = np.asarray([0, 255], dtype=np.uint8)
dset.attrs['IMAGE_MINMAXRANGE'] = list(arr)
dset.attrs['IMAGE_SUBCLASS'] = 'IMAGE_TRUECOLOR'
dset.attrs['INTERLACE_MODE'] = 'INTERLACE_PIXEL'

В python можно показать оригинальное цветное изображение с помощью метода Image.show ():

hdf = h5py.File("Sample.h5")
array = np.array(list(hdf.get("Photos/Image 1")))
img = Image.fromarray(array.astype('uint8'))
img.show()

1 Ответ

0 голосов
/ 15 сентября 2018

Первая часть вопроса.

Не спрашивайте меня, почему, но, возможно, кто-то из тех, кто поддерживает HDFview, может подойти. Чтобы HDFview мог правильно отображать изображения, атрибуты должны быть строкой конечной длины для правильной интерпретации.

Используйте np.string_(<string>) из пакетика NumPy

import h5py  
import numpy as np
from PIL import Image

hdf = h5py.File("Sample.h5",'w')
img = Image.open("Image.jpg")
data = np.asarray((img), dtype="uint8")
hdf.create_dataset("Photos/Image 1", data=data, dtype='uint8')

dset = hdf.get("Photos/Image 1")
dset.attrs['CLASS'] = np.string_('IMAGE')
dset.attrs['IMAGE_VERSION'] = np.string_('1.2')
arr = np.asarray([0, 255], dtype=np.uint8)
dset.attrs['IMAGE_MINMAXRANGE'] = list(arr)
dset.attrs['IMAGE_SUBCLASS'] = np.string_('IMAGE_TRUECOLOR')
dset.attrs['INTERLACE_MODE'] = np.string_('INTERLACE_PIXEL')
hdf.close()

Это дает в HDFview, дважды щелкнув по набору данных "Изображение 1" my image stored h5 style !

Второй вопрос.

Полагаю, вы используете пакет PIL Функция fromarray ожидает «режим изображения», см. https://pillow.readthedocs.io/en/3.1.x/handbook/concepts.html#concept-modes

В вашем случае это RBG

* * Поэтому тысяча двадцать-один * * 1 022
import h5py
import numpy as np
from PIL import Image

hdf = h5py.File("Sample.h5",'r')
array = np.array(list(hdf.get("Photos/Image 1")))
img = Image.fromarray(array.astype('uint8'), 'RGB')
img.show()

даст вам

my deserialized picture

...