如何把这些图像放在一起?
我有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图像( fmri_szX = 40
, fmri_szY = 40
和fmri_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*T
variables,你可以通过调用A = squeeze(A(:,:,1,:));