Добавить растровое изображение в файл HDF5 с помощью h5py

Прошу прощения, если это вопрос новичка, но я новичок в Python и HDF5. Я использую h5py, numpy и Python 2.7. У меня есть данные из разных файлов, которые нужно импортировать в один файл HDF5. Данные из каждого файла должны храниться в отдельной группе. Каждая из этих групп должна содержать 1) необработанные данные из файла в виде матрицы m x n и 2) растр изображения, сгенерированный из нормализованных необработанных данных.

Я могу выполнить часть 1 и нормализовать данные, но я не могу записать эти нормализованные данные в растровое изображение, потому что я не знаю, как добавить растровое изображение в группу. Кажется, что должен быть простой и понятный способ сделать это, но я прочитал документацию и не нашел его. Как это сделать в h5py, и если это невозможно сделать с помощью h5py, что мне для этого использовать?

Спасибо!!


person pyguy    schedule 19.04.2015    source источник
comment
Является ли растровое изображение массивом numpy? Данные тоже являются массивом? Перечитайте h5py документацию. Я считаю, что массив numpy - это основная единица данных, которую вы можете добавить с помощью этого пакета.   -  person hpaulj    schedule 19.04.2015
comment
docs.h5py.org/en/latest/high/dataset.html - create_dataset - это основной механизм для добавления нескольких массивов в группу.   -  person hpaulj    schedule 19.04.2015
comment
Я могу добавить массив данных в виде матрицы m x n, но как мне добавить его, чтобы он отображался как изображение; такие как здесь: ссылка с использованием h5py?   -  person pyguy    schedule 19.04.2015
comment
Возможно, h5py не включил этот API изображений в свой порт. Возможно, вам придется спросить разработчиков: github.com/h5py/h5py   -  person hpaulj    schedule 19.04.2015
comment
почему бы не сохранить массив как есть, а затем создать отдельный matplotlib код, который отображает его как изображение?   -  person dbliss    schedule 19.04.2015


Ответы (1)


В изображениях HDF5 нет ничего особенного. Предоставленная вами ссылка предназначена для привязок библиотеки высокого уровня. Вы также можете легко использовать спецификации изображений в HDF5, которые это просто атрибуты.

Вот очень грубый пример:

#!/usr/bin/env python

import numpy as np
import h5py

# Define a color palette
pal =  np.array([[0,     0, 168],
                 [0,     0, 252],
                 [0,   168, 252],
                 [84,  252, 252],
                 [168, 252, 168],
                 [0,   252, 168],
                 [252, 252,  84],
                 [252, 168,   0],
                 [252,   0,   0]],
                 dtype=np.uint8
               )

# Generate some data/image
x = np.linspace(0,pal.shape[0]-1)
data,Y = np.meshgrid(x,x)

# Create the HDF5 file
f = h5py.File('test.h5', 'w')

# Create the image and palette dataspaces
dset = f.create_dataset('img', data=data)
pset = f.create_dataset('palette', data=pal)

# Set the image attributes
dset.attrs['CLASS'] = 'IMAGE'
dset.attrs['IMAGE_VERSION'] = '1.2'
dset.attrs['IMAGE_SUBCLASS'] =  'IMAGE_INDEXED'
dset.attrs['IMAGE_MINMAXRANGE'] = np.array([0,255], dtype=np.uint8)
dset.attrs['PALETTE'] = pset.ref

# Set the palette attributes
pset.attrs['CLASS'] = 'PALETTE'
pset.attrs['PAL_VERSION'] = '1.2'
pset.attrs['PAL_COLORMODEL'] = 'RGB'
pset.attrs['PAL_TYPE'] = 'STANDARD8'

# Close the file
f.close()

Запустите пример, а затем посмотрите изображение в HDFView:

Изображение в файле HDF5

Обратите внимание, что вы должны открыть данные изображения с помощью «Открыть как», чтобы увидеть его как изображение, поскольку по умолчанию используется табличный вид.

person Timothy Brown    schedule 19.04.2015
comment
Именно это. Понятия не имею, как я пропустил это раньше, когда просматривал документы. Большое тебе спасибо! - person pyguy; 21.04.2015
comment
@MojoJojo Я не использую Matlab, однако есть ответ на веб-сайт ответов Matlab. Надеюсь, это поможет. - person Timothy Brown; 05.04.2016
comment
Спасибо! Это отличный ответ. Для полноты, вот атрибуты, которые я использовал для одноканального изображения в градациях серого: { 'CLASS': 'IMAGE', 'IMAGE_VERSION': '1.2', 'IMAGE_SUBCLASS': 'IMAGE_GRAYSCALE', 'IMAGE_MINMAXRANGE': np.array([0, 255], dtype=np.uint8), 'IMAGE_WHITE_IS_ZERO': 0, } - person Phil; 12.10.2017
comment
Размещенные ссылки устарели. Их следует обновить до support.hdfgroup.org/HDF5/Tutor/h5image.html и support.hdfgroup.org/HDF5/doc/ADGuide/ImageSpec.html - person smillerc; 14.08.2019