44 Stimmen

Wie kann ich in MATLAB ein Bild plotten und das Ergebnis speichern, ohne es anzuzeigen?

Diese Frage beginnt dort, wo diese Frage endet. MATLAB verfügt über ein leistungsfähiges und flexibles Bilddarstellungssystem, mit dem Sie mit den Befehlen imshow und plot komplexe Bilder darstellen und anschließend das Ergebnis speichern können. Ein Beispiel:

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

Das funktioniert hervorragend.

Das Problem ist, dass es bei einer umfangreichen Bildbearbeitung sehr mühsam ist, alle Bilder zu zeigen, die man erstellt hat - meistens möchte man sie nur speichern. Ich weiß, dass ich damit beginnen könnte, direkt in ein Bild zu schreiben und dann das Ergebnis zu speichern. Aber die Verwendung von plot/rectangle/imshow ist so einfach, dass ich hoffe, es gibt einen Befehl, mit dem ich plot, imshow usw. aufrufen, die Ergebnisse nicht anzeigen und dann speichern kann, was angezeigt worden wäre. Kennt jemand eine schnelle Lösung für dieses Problem?

Alternativ dazu könnte eine schnelle Möglichkeit, einen Spline auf eine Bitmap zu legen, funktionieren...

47voto

Bessi Punkte 742

Wenn Sie die Figur erstellen, setzen Sie die Sichtbar Eigenschaft zu Aus .

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

In Ihrem Fall wäre das

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

Und wenn Sie sie noch einmal ansehen möchten, können Sie dies tun

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

21voto

gnovice Punkte 124264

Die einfache Antwort auf Ihre Frage lautet Bessi y Herr Fooz : Setzen Sie die Einstellung "Sichtbar" für die Figur auf "Aus". Obwohl es sehr einfach ist, Befehle wie IMSHOW y DRUCKEN um Zahlen zu generieren, werde ich zusammenfassen, warum ich denke, dass dies nicht unbedingt die beste Option ist:

  • Wie aus der Antwort von Herrn Fooz hervorgeht, gibt es noch viele andere Faktoren, die beim Speichern von Figuren als Bilder ins Spiel kommen. Die Art der Ausgabe, die Sie erhalten, hängt von vielen Figuren- und Achseneinstellungen ab, was die Wahrscheinlichkeit erhöht, dass Sie nicht die gewünschte Ausgabe erhalten. Dies könnte besonders problematisch sein, wenn Sie Ihre Figuren als unsichtbar eingestellt haben, da Sie eine Diskrepanz, die durch eine Änderung der Standardeinstellung für die Figur oder die Achsen verursacht werden könnte, nicht bemerken würden. Kurz gesagt, Ihre Ausgabe reagiert sehr empfindlich auf eine Reihe von Einstellungen, die Sie dann in Ihren Code aufnehmen müssten, um Ihre Ausgabe zu steuern, wie das Beispiel von Herrn Fooz zeigt.

  • Selbst wenn Sie sich die Zahlen nicht ansehen, während sie erstellt werden, lassen Sie MATLAB wahrscheinlich mehr Arbeit machen, als wirklich nötig ist. Grafikobjekte werden immer noch erstellt, auch wenn sie nicht gerendert werden. Wenn es auf Geschwindigkeit ankommt, scheint die Generierung von Bildern aus Zahlen nicht die ideale Lösung zu sein.

Ich schlage vor, die Bilddaten direkt zu ändern und sie mit IMWRITE . Es ist vielleicht nicht so einfach wie die Verwendung von IMSHOW und anderen Plot-Lösungen, aber ich denke, es ist effizienter und liefert robustere und konsistentere Ergebnisse, die nicht so empfindlich auf verschiedene Plot-Einstellungen reagieren. Für das von Ihnen genannte Beispiel würde der alternative Code zur Erstellung eines schwarzen Rechtecks etwa so aussehen:

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

4voto

Mr Fooz Punkte 102791

Ich erweitere die Lösung von Bessi hier ein wenig. Ich habe festgestellt, dass es sehr hilfreich ist zu wissen, wie das Bild die gesamte Figur einnehmen kann und wie man die Größe des Ausgabebildes genau steuern kann.

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

Wenn Sie die Abbildung in eine Matrix umwandeln möchten, geben Sie "help @avifile/addframe" ein und extrahieren Sie dann die Unterfunktion "getFrameForFigure". Es handelt sich um eine von Mathworks bereitgestellte Funktion, die einige (derzeit) nicht dokumentierte Methoden zur Extraktion von Daten aus der Abbildung verwendet.

4voto

MatlabDoug Punkte 5724

Hier ist eine ganz andere Antwort:

Wenn Sie eine Bilddatei ausgeben möchten, warum speichern Sie dann nicht einfach das Bild und nicht die gesamte Figur?

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

Dann beweisen Sie, dass es funktioniert hat.

imshow('magic.jpg')

Dies kann sowohl für indizierte als auch für RGB-Dateien in verschiedenen Ausgabeformaten erfolgen.

0voto

Daniel Punkte 36242

Sie könnten verwenden -noFigureWindows um alle Zahlen zu deaktivieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X