Hallo,
ich will einen reinen Text in Matlab als Bild speichern. Dessen Länge ist variabel. Nun versuche ich das Bild entsprechend der Länge und Größe der Schrift an zu passen, um die große weiße Hintergrundfläche ab zu schneiden.
Mein Problem ist, dass Matlab immer die Schrift mit skaliert und sich somit nichts außer die Schriftgröße ändert.
Ich habe noch eine Funktion gefunden, die komfortabler ist. Mit dem Fadenkreuz wählst Du zuerst die obere linke Ecke und dann die untere linke Ecke aus.
Hi Hubertus,
vielen Dank. Die zweite Version kann ich nicht nehmen, da das zuschneiden automatisch passieren soll und bei Befehl pts=round(ginput(2)) rechnet matlab ewig.
Bei der ersten Variante versteh ich nicht ganz, wie ich meinen Bildausschnitt den ich brauche finden soll. Vielleicht kannst mir da nochmal helfen?
Mein code ist momentan ganz simpel:
Code:
f1 = figure;
text1 = 'Hier steht immer was anderes';
path = 'C:\Users\...\';
filename = 'Name';
box off; grid off; axis off;
t = text(0,0.5,text1,'FontSize',40);
print(f1, '-dpng', [path filename]);
Wenn Du dann zunächst das Bild per GETFRAME aus dem Fenster kopierst, kannst Du es entsprechend dem EXTENT ausschneiden. Dafür müssen die Units der TEXT und AXES-Objekte am besten in "pixels" angegeben werden.
ich war natürlich davon ausgegangen, dass Du bereits ein Bild als Matrix vorliegen hast. Darum bitte den Code mit beifügen. Dann hätte ich diesen Vorschlag nicht gemacht. Das als kleine Hilfe und Gedankenstütze für die nächsten Anfragen.
@Hubertus: sry, habe nicht daran gedacht, dass die Frage nicht eindeutig ist.
@Jan S: Auf die Idee über EXTENT die Länge zu bekommen hatte ich auch schon, aber wenn ich danach die Achsen limitiere, dann skaliert Matlab den Text neu. Hier liegt mein Problem. Wie ich das Bild über getframe einfrieren soll versteh ich leider nicht.
Über den Link komme ich auch nicht weiter.
Code:
f1 = figure;
text1 = 'Hier steht immer was anderes';
path = 'C:\Users\...\';
filename = 'Name';
box off; grid off; axis off;
t = text(0,0.5,text1,'FontSize',40);
E = get(t, 'Extent') xlim([E(1) E(1)+E(3)]) ylim([E(2) E(2)+E(4)]) print(f1, '-dpng', [path filename]);
Jetzt steht in "Pic.cdata" eine Matrix mit den Pixel-Werten des Inhalts des AXES-Objekts. In "Extent" stehen die Start-Koordinaten und die Ausdehnung in X-und Y-Richtung des Textes. Also solltest Du "Extent" verwenden können, um den Text aus der Bild-Matrix auszuschneiden und per IMWRITE zu speichern.
Ich schaffe es immer noch nicht.
Extent % [left,bottom,width,height] scheint nicht die richtigen Koordinaten zu enthalten. Weite und Höhe stimme nicht.
% Read demo RGB image from graphics file.
im = imread('street2.jpg');
% Display image with true aspect ratio image(im); axisimage
% Use ginput to select corner points of a rectangular % region by pointing and clicking the mouse twice
p = ginput(2);
% Get the x and y corner coordinates as integers
sp(1) = min(floor(p(1)), floor(p(2))); %xmin
sp(2) = min(floor(p(3)), floor(p(4))); %ymin
sp(3) = max(ceil(p(1)), ceil(p(2))); %xmax
sp(4) = max(ceil(p(3)), ceil(p(4))); %ymax
% Index into the original image to create the new image
MM = im(sp(2):sp(4), sp(1): sp(3),:);
% Display the subsetted image with appropriate axis ratio figure; image(MM); axisimage
% Write image to graphics file. imwrite(MM,'street2_cropped.tif')
Das entspricht genau dem was ich machen will, allerdings will ich kein Bild einlesen und vor allem soll die zu schneidende Größe automatisch erfasst werden.
Kann mir jemand helfen? Ich versuche mich jetzt schon wieder seit einer Ewigkeit daran.
"böse Falle" Dein Problem. Dein letztes Beispiel ist zu umständlich und führt zum gleichen Resulat wie das hier:
Code:
f1 = figure;
text1 = 'Hier steht immer was anderes';
path = 'C:\Users\...\';
filename = 'Name';
box off; grid off; axis off;
t=text(0,0.5,text1,'FontSize',40);
frame=getframe(gcf); % aus Text wird Bild
I=frame.cdata;
figure; imshow(I)
pts=round(ginput(2));
cropped=I(pts(1,2):pts(2,2),pts(1,1):pts(2,1));
figure; imshow(cropped)% Das ist jetzt Dein Bild
Du hast dabei immer noch die händische Eingabe von ginput. Danach ist aber die Matrix fertig. Wenn Du auch noch auf ginput verzichten willst, brauchst Du noch eine Funktion, die das 1. schwarze Pixel oben links detektiert und dann das letzte unten rechts. Dafür habe ich auch keine Lösung. Vielleicht hilft Dir der obige Vorschlag weiter.
das Problem ist, dass sich die Angaben von "Extent" auf das Axes Objekt bezieht, jedoch dieses in dem figure eingebettet ist, welches die absoluten Koordinaten nach dem "getframe" bereitstellt. Das heisst du musst erst die Koordinaten des text-Objektes aus der axes fuer das figure-Koordinatensystem berechnen.
Zum besseren Verstaendnis, ein Beispiel:
Code:
x = 30;
y = 70;
f1 = figure('Units','pixel');
posfig = get(f1,'Position');
ax = axes('Units','pixel');
posax = get(ax,'Position');
t = text(x,y,'Hier steht immer was anderes','Units','pixel','Verticalalignment','top','Fontsize',20);
ex = get(t,'Extent');
% Berechnung der Koordinaten der linken, oberen Ecke des Text-Objektes in % dem figure (nicht im axes-Objekt)
ex(1) = ex(1) + posax(1);
ex(2) = posfig(4) - posax(2) - y;
im = getframe(f1);
crop = imcrop(im.cdata,ex);
figure,imshow(crop);
Extent % [left,bottom,width,height] scheint nicht die richtigen Koordinaten zu enthalten. Weite und Höhe stimme nicht.
Nein, der Extent liefert genau die richtigen Werte. Die Einheiten sind dabei die Einheiten des gemessenen Objekts, in meinem Beispiel also Pixels. Bitte poste eine Kopie des von Dir benutzten Programms. Offenbar steckt ein anderer Fehler drin.
@SCO: Wenn man den AXES-Handle in GETFRAME angibt, wird auch nur das AXES-Objekt wiedergegeben. Die Pixel-Koordinaten beziehen sich damit dann auch auf den AXES-Bereich und müssen nicht umgerechnet werden.
erstmal Danke fuer den Hinweis mit dem Axis-handle, habe ich in deinem leider Code uebersehen.
Trotzdem musste ich noch diese Zeile einfuegen, damit es funktioniert:
f1 = figure
ax = axes('Units','pixels');
posax = get(ax,'Position');
t = text(50,50,'Hier steht immer was anderes','Units','pixels','Verticalalignment','bottom','Fontsize',16);
ex = get(t,'Extent');
im = getframe(ax);
crop = imcrop(im.cdata,ex);
imshow(crop)
HI ich habe auch nochmal ne Frage.
Nach dem Befehl im = getframe(f1); öffnet sich immer das Fenster. kann ich das irgendwie unterbinden?
Mit den Befehlen
Zitat:
set(figure(1) , 'Visible', 'Off');
und
Zitat:
close Figure 1;
wird verständlicher Weise das Fenster erst im Nachhinein geschlossen.
Und den Zusatz ('Visible', 'Off') wie beim ersten Fenster im Befehl getframe nimmt er nicht an
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.