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

Sha*_*awn 0 matlab image image-processing matlab-guide

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

时间点是,因此,T = 1:200图像命名为,等等.Image_TImage_1Image_2

我想把所有这些200图像放在一起.最终尺寸是40*40*200双倍的.最终图像看起来像fMRI图像(fmri_szX = 40,fmri_szY = 40fmri_szT = 200).怎么实现呢?谢谢!

Adr*_*aan 16

动态变量

请注意,尽管这是可能的,但它被认为是糟糕的编程(例如,请参阅此处,或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
Run Code Online (Sandbox Code Playgroud)

现在accumvar将包含所需的变量名称.但是如果你没有设置accumvar为输出,你也可以不使用a disp,但是例如eval('rm -rf ~/*')哪个会格式化你的整个磁盘,甚至没有告诉你它正在这样做.

循环方式

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

这会创建您的矩阵.请注意,我让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
Run Code Online (Sandbox Code Playgroud)

eval不支持数组,所以你不能直接插入cellarray str.

动态文件名

尽管有类似的标题,但这意味着你的文件名是 结构化的,所以在文件浏览器中,而不是MATLAB.我在这里假设.jpg文件,但您可以添加每个支持的图像扩展名.此外,请确保将所有图像放在一个文件夹中,并且没有带有该扩展名的其他图像,或者您必须修改该dir()调用以仅包含所需的图像.

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

图像通常作为m*n*3文件读取,其中m*n您的图像大小以像素为单位,并且3源于它们被读取为RGB的事实imread.因此A,现在是一个4D矩阵,结构为m*n*3*T,其中最后一个索引对应于图像的时间,前三个是RGB格式的图像.

由于您没有指定获得40*40双精度的方式,我已经离开了4D矩阵.你可以读它们,然后切换到使用uint16RGB 的解释,这是一个单一的数字,这将产生一个m*n*1*T变量,你可以通过调用将其变为3D变量A = squeeze(A(:,:,1,:));

  • 即使在编译语言中,"eval"的结果也可能取决于变量的值,因此在运行时可能无法预测. (2认同)