2017-02-02 4 views
0

Я создал контейнер HDF5, используя MATLAB. Контент - это несколько изображений с размерами [1024 1024 4] (= ширина, высота, каналы). Я создал и заполнил набор данных, как это:Добавить данные в контейнер hdf5 с Matlab

% GENERATE DATA 
img = double(ones([1024 1024 4]));    % example for image 
imgs_dset = double(ones([size(img) n_imgs]); % dataset [1024 1024 4 n_imgs] 
datasetname = '/data'; 

% CREATE hdf5 container 
% dset_size is 'Inf' so that container can hold arbitrary number of imgs 
dset_size = [size(img) Inf];     % = [1024 1024 4 Inf] 
h5create(filename, datasetname, dset_size, 'Datatype', class(imgs_dset)); 

% FILL dataset 
h5write(filename, datasetname, imgs_dset); 

Это все хорошо, все n_imgs записываются в файл. Однако теперь я хочу добавить дополнительные изображения в один и тот же набор данных, , не зная размер n_imgs созданного файла (добавочный скрипт обращается к файлу независимо от сценария создания).

Для более старых версий был вариант, как 'WriteMode', 'append', но теперь функция h5write ожидает параметры start и count (doc здесь).

Я озадачен тем, как определить эти параметры. В этом примере они установлены

start = [1 j]; % probably translates to [1 n_imgs]? 
count = [20 1]; % translates to [img ?] 

Как бы установить эти параметры в моем примере?

  1. Если я знаю n_imgs?
  2. Если я не знаю n_imgs?

ответ

2

start, где в данных, которые вы собираетесь начать писать в файл. count - сколько данных вы будете записывать в файл.

Предполагая, что n_imgs уже записан в файл, и вы хотите добавить, start будет [1 1 1 n_imgs+1]. (т. е. начать запись в файл в начале следующего изображения). Предположим, вы хотите добавить в файл 5 новых изображений, count будет [1024 1024 4 5].

Если вы не знаете, сколько изображений было написано в hdf5 ранее, вы можете посмотреть его с помощью h5info

Вот ваш пример и как вы могли бы добавить к этому:

% GENERATE DATA 
n_imgs = 3; 
img = double(ones([1024 1024 4]));    % example for image 
imgs_dset = double(ones([size(img) n_imgs])); % dataset [1024 1024 4 n_imgs] 
datasetname = '/data'; 
filename = 'data.h5'; 

% CREATE hdf5 container 
% dset_size is 'Inf' so that container can hold arbitrary number of imgs 
dset_size = [size(img) Inf];     % = [1024 1024 4 Inf] 
h5create(filename, datasetname, dset_size, ... 
     'Datatype', class(imgs_dset), 'ChunkSize', [1024 1024 1 1]); 

% FILL dataset with first few images 
h5write(filename, datasetname, imgs_dset, [1 1 1 1], [size(img) n_imgs]); 

% APPEND to dataset 
n_new_images = 5; 
new_imgs_dset = double(ones([size(img) n_new_images])); 
info = h5info('data.h5', '/data'); 
curSize = info.Dataspace.Size; % is currently [1024 1024 4 3]. 
h5write(filename, datasetname, new_imgs_dset, ... 
      [1 1 1 curSize(end)+1], [size(img) n_new_images]); 

% check size of dataset after appending: 
info = h5info('data.h5', '/data'); 
disp(info.Dataspace.Size) % size is now [1024 1024 4 8] 
+0

большой , это именно то, что мне нужно. Спасибо за объяснение! – Honeybear

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