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

Außenbereich eines Rahmens einfärben

 

HeinzG6
Forum-Anfänger

Forum-Anfänger


Beiträge: 16
Anmeldedatum: 29.03.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.05.2011, 14:57     Titel: Außenbereich eines Rahmens einfärben
  Antworten mit Zitat      
Hallo zusammen,

ich möchte gerne über einen Plot einen Rahmen legen um nicht benötigte Bereiche des Figures auszublenden. Quasi eine Art Passepartout.

Diverse Versuche ein gif einzufügen das in der Mitte transparent ist, sind bislang immer daran gescheitert, dass das Auswirkungen auf den bestehenden Plot hat.

Nun hab ich mich dran gemacht über die Koordinaten eine Matrix zu erstellen, die einen Rahmen auf den Plot legt.
Nun würde ich gerne den Außenbereich dieses Rahmens, also den Bereich bis zu den Koordinatenachsen einfärben.
Patch und fill hab ich bereits ausprobiert, jedoch nicht den gewünschten Erfolg gehabt.

Vielleicht hat ja auf eurer Seite noch jemand Ideen. Ich wäre dafür sehr dankbar.

Beste Grüße,

HeinzG6
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: 16.05.2011, 17:44     Titel:
  Antworten mit Zitat      
Moin,

etwa so?

Code:
figure
h=plot(rand(10,1))
set(gcf,'color',[0 0 0.3]);    % oder:
figure('Color',[0 0 1]);


Hubertus
Private Nachricht senden Benutzer-Profile anzeigen
 
HeinzG6
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 16
Anmeldedatum: 29.03.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.05.2011, 10:26     Titel:
  Antworten mit Zitat      
Das bringt mich leider nicht weiter, da ich den Bereich zwischen Rahmen und Korrdinatenachse einfärben möchte und nicht die Hintergrundfarbe des Figures ändern möchte.

Zur besseren Verständlichkeit hab ich mal den plot angehängt. Den Bereich zwischen der dünn (hoffentlich trotzdem noch sichtbar) eingezeichneten Linie und den Koordinatenachsen hätte ich gerne ausgeblendet bzw. durch die eine Farbe überdeckt.

Rahmen.jpg
 Beschreibung:
Export des Figures

Download
 Dateiname:  Rahmen.jpg
 Dateigröße:  790.01 KB
 Heruntergeladen:  504 mal
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.05.2011, 10:47     Titel:
  Antworten mit Zitat      
Eine Möglichkeit wäre, das "Bild" zu laden und die Bereiche auf weiß indizieren. Die Eckdaten kannst Du über den Cursor einfach abfragen.
Private Nachricht senden Benutzer-Profile anzeigen
 
HeinzG6
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 16
Anmeldedatum: 29.03.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.05.2011, 11:09     Titel:
  Antworten mit Zitat      
Hallo Hubertus, könntest du deine Antwort vielleicht etwas näher ausführen. Irgendwie kann ich damit nichts anfagen.

Schonmal Danke für deine Mühen.
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.05.2011, 11:24     Titel:
  Antworten mit Zitat      
Code:
I=imread(Dein Bild);
figure; imshow(I)
hFH=imfreehand();   % Rahmen um das ziehen, was weg soll
Mask=hFH.createMask();
Mask2=I;
Mask2(Mask)=255;
figure; imshow(Mask2)


Eine Funktion direkt nach plot habe ich nicht. Wäre aber auch interessant.

Edit.
Sorry. Habe übersehen, dass es sich um ein Farbbild handelt, dann wird nur in einem Kanal entfernt. Muß da noch nachbessern!

Wollte Dir Arbeit mit imfreeehand ersparen. Das geht so nicht. Dann die alte Methode.

Code:
I(61:87,131:167,:)=255;
imshow(I)


Die Daten kannst Du vom Cursor ablesen.
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.05.2011, 12:54     Titel:
  Antworten mit Zitat      
Dann eben mit Gewalt:

Code:
I=imread(Dein Bild);
figure; imshow(I)
hFH=imfreehand();   % Rahmen um das ziehen, was weg soll
Mask=hFH.createMask();
R=I(:,:,1);
G=I(:,:,2);
B=I(:,:,3);
Mask1=R;
Mask1(Mask)=255;
Mask2=G;
Mask2(Mask)=255;
Mask3=B;
Mask3(Mask)=255;
Result=cat(3,Mask1,Mask2,Mask3);
figure; imshow(Result)
 


Geht schneller und ist komfortabler. Wenn Du einen Bereich entfernt hast, startest Du den Vorgang erneut mit:
Code:
I=Result;    % für: I=imread(Dein Bild). Nur jetzt mit dem Resultat.
....... % erneuter Vorgang
Result2=cat(3,Mask1,Mask2,Mask3);
figure; imshow(Result2)

Neue Variable! Alles andere bleibt. Natürlichn kannst Du damit auch den Außenbereich auf einen Farbwert setzen:

Code:
Mask1(Mask)=255;    % roter Außenbereich
Mask2=G;
Mask2(Mask)=0;
Mask3=B;
Mask3(Mask)=0
Private Nachricht senden Benutzer-Profile anzeigen
 
HeinzG6
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 16
Anmeldedatum: 29.03.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.05.2011, 11:21     Titel:
  Antworten mit Zitat      
Vielen Dank für deine Hilfe.
Hab mit dem Code auch mal mächtig gespielt.

Das ganze scheint im Moment allerdings wenig praktikabel weil das Programm dazu dienen soll einzelne Zustände zu visualisieren. Damit muss regelmäßig ein neues Bild erzeugt werden, dass dann so bearbeitet werden muss.
Ein weiteres Problem ist, dass imfreehand bzw. impoly nur auf Bilder anzuwenden sind und nicht auf den Plot. Dies macht dann jeweils noch das zwischenspeichern des Figures notwendig.

Da ich aber bislang noch keine bessere Idee habe werde ich erstmal weiterhin versuchen, mit deiner Idee zu experimentieren.

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: 19.05.2011, 12:32     Titel:
  Antworten mit Zitat      
Das kann ich gut verstehen. Die "dünnen Linien" im Plot müßtest Du auch in der Plotfunktion entfernen können. Da ich Dein Plot nicht habe, ist folgendes nur auf dieses Beispiel bezogen:

Code:
Per=2*pi;
zahl=1;
Per2=0:0.1:zahl*Per;
Per3=sin(Per2);
plot(Per3)
Per3(25:30)=NaN;  % Bereich des Vektors entfernen
plot(Per3)
plot(Per3); axis off


Jetzt noch die Skalierung! Funktioniert: axis off?
Private Nachricht senden Benutzer-Profile anzeigen
 
HeinzG6
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 16
Anmeldedatum: 29.03.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.05.2011, 15:21     Titel:
  Antworten mit Zitat      
Die Idee könnte mir vielleicht tatsächlich weiterhelfen. Ich hab einen Rahmen als Bilddatei erzeugt.
Wenn ich diesen nun mit imread einlese würde ich gerne die Pixel die Schwarz sind einfach nicht mehr plotten lassen.
Wenn ich das richtig sehe, wäre hier NaN das Mittel der wahl. Das tuts aber leider auch nicht.
Jemand eine Idee wie ich diese Pixel auf eine andere Art und Weise transparent bekomme??

Der Code sieht bislang so aus:

Code:

I=imread('Bild.png');
zeros=find(I==0);
I(zeros)==NaN;
imshow(I);
 


Mit beliebigen anderen Farbwerten funktioniert das. Nur das NaN will sich scheinbar nicht in den Vektor schreiben lassen.

Ideen?

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: 19.05.2011, 15:53     Titel:
  Antworten mit Zitat      
Das verstehe ich nun nicht mehr. Du bist ja wieder bei der Bildbearbeitung.
Hat mein Beispiel nicht funktioniert oder was funktioniert nicht? Nebenbei gesagt, bildet Matlab in m*n Matrizen(Bilder) NaN-Werte als schwarz ab, im Gegensatz zu Photoshop, das tatsächlich Transparenz erzeugt. Insofern würde Dir das nicht weiterhelfen. Tranzparenz erzeugt Matlab, wenn 2 Bilder übereinander liegen, durch unterschiedliche Gewichtung der Pixel. Es entstehen keine NaN-Werte. Beim Plotten sieht das wohl anders aus.
Private Nachricht senden Benutzer-Profile anzeigen
 
HeinzG6
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 16
Anmeldedatum: 29.03.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.05.2011, 15:57     Titel:
  Antworten mit Zitat      
Ich bin wieder bei der Bildbearbeitung angekommen, weil es am einfachsten wäre wenn ich ein Bild, dass mir genau den gewünschten Rahmen erzeugt darüber legen könnte. Dafür notwendig: Transparenz innerhalb des Rahmens.
Wenns nicht geht, hab ich wohl wieder Pech Wink.

Dein Beispiel hat mich insofern nicht weiter gebracht als nur das löschen der roten Linien ja nichts bringt.
Der Bereich bis zu den roten Linien von der y- bzw. x-Achse aus muss komplett weg.

Grüße
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: 19.05.2011, 16:11     Titel:
  Antworten mit Zitat      
Vielleicht hilft das weiter:

Code:
I=imread('Bild');
figure; imshow(I)
hold on
x=[60 100 190 270];
y=[55 140 118 50];
plot([x x(1)],[y y(1)],'m-x');
Y=I(min(y):max(y),min(x):max(x));
mask=poly2mask(x,y,size(I,1),size(I,2));
Z=I;
Z(~mask)=NaN;
imhsow(Z)


Habe ich kurz einer Funktion entnommen. Mußt nur den Ausschnitt auf rechteckig anpassen
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: 20.05.2011, 10:34     Titel:
  Antworten mit Zitat      
Moin,

es gibt in Matlab sehr oft Alternativen zum gleichen Ziel. Hier ist eine davon.

Code:
I=imread(Bild);    % Habe dafür Dein Bild verwendet
figure; imshow(I)
I(:,3930:end,:)=0;
I(1:500,:,:)=0;
I(:,1:1385,:)=0;
usw
figure; imshow(I)


Vielleicht nicht ganz so umständlich.
Private Nachricht senden Benutzer-Profile anzeigen
 
HeinzG6
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 16
Anmeldedatum: 29.03.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.05.2011, 13:40     Titel:
  Antworten mit Zitat      
Moin,

danke für deine Vorschläge, mit dem letzen häng ich aber leider wieder an der Stelle der Bildbearbeitung.

Das ist so lange kein Problem, wie ich ein Bild bearbeite, dass hinterher quasi den Rahmen für den Plot darstellt.
Wird aber ein Problem wenn ich dabei eigentlich einen Plot verändern müsste, der dann wieder als Bild zu speichern wäre.

Der vorletzte könnte ne Chanche sein wenn ich ein schwarzes Bild über den eigentlichen Plot lege und dann die Fläche die durch den Vektor (der in der Zeichnung die rote Linie erzeugt) eingeschlossen ist ausschneide. Ähnlich wie das Polygon aus deinem Beispiel.
Allerdings bin ich da bislang auch noch nicht weit gekommen.

Leider reicht es eben auch nicht, wenn der Teil den ich drüber lege Rechteckig ist, sondern er muss ziemlich genau den roten Grenzen folgen.

Ideal wären entweder eine Funktion wie
Code:
, nur eben für den Bereich um den roten Rahmen drum rum und nicht innen.

Oder: Ein teiltransparentes Bild über den Plot legen, das den ungewünschten Teil überdeckt.

Grüße
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.