我有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
)。如何实现呢?谢谢!
请注意,尽管这是可能的,但它被认为是不好的编程(例如,请参见here,或者Loren的此博客,甚至其文档中的Mathworks都告诉您不要这样做)。将图像直接加载到3D数组或单元结构中会更好,避免使用动态变量名。我只是为了完整性而发布它。如果您碰巧不得不使用此解决方案,则应立即更改为(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解释,RGB是一个数字,会产生一个m*n*1*T
变量,您可以通过调用将其简化为3D变量A = squeeze(A(:,:,1,:));
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句