在MATLAB中,如何绘制图像并保存结果而不显示?

这个问题从这个问题结束的地方开始。 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'); 

这很好。

问题是,如果你正在做很多的image processing,它开始是真正的拖动,以显示你创build的每个图像 – 你最想要保存它们。 我知道我可以直接写入图像,然后保存结果。 但是使用plot / rectangle / imshow非常容易,所以我希望有一个命令可以让我调用plot,imshow等,不显示结果,然后保存将显示的内容。 任何人都知道这个快速的解决scheme?

或者,将样条线放到位图上的快速方法也许可行。

当您创buildgraphics时,将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') 

Bessi 先生和Fooz先生给出了一个简单的答案:将“可见”设置为“closures”。 尽pipe使用像IMSHOW和PRINT这样的命令很容易生成数字,但我会总结一下为什么我认为它不一定是最好的select:

  • 正如Fooz先生的回答所说,在试图将数字保存为图像时,还有许多其他因素发挥作用。 你得到的输出types将取决于许多graphics和轴的设置,从而增加了你不会得到你想要的输出的可能性。 如果将graphics设置为不可见,则这可能尤其成问题,因为您不会注意到可能由graphics或坐标轴的默认设置更改导致的一些差异。 简而言之,正如Fooz先生的例子所显示的那样,您的输出对许多设置非常敏感,您将不得不添加到代码中来控制输出。

  • 即使你没有看到这些数字,你仍然可能让MATLAB做了比真正需要的更多的工作。 graphics对象仍然被创build,即使它们没有被渲染。 如果速度是一个问题,从数字生成图像似乎不是理想的解决scheme。

我的build议是直接修改图像数据并使用IMWRITE进行保存。 这可能不像使用IMSHOW和其他绘图解决scheme那样容易,但是我认为它更高效,并且提供了更加稳健和一致的结果,这些结果对各种绘图设置不敏感。 对于你给的例子,我相信用于创build黑色矩形的替代代码看起来像这样:

 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([rc],y,x); im(index) = 0; im(index+r*c) = 0; im(index+2*r*c) = 0; imwrite(im,'image2.tif'); 

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

 % 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'); 

如果要将graphics呈现为matrix,请input“help @ avifile / addframe”,然后提取名为“getFrameForFigure”的子function。 这是一个Mathworks提供的函数,它使用了一些(当前)未公开的从图中提取数据的方法。

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

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

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

然后certificate它的工作。

 imshow('magic.jpg') 

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

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