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

时间:2009-06-08 06:42:50

标签: graphics matlab

这个问题开始于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等,不显示结果然后保存已经显示的内容。有人知道任何快速解决方案吗?

或者,将样条线放到位图上的快速方法可能有效......

5 个答案:

答案 0 :(得分:44)

创建图形时,将 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')

答案 1 :(得分:20)

问题的简单答案由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');

答案 2 :(得分:4)

我正在扩展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 :(得分:4)

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

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

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

然后证明它有效。

imshow('magic.jpg')

对于索引和RGB也可以针对不同的输出格式进行此操作。

答案 4 :(得分:0)

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