WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Bild zuschneiden

 

qwerqwer99
Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 12.11.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.11.2010, 13:17     Titel: Bild zuschneiden
  Antworten mit Zitat      
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.

Kann mit jemand helfen? Danke!
Private Nachricht senden Benutzer-Profile anzeigen


Hubertus
Forum-Meister

Forum-Meister


Beiträge: 1.034
Anmeldedatum: 08.01.09
Wohnort: Hamburg
Version: ---
     Beitrag Verfasst am: 12.11.2010, 13:22     Titel:
  Antworten mit Zitat      
Moin,

du mußt den Text im Bild "ausschneiden". Etwa so:

Code:
I=imread('rice.png');   % Demobild aus Matlab
I2=I(1:56,1:256);
figure; imshow(I2)


Viele Grüße

Hubertus
Private Nachricht senden Benutzer-Profile anzeigen
 
Hubertus
Forum-Meister

Forum-Meister


Beiträge: 1.034
Anmeldedatum: 08.01.09
Wohnort: Hamburg
Version: ---
     Beitrag Verfasst am: 12.11.2010, 13:34     Titel:
  Antworten mit Zitat      
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.

Code:
I=imread('rice.png');
figure; imshow(I)
pts=round(ginput(2));
cropped=I(pts(1,2):pts(2,2),pts(1,1):pts(2,1));
figure; imshow(cropped)



Hubertus
Private Nachricht senden Benutzer-Profile anzeigen
 
qwerqwer99
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 12.11.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.11.2010, 15:19     Titel:
  Antworten mit Zitat      
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]);
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 12.11.2010, 15:39     Titel:
  Antworten mit Zitat      
Hallo qwerqwer,

Schau Dir doch mal den Extent des erzeugten Textes an:
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);
Extent = get(t, 'Extent')
 

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.

In der FEX findest du auch:
http://www.mathworks.com/matlabcent.....uttons-with-better-labels
Dort wird auch ein Text ausgeschnitten und dann als Bild in einen Button eingesetzt. Vielleicht kannst du ja in diesem Code etwas brauchbares finden.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Hubertus
Forum-Meister

Forum-Meister


Beiträge: 1.034
Anmeldedatum: 08.01.09
Wohnort: Hamburg
Version: ---
     Beitrag Verfasst am: 12.11.2010, 17:05     Titel:
  Antworten mit Zitat      
Hallo qwerqwer99,

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.

Ein schönes Wochenende!!!
Hubertus
Private Nachricht senden Benutzer-Profile anzeigen
 
qwerqwer99
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 12.11.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.11.2010, 16:29     Titel:
  Antworten mit Zitat      
@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]);
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 17.11.2010, 13:42     Titel:
  Antworten mit Zitat      
Hallo qwerqwer99,

Code:

f1       = figure;
text1    = 'Hier steht immer was anderes';
path     = 'C:\Users\...\';
filename = 'Name';
AxesH = axes('XGrid', 'off', 'YGrid', 'off', 'box', 'off');
t = text(0,0, text1, 'Units', 'pixels', 'FontSize', 40, ...
   'HorizontalAlignment', 'left', ...
   'VerticalAlignment', 'bottom');
Extent = get(t, 'Extent');
Pic = getframe(AxesH);
 

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.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
qwerqwer99
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 12.11.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.11.2010, 12:52     Titel:
  Antworten mit Zitat      
Ich schaffe es immer noch nicht.
Extent % [left,bottom,width,height] scheint nicht die richtigen Koordinaten zu enthalten. Weite und Höhe stimme nicht.

Ich habe dieses Beispiel gefunden: http://www.mathworks.com/help/techdoc/creating_plots/f2-501.html
Code:
% Read demo RGB image from graphics file.
im = imread('street2.jpg');

% Display image with true aspect ratio
image(im); axis image

% 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); axis image

% 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.
Private Nachricht senden Benutzer-Profile anzeigen
 
Hubertus
Forum-Meister

Forum-Meister


Beiträge: 1.034
Anmeldedatum: 08.01.09
Wohnort: Hamburg
Version: ---
     Beitrag Verfasst am: 18.11.2010, 13:37     Titel:
  Antworten mit Zitat      
Moin qwerqwer99,

"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.

Viel Glück

Hubertus
Private Nachricht senden Benutzer-Profile anzeigen
 
Sco
Forum-Meister

Forum-Meister


Beiträge: 699
Anmeldedatum: 15.08.10
Wohnort: Dundee
Version: 2008a, 2010a
     Beitrag Verfasst am: 18.11.2010, 14:27     Titel:
  Antworten mit Zitat      
Hallo,

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


Ps. mit:
Code:

set(ax,'Visible','off');
 

kannst du die Axes auch wieder unsichtbar machen, wenn sie dich stoert.

MFG

Sco
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 18.11.2010, 14:48     Titel:
  Antworten mit Zitat      
Hallo qwerqwer99,

Zitat:
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.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
qwerqwer99
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 12.11.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.11.2010, 15:59     Titel:
  Antworten mit Zitat      
Hi vielen Dank an alle, jetzt funktioniert es so wie ich es haben wollte!

Ich habe die Variante von Sco genommen. Danke Sco.
Private Nachricht senden Benutzer-Profile anzeigen
 
Sco
Forum-Meister

Forum-Meister


Beiträge: 699
Anmeldedatum: 15.08.10
Wohnort: Dundee
Version: 2008a, 2010a
     Beitrag Verfasst am: 18.11.2010, 16:08     Titel:
  Antworten mit Zitat      
Hallo Jan,

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:
Code:

ex(2) = posax(4) - ex(2) - ex(4);
 


Nehmen wir dies als Beispiel:
Code:

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)
 

Dies sollte doch, laut deiner Beschreibung, eigentlich funktionieren, oder?
ex ergibt:
Code:

ex =
    50    48   287    27
 

Wenn ich mir jetzt jedoch mit imtool die Koordinaten der linken unteren Ecke des Textobjektes anschauen:
Code:

imtool(im.cdata)
 

so ist dieser Punkt bei etwa 50 und 296 (und somit nicht 48 ). Es scheint als beginne das Koordinatensystem in der linken,OBEREN Ecke?

Wo ist mein Denkfehler? Wie gesagt fuege ich die Zeile ex(2)=... ein funktiniert es.

Danke schonmal.

MFG

Sco
Private Nachricht senden Benutzer-Profile anzeigen
 
qwerqwer99
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 12.11.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.11.2010, 14:12     Titel:
  Antworten mit Zitat      
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
Zitat:
f1 = figure('Units','pixel','Visible','off');
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.