it-swarm.com.de

Wie zeichne ich in MATLAB ein Bild und speichere das Ergebnis, ohne es anzuzeigen?

Diese Frage beginnt wo diese Frage endet. MATLAB verfügt über ein leistungsstarkes und flexibles Bildanzeigesystem, mit dem Sie die Befehle imshow und plot verwenden können, um komplexe Bilder anzuzeigen und das Ergebnis zu speichern. Zum 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 super. 

Das Problem ist, dass, wenn Sie viele Bildverarbeitungen durchführen, diese anfangen, wirklich zu ziehen, um jedes Bild anzuzeigen, das Sie erstellen - Sie möchten sie meistens nur speichern. Ich weiß, ich könnte direkt in ein Bild schreiben und dann das Ergebnis speichern. Plot/Rechteck/Imshow zu verwenden ist jedoch so einfach, also hoffe ich, dass es einen Befehl gibt, mit dem ich Plot, Imshow usw. aufrufen kann, die Ergebnisse nicht anzeigen und dann speichern kann, was angezeigt worden wäre. Kennt jemand eine schnelle Lösung dafür? 

Alternativ kann eine schnelle Methode zum Einfügen eines Splines in eine Bitmap funktionieren.

41

Wenn Sie die Figur erstellen, setzen Sie die Eigenschaft Visibile auf Off .

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

Was in Ihrem Fall wäre

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 es noch einmal sehen möchten, können Sie dies tun

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

Die einfache Antwort auf Ihre Frage wird von Bessi und Mr Fooz gegeben: Setzen Sie die Einstellung "Sichtbar" für die Zahl auf "Aus". Obwohl es sehr einfach ist, Befehle wie IMSHOW und PRINT zu verwenden, 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, spielen viele andere Faktoren eine Rolle, wenn man versucht, Zahlen als Bilder zu speichern. Die Art der Ausgabe hängt von vielen Zahlen- und Achseneinstellungen ab. Dadurch steigt die Wahrscheinlichkeit, dass Sie nicht die gewünschte Ausgabe erhalten. Dies kann besonders problematisch sein, wenn Sie Ihre Zahlen als unsichtbar festlegen, da Sie keine Abweichung feststellen, die durch eine Änderung der Standardeinstellung für die Zahl oder Achsen verursacht werden könnte. Kurz gesagt, Ihre Ausgabe reagiert sehr empfindlich auf eine Reihe von Einstellungen, die Sie dann zur Kontrolle Ihrer Ausgabe Ihrem Code hinzufügen müssten, wie das Beispiel von Herrn Fooz zeigt.

  • Selbst wenn Sie die Figuren nicht so betrachten, wie sie gemacht werden, ist es wahrscheinlich, dass MATLAB mehr Arbeit erledigt, als es wirklich notwendig ist. Grafikobjekte werden auch dann erstellt, wenn sie nicht gerendert werden. Wenn Geschwindigkeit ein Problem ist, scheint das Generieren von Bildern aus Zahlen nicht die ideale Lösung zu sein.

Mein Vorschlag ist, die Bilddaten direkt zu ändern und mit IMWRITE zu speichern. Es ist zwar nicht so einfach wie bei der Verwendung von IMSHOW und anderen Plotlösungen, aber ich denke, es ist effizienter und liefert robustere und konsistentere Ergebnisse, die auf verschiedene Ploteinstellungen nicht so empfindlich reagieren. Ich glaube, dass der alternative Code für das Erstellen eines schwarzen Rechtecks ​​in etwa so aussehen würde:

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

Hier ist eine völlig andere Antwort:

Wenn Sie eine Bilddatei heraus haben möchten, speichern Sie das Bild statt der gesamten Figur.

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

Dann beweise, dass es funktioniert hat.

imshow('magic.jpg')

Dies kann für indiziert und RGB auch für verschiedene Ausgabeformate erfolgen.

4
MatlabDoug

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 aufnehmen kann und dass die Größe des Ausgabebildes streng kontrolliert werden 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 Figur in eine Matrix rendern möchten, geben Sie "help @ avifile/addframe" ein und extrahieren Sie die Unterfunktion "getFrameForFigure". Es ist eine von Mathworks bereitgestellte Funktion, die einige (derzeit) undokumentierte Methoden zum Extrahieren von Daten aus einer Abbildung verwendet.

4
Mr Fooz

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

0
Daniel