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

肖恩

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

时间点T = 1:200,与图像的命名Image_T,因此Image_1Image_2等等。

我想将所有这些200图像放在一起。最终大小是40*40*200两倍。最终图像的样子的fMRI图像(fmri_szX = 40fmri_szY = 40fmri_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矩阵。可能是您阅读了它们,然后转而使用uint16RGB解释,RGB是一个数字,会产生一个m*n*1*T变量,您可以通过调用将其简化为3D变量A = squeeze(A(:,:,1,:));

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章