2009-06-08 157 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'); 
相關問題