Как собрать эти изображения вместе?

Я имею 200 моменты времени. Для каждого момента времени есть изображение, размер которого 40*40 double, соответствует этому моменту времени. Например, image 1 соответствует time point 1; image k соответствует time point k (k = 1,2,...,200).

Временные точки T = 1:200с изображениями, названными как Image_Tтаким образом Image_1, Image_2 и т.п.

Я хочу поставить все это 200 изображения вместе. Окончательный размер 40*40*200 двойной. Окончательное изображение выглядит как изображение МРТ (fmri_szX = 40, fmri_szY = 40 а также fmri_szT = 200). Как этого добиться? Спасибо!

1 ответ

Решение

Динамические переменные

Обратите внимание, что, хотя это возможно, это считается плохим программированием (см., Например, здесь, или этот блог Лорен и даже Mathworks в их документации говорят вам не делать этого). Было бы намного лучше загружать изображения непосредственно в трехмерный массив или структуру ячеек, избегая динамических имен переменных. Я только что опубликовал это для полноты; если вам когда-нибудь придется использовать это решение, вы должны немедленно перейти на (cell-) массив.

Суть связанных статей о том, почему eval Это такая плохая идея, что MATLAB больше не может предсказать, каким будет результат операции. Например A=3*(2:4) распознается MATLAB для вывода двойного массива. если ты eval вещи, MATLAB больше не может делать это. MATLAB - интерпретируемый язык, то есть каждая строка кода читается, затем запускается без предварительной компиляции всего кода. Это означает, что каждый раз, когда MATLAB встречает eval, он должен остановить, оценить выражение, затем проверить вывод, сохранить его и продолжить. Большинство скоростных двигателей, используемых в MATLAB (JIT/MAGMA и т. Д.), Не могут работать без прогнозирования результатов утверждений и поэтому будут отключены во время eval оценка, делая ваш код очень медленным.

Также есть аспект безопасности при использовании eval, Учтите следующее:

var1=1;
var2=2;
var3=3;
varnames={'var1','var2; disp(''GOTCHA''); %', 'var3'};

accumvar=[];
for k=1:numel(varnames)
   vname=varnames{k};
   disp(['Reading from variable named ' vname]); eval(['accumvar(end+1)=' vname ';']);
end

Сейчас accumvar будет содержать нужные имена переменных. Но если вы не установите accumvar в качестве вывода, вы также можете не использовать dispно, например, eval('rm -rf ~/*') который отформатировал бы весь ваш диск, даже не сказав вам, что это так.

Петлевой подход

for ii = 200:-1:1
    str = sprintf('Image_%d',ii);
    A(:,:,ii) = eval(str);
end

Это создает вашу матрицу. Обратите внимание, что я позволил for цикл запустить назад, чтобы инициализировать A в самом большом размере.

Полувекторный подход

str=strsplit(sprintf('image_%d ',1:200),' '); % Create all your names
str(end)=[]; % Delete the last entry (empty)
%Problem: eval cannot handle cells, loop anyway:
for ii = 200:-1:1
    A(:,:,ii)=eval(str{ii});
end

eval не поддерживает массивы, поэтому вы не можете напрямую подключить погреб strв.

Динамические имена файлов

Несмотря на то, что заголовок похож на приведенный выше, это подразумевает структурирование имен файлов, то есть в файловом браузере, а не в MATLAB. Я предполагаю, что файлы.jpg здесь, но вы можете добавить любое поддерживаемое расширение изображения. Кроме того, убедитесь, что все изображения находятся в одной папке и нет дополнительных изображений с этим расширением, или вам необходимо изменить dir() позвоните, чтобы включить только нужные изображения.

filenames = dir('*.jpg');
for ii = length(filenames):-1:1
    A(:,:,:,ii) = imread(filenames{ii});
end

Изображения обычно читаются как m*n*3 файлы, где m*n ваш размер изображения в пикселях и 3 вытекает из того факта, что они читаются как RGB imread, Следовательно A теперь 4D матрица, структурированная как m*n*3*Tгде последний индекс соответствует времени изображения, а первые три - ваше изображение в формате RGB.

Поскольку вы не указываете, как вы получаете 40*40 двойной, я оставил 4D матрицу. Может быть, вы прочитаете их, а затем переключитесь на использование uint16 интерпретация RGB, который является одним числом, что приведет к m*n*1*T переменная, которую вы можете уменьшить до трехмерной переменной, вызвав A = squeeze(A(:,:,1,:));

Другие вопросы по тегам