【问题标题】:How to put these images together?如何将这些图像放在一起?
【发布时间】:2015-12-04 16:24:16
【问题描述】:

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

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

我想把所有这些200 图像放在一起。最终大小为40*40*200 double。最终图像看起来像 fMRI 图像(fmri_szX = 40fmri_szY = 40fmri_szT = 200)。如何做到这一点? 谢谢!

【问题讨论】:

    标签: image matlab image-processing matlab-guide


    【解决方案1】:

    动态变量

    请注意,虽然这是可能,但它被认为是糟糕的编程(例如,参见 herethis blog by Loren,甚至在他们的 documentation 中的 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
    

    这将创建您的矩阵。请注意,我让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不支持数组,所以不能直接插入cellarraystrin。

    动态文件名

    尽管标题与上述类似,但这意味着您的 文件名 是结构化的,所以在文件浏览器中,而不是在 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 变量

    【讨论】:

    • 即使在编译语言中,eval 的结果也可能取决于变量的值,因此在运行时可能无法预测。
    猜你喜欢
    • 1970-01-01
    • 2021-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多