2009-06-08 180 views
41

这个问题从this question结束。 MATLAB有一个功能强大且灵活的图像显示系统,可让您使用imshow和plot命令显示复杂图像,然后保存结果。例如:在MATLAB中,如何绘制图像并保存结果而不显示它?

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

This works great。

问题是,如果您正在进行大量的图像处理,它会开始真正拖动以显示您创建的每个图像 - 您大多只想保存它们。我知道我可以直接写入图像,然后保存结果。但是使用plot/rectangle/imshow非常简单,所以我希望有一个命令可以让我调用plot,imshow等,不显示结果,然后保存已经显示的内容。任何人都知道这个快速解决方案?

或者,可以快速地把花键到一个位图可能工作...

回答

41

在创建人物设置了都看得到属性

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') 
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提供的函数,它使用一些(当前)未公开的从图中提取数据的方式。

4

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

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

​​

然后证明它的工作。

imshow('magic.jpg') 

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

20

对您的问题的简单回答由BessiMr Fooz给出:将“可见”设置设置为“关闭”。虽然这是非常容易使用像IMSHOWPRINT命令生成的数字,我来总结一下为什么我认为这并不一定是最好的选择:

  • 正如福兹先生的回答说明,有来许多其他因素尝试将图形保存为图像时发挥作用。您获得的输出类型将取决于许多图形和坐标轴设置,从而增加了您无法获得所需输出的可能性。如果您的数字设置为不可见,则这可能尤其成问题,因为您不会注意到可能由图形或坐标轴的默认设置更改导致的一些差异。简而言之,正如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'); 
相关问题