web-dev-qa-db-ja.com

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

これはうまく機能します。

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

または、ビットマップにスプラインを配置する簡単な方法が機能する場合があります...

41

Figureを作成するときに、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')
44
Bessi

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

  • フーズ氏の答えが示すように、人物を画像として保存しようとすると、他にも多くの要因が関与します。取得する出力のタイプは、多くのFigureとAxesの設定に依存するため、必要な出力が得られない可能性が高くなります。これは、フィギュアまたは軸のデフォルト設定の変更によって生じる可能性のある不一致に気付かないため、フィギュアを非表示に設定している場合は特に問題になります。要するに、出力は、Mr 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');
20
gnovice

完全に異なる答えは次のとおりです。

画像ファイルが必要な場合は、図全体ではなく画像のみを保存してください。

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

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

imshow('magic.jpg')

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

4
MatlabDoug

私はここでベッシのソリューションを少し拡大しています。イメージが図全体を占めるようにし、出力イメージのサイズを厳密に制御できるようにする方法を知ることは非常に役立つことがわかりました。

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

Figureをマトリックスにレンダリングする場合は、「help @ avifile/addframe」と入力し、「getFrameForFigure」というサブ関数を抽出します。これは、Mathworksが提供する関数であり、(現在)文書化されていない方法でFigureからデータを抽出します。

4
Mr Fooz

-noFigureWindows を使用して、すべての数字を無効にすることができます。

0
Daniel