代码之家  ›  专栏  ›  技术社区  ›  Shawn

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

  •  0
  • Shawn  · 技术社区  · 11 年前

    我有 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 ). 如何实现这一目标? 谢谢

    1 回复  |  直到 11 年前
        1
  •  18
  •   Adriaan Avinash Kumar Jha    4 年前

    动态变量

    注意,虽然这是 可能的 ,这被认为是错误的编程(例如参见 here 或 this blog by Loren 甚至他们的数学作品 documentation 告诉你不要这样做)。最好将图像直接加载到3D阵列或单元结构中,避免使用动态变量名。我只是为了完整而发布了这个;如果您碰巧必须使用此解决方案,则应立即更改为(cell-)数组。

    链接文章的要点以及原因 eval 这是一个糟糕的想法,因为MATLAB无法再预测操作的结果。例如 A=3*(2:4) 被MATLAB识别为输出双数组。如果你 评估 MATLAB不能再这样了。MATLAB是一种解释语言,即每一行代码都是先读取然后运行的,而无需事先编译整个代码。这意味着MATLAB每次遇到 评估 ,它必须停止,计算表达式,然后检查输出,存储并继续。MATLAB使用的大多数速度引擎(JIT/MAGMA等)在不预测语句结果的情况下无法工作,因此在 评估 评估,使代码非常缓慢。

    此外,使用 评估 。请考虑以下事项:

    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
    

    评估 不支持数组,因此不能直接插入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 源于它们被读取为RGB imread 因此 A. 现在是4D矩阵,结构如下 m*n*3*T ,其中最后一个索引对应于图像的时间,前三个是RGB格式的图像。

    由于您没有指定如何获得 40*40 双倍,我已经离开4D矩阵。可能是你读了它们,然后改用 uint16 RGB的解释,它是一个单一的数字,这将导致 m*n*1*T 变量,可以通过调用 A = squeeze(A(:,:,1,:));