如何把这些图像放在一起?

我有200时间点。 对于每个时间点,有一个图像,其大小是40*40 double ,对应于这个时间点。 例如, image 1对应于time point 1 ; image k对应于time point kk = 1,2,...,200 )。

时间点为T = 1:200 ,图像命名为Image_TImage_1Image_2

我想把所有这200张图片放在一起。 最终尺寸是40*40*200双。 最终的图像看起来像fMRI图像( fmri_szX = 40fmri_szY = 40fmri_szT = 200 )。 如何实现? 谢谢!

dynamicvariables

请注意,虽然这是可能的 ,但它被认为是不好的编程(例如在这里看到,或者这个Loren博客 ,甚至Mathworks在他们的文档中告诉你不要这样做)。 将图像直接加载到3D数组或单元格结构中会更好,避免使用dynamicvariables名称。 我只是为了完整而张贴这个; 如果你碰巧必须使用这个解决scheme,你应该立即改变(单元格)数组。

关于为什么eval是一个坏主意的链接文章的要点是,MATLAB不能再预测操作的结果是什么。 例如, A=3*(2:4)被MATLAB识别为输出一个双数组。 如果你eval东西,MATLAB不能再做这个。 MATLAB是一种解释型语言,即每行代码被读取然后运行,而不需要事先编译整个代码。 这意味着每次MATLAB遇到eval ,都必须停止,评估expression式,然后检查输出,存储并继续。 MATLAB所使用的大多数速度引擎(JIT / MAGMA等)在预测语句结果时无法正常工作,因此会在评估过程中closures,导致代码非常慢。

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将包含所需的variables名称。 但是如果你没有设置accumvar作为输出,你可能不会使用disp ,但是例如eval('rm -rf ~/*')会格式化整个磁盘,甚至不会告诉你这样做。

循环方法

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

这将创build您的matrix。 请注意,我让for循环向后运行,以便以最大的大小初始化A

半vector化方法

 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不支持数组,所以你不能直接插入cellarray str 。像cellfun这样的函数也不支持eval所以你必须循环。

dynamic文件名称

尽pipe与上面有类似的标题,这意味着您的文件名称结构化,所以在文件浏览器,而不是MATLAB。 我在这里假设了.jpg文件,但是您可以添加每个受支持的图像扩展。 此外,请务必将所有图像放在一个文件夹中,不要使用该扩展名附加图像,否则必须修改dir()调用以仅包含所需的图像。

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

通常将图像读取为m*n*3文件,其中m*n是以像素为单位的图像大小,而3来自通过imread将其读取为RGB的imread 。 因此A现在是一个4Dmatrix,其结构为m*n*3*T ,最后一个索引对应于图像的时间,前三个是RGB格式的图像。

既然你没有指定如何获得你的40*40双,我已经离开了4Dmatrix。 可能是你读了它们,然后切换到使用RGB的uint16解释,这是一个单一的数字,这将导致一个m*n*1*Tvariables,你可以通过调用A = squeeze(A(:,:,1,:));