Image 如何将这些图像组合在一起?

Image 如何将这些图像组合在一起?,image,matlab,image-processing,matlab-guide,Image,Matlab,Image Processing,Matlab Guide,我有200个时间点。对于每个时间点,都有一个图像,其大小为40*40 double,对应于该时间点。例如,image 1对应于时间点1图像k对应于时间点k(k=1,2,…,200) 时间点为T=1:200,图像命名为Image\u T,因此Image\u 1,Image\u 2等 我想把所有这些200图像放在一起。最终尺寸为40*40*200double。最终图像看起来像功能磁共振成像图像(fMRI_szX=40,fMRI_szY=40和fMRI_szT=200)。如何做到这一点? 谢谢 动态变

我有200个时间点。对于每个时间点,都有一个图像,其大小为
40*40 double
,对应于该时间点。例如,
image 1
对应于
时间点1
<代码>图像k对应于时间点k(
k=1,2,…,200

时间点为
T=1:200
,图像命名为
Image\u T
,因此
Image\u 1
Image\u 2

我想把所有这些
200
图像放在一起。最终尺寸为
40*40*200
double。最终图像看起来像功能磁共振成像图像(
fMRI_szX=40
fMRI_szY=40
fMRI_szT=200
)。如何做到这一点? 谢谢

动态变量 请注意,虽然这是可能的,但它被认为是糟糕的编程(例如,请参阅,或者甚至他们的Mathworks中的Mathworks告诉您不要这样做)。最好是直接将图像加载到3D数组或单元格结构中,避免使用动态变量名。为了完整性,我刚刚发布了这个;如果您碰巧必须使用此解决方案,则应立即更改为(单元)阵列

有关为什么
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
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
这将创建矩阵。请注意,我让
for
循环向后运行,以便以最大的大小初始化
A

半矢量化方法

for ii = 200:-1:1
    str = sprintf('Image_%d',ii);
    A(:,:,ii) = eval(str);
end
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
源于
imread
将图像读取为RGB。因此,
A
现在是一个4D矩阵,结构为
m*n*3*T
,其中最后一个索引对应于图像的时间,前三个是RGB格式的图像


由于您没有指定如何获得
40*40
double,因此我保留了4D矩阵。您可以读取它们,然后切换到使用RGB的
uint16
解释,这是一个单一的数字,这将导致
m*n*1*T
变量,您可以通过调用
a=squage(a(:,:,1,:)将其简化为3D变量

即使在编译语言中,
eval
的结果也可能取决于变量的值,因此在运行时之前可能无法预测。