【问题标题】:In MATLAB, how do I plot to an image and save the result without displaying it?在 MATLAB 中,如何绘制到图像并保存结果而不显示它?
【发布时间】:2010-11-01 02:39:05
【问题描述】:

这种问题从this question 结束的地方开始。 MATLAB 有一个强大而灵活的图像显示系统,让您可以使用 imshow 和 plot 命令来显示复杂的图像,然后保存结果。例如:

im = imread('image.tif');
f = figure, imshow(im, 'Border', 'tight');
rectangle('Position', [100, 100, 10, 10]);
print(f, '-r80', '-dtiff', 'image2.tif');

这很好用。

问题在于,如果您要进行大量图像处理,那么显示您创建的每张图像就开始变得非常困难——您通常只想保存它们。我知道我可以开始直接写入图像,然后保存结果。但是使用 plot/rectangle/imshow 非常简单,所以我希望有一个命令可以让我调用 plot、imshow 等,而不是显示结果然后保存将显示的内容。有人知道对此有什么快速解决方案吗?

或者,一种将样条线放在位图上的快速方法可能会起作用...

【问题讨论】:

    标签: graphics matlab


    【解决方案1】:

    当您创建图窗时,您将 Visibile 属性设置为 Off

    f = figure('visible','off')
    

    在你的情况下是

    im = imread('image.tif');
    f = figure('visible','off'), imshow(im, 'Border', 'tight');
    rectangle('Position', [100, 100, 10, 10]);
    print(f, '-r80', '-dtiff', 'image2.tif');
    

    如果你想再次查看它,你可以这样做

    set(f,'visible','on')
    

    【讨论】:

      【解决方案2】:

      我在这里稍微扩展了 Bessi 的解决方案。我发现知道如何让图像占据整个图形并能够严格控制输出图像的大小非常有帮助。

      % prevent the figure window from appearing at all
      f = figure('visible','off'); 
      % alternative way of hiding an existing figure
      set(f, 'visible','off'); % can use the GCF function instead
      
      % If you start getting odd error messages or blank images,
      % add in a DRAWNOW call.  Sometimes it helps fix rendering
      % bugs, especially in long-running scripts on Linux.
      %drawnow; 
      
      % optional: have the axes take up the whole figure
      subplot('position', [0 0 1 1]); 
      
      % show the image and rectangle
      im = imread('peppers.png');
      imshow(im, 'border','tight');
      rectangle('Position', [100, 100, 10, 10]);
      
      % Save the image, controlling exactly the output
      % image size (in this case, making it equal to 
      % the input's). 
      [H,W,D] = size(im);
      dpi = 100;
      set(f, 'paperposition', [0 0 W/dpi H/dpi]);
      set(f, 'papersize', [W/dpi H/dpi]);
      print(f, sprintf('-r%d',dpi), '-dtiff', 'image2.tif');
      

      如果您想将图形渲染为矩阵,请输入“help @avifile/addframe”,然后提取名为“getFrameForFigure”的子函数。这是一个 Mathworks 提供的函数,它使用一些(当前)未记录的方式从图中提取数据。

      【讨论】:

        【解决方案3】:

        这是一个完全不同的答案:

        如果你想要一个图像文件,为什么不只保存图像而不是整个图形?

        im = magic(10)
        imwrite(im/max(im(:)),'magic.jpg')
        

        然后证明它有效。

        imshow('magic.jpg')
        

        这可以用于索引和 RGB 也可以用于不同的输出格式。

        【讨论】:

          【解决方案4】:

          BessiMr Fooz 给出了您问题的简单答案:将图形的“可见”设置为“关闭”。虽然使用IMSHOWPRINT 之类的命令来生成数字非常容易,但我会总结一下为什么我认为它不一定是最佳选择:

          • 正如 Fooz 先生的回答所示,在尝试将图形另存为图像时,还有许多其他因素会发挥作用。您获得的输出类型将取决于许多图形和轴设置,从而增加了您无法获得所需输出的可能性。如果您将图形设置为不可见,这可能会特别成问题,因为您不会注意到可能由图形或轴的默认设置更改引起的一些差异。简而言之,您的输出对许多设置变得高度敏感,然后您必须将这些设置添加到代码中以控制输出,如 Fooz 先生的示例所示。

          • 即使您没有查看生成的图形,您仍然可能使 MATLAB 完成了超出实际需要的工作。图形对象仍然被创建,即使它们没有被渲染。如果速度是一个问题,从数字生成图像似乎不是理想的解决方案。

          我的建议是直接修改图像数据并使用IMWRITE保存。它可能不像使用 IMSHOW 和其他绘图解决方案那么容易,但我认为它更有效,并且提供了对各种绘图设置不那么敏感的更强大和一致的结果。对于您给出的示例,我相信创建黑色矩形的替代代码如下所示:

          im = imread('image.tif');
          [r,c,d] = size(im);
          x0 = 100;
          y0 = 100;
          w = 10;
          h = 10;
          x = [x0:x0+w x0*ones(1,h+1) x0:x0+w (x0+w)*ones(1,h+1)];
          y = [y0*ones(1,w+1) y0:y0+h (y0+h)*ones(1,w+1) y0:y0+h];
          index = sub2ind([r c],y,x);
          im(index) = 0;
          im(index+r*c) = 0;
          im(index+2*r*c) = 0;
          imwrite(im,'image2.tif');
          

          【讨论】:

            【解决方案5】:

            您可以使用-noFigureWindows 禁用所有数字。

            【讨论】:

              猜你喜欢
              • 2011-08-14
              • 2018-04-23
              • 1970-01-01
              • 2011-03-11
              • 2017-08-11
              • 1970-01-01
              • 2012-03-26
              相关资源
              最近更新 更多