2009-06-08 13 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'); 

これは素晴らしいです。

多くの画像処理を行っていると、作成したすべての画像を表示するために実際のドラッグが始まります。ほとんどの場合、画像を保存するだけです。画像に直接書き込んだり、結果を保存したりすることができます。しかしplot/rectangle/imshowを使うのはとても簡単なので、プロット、imshowなどを呼び出し、結果を表示せずに表示されるものを保存できるコマンドがあることを期待しています。誰でもこれのための迅速な解決策を知っていますか?

また、ビットマップ上にスプラインを置くための簡単な方法はうまくいくかもしれない...

答えて

41

あなたがオフVisibileプロパティを設定して図を作成します。あなたのケースで

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

だろうそして、あなたは再びそれを表示したい場合は、私はここにBessiのソリューションにビットを拡大しています

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

を行うことができます

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

。私は、イメージを全体の図形にする方法と、出力イメージのサイズを厳密に制御できる方法を知ることは非常に役立つことがわかりました。

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

あなたはその後、「getFrameForFigure」と呼ばれるサブファンクションを抽出し、マトリックス、タイプ「ヘルプの@ AVIFILE/ADDFRAME」にフィギュアをレンダリングしたい場合。 Figureからデータを抽出するための(現在)文書化されていない方法を使用する、Mathworksが提供する関数です。ここで

4

は完全に別の答えです:

イメージファイルをしたい場合は、その理由だけで、画像の代わりに、全体の姿を保存しませんか?

​​

次に、それが機能していることを証明します。

imshow('magic.jpg') 

これは、さまざまな出力形式のインデックス付きおよびRGBに対しても実行できます。

20

あなたの質問に対する簡単な答えは、BessiMr Foozで与えられます:Figureの 'Visible'設定を 'off'に設定します。それは数字を生成するIMSHOWPRINTのようなコマンドを使用することは非常に簡単ですが、私はそれが必ずしも最良の選択肢ではないと思う理由は、私が要約します:

  • 氏Foozの答えによって示されるように、来る他の多くの要因があります人物を画像として保存しようとするときに演じる。あなたが得る出力のタイプは、多くのFigureとAxesの設定に依存するので、あなたが望む出力を得られない可能性が高くなります。FigureやAxesのデフォルト設定が変更されたことに起因する不一致を気付かないので、不可視に設定されている場合は特に問題になります。つまり、あなたの出力は、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'); 
0

あなたはすべての数字を無効にする-noFigureWindowsを使用することができます。

関連する問題