Как собрать эти изображения вместе?
Я имею 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,:));