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

hsvhsicv  于 2022-11-24  发布在  Matlab
关注(0)|答案(1)|浏览(302)

我有200个时间点,对于每个时间点,有一个大小为40*40 double的图像对应于这个时间点,例如image 1对应于time point 1; image 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)。如何实现?谢谢!

fnvucqvd

fnvucqvd1#

动态变量

请注意,虽然这是 * 可能的 *,但它被认为是糟糕的编程(例如,请参阅此处,或this blog by Loren,甚至Mathworks在其documentation中告诉您不要这样做)。将图像直接加载到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不支持数组,因此不能直接插入cellarray 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双精度浮点数,因此我保留了4D矩阵。可能您读取了它们,然后切换到使用RGB的uint16解释,这是一个单一的数字,这将导致m*n*1*T变量,您可以通过调用A = squeeze(A(:,:,1,:));将其简化为3D变量

相关问题