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

"Farblichter" (additive Farbmischung) erstellen/ze

 

leon81

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.07.2011, 08:08     Titel: "Farblichter" (additive Farbmischung) erstellen/ze
  Antworten mit Zitat      
Hallo Zusammen,

ich würde gerne mit Matlab so genannte "Farblichter" erzeugen. Darum handelt es sich um die bekannte additive Farbmischungsdarstellung, nur eben mit kontinuierlichen Übergängen.

siehe auch:
http://de.academic.ru/pictures/dewi.....ive_RGB_Circles-48bpp.png

Hat jemand eine Idee, wie so etwas in Matlab zu realisieren ist?

Bitte um Vorschläge und danke vorab herzlichst!


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 07.07.2011, 09:20     Titel: Re: "Farblichter" (additive Farbmischung) erstelle
  Antworten mit Zitat      
Hallo leon81,

Zunächst brauchst du für jeden einzelnen Farbkanal einen Kreis mit nach aussen abnehmender Intensität. Dies ist mit der Kresiformel leicht zu erzeugen:
Code:
Intensity = r^2 - ((x - xc)^2 + (y - yc)^2);
Intesity(Intensity < 0) = 0;

Dabei ist r der Radius, xc und yc die Koordinaten des Mittelpunktes und x und y durchlaufen alle Punkte des zu zeigenden Bildes. Nun müssen die Intensitäten noch normiert werden, so dass die Werte zwischen 0 und 1 liegen. Wenn Du im Zentrum der Darstellung ein reines Weiss haben möchtest, brauchen die Intensitäten im Zentrum eine ausgedehnte Fläche mit dem vollen Wert 1. Der genaue Intensitätsverlauf hängt dann von Deinen Wünschen ab.

So erzeugst Du 3 Bilder für die Fraben rot, grün und blau mit unterschiedlichen Mittelpunkten. Schließlich mischst Du die Kanäle:
Code:
RGB = cat(3, Intensity_R, Intensity_G, Intensity_B);
image(RGB)

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
leon81

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.07.2011, 09:41     Titel:
  Antworten mit Zitat      
Hallo Jan,

vielen Dank erstmal, das sieht ja schon sehr gut aus. Werde ich ausprobieren!

Wie deklariere ich x und y (bin nicht der große Matlab-Experte)?

Danke und Grüße!
 
Jan S
Moderator

Moderator


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

Entweder in einer Schleife - mal angenommen Dein Bild hat 200x200 pixels:
Code:
for x = 1:200
  for y = 1:200
  end
end

Effizienter geht das mit BSXFUN, aber ich glaube auf die auf ein zehntel Sekunde kommt es nicht an.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
leon81

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.07.2011, 14:12     Titel:
  Antworten mit Zitat      
Hallo Jan,

könntest Du bitte bei Gelegenheit Deinen Vorschlag codiert etwas genauer darlegen? Hab inzwischen ein wenig rumgespielt, wenn ich Dich richtig verstanden habe dann:
1) für jeden Kreis ein Bild erstellen und die Pixel entsprechend der Kreisformel (Polarkoordinaten x=cos(phi) und y=sin(phi)) in Abhängigkeit vom iterativ zunehmenden Radius aus Mittelpunktsicht einfärben
2) diese drei Bilder zusammenstecken

Problem:
bin noch auf der Suche nach einer Zeichnungsvorschrift. Gibt's denn keine einfache Funktion wie "circle" o.ä.?

vielen Dank und Gruß!
 
Jan S
Moderator

Moderator


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

Ich habe bereits alle notwendigen Zeilen gepostet. Du müsstest sie nur noch aneinander hängen... SIN und COS sind dabei viel zu unpraktisch. Die Kreisformel ist besser:

Code:
m = 400;
n = 300;
cm_R = 100;  % Center for red
cn_R = 100;
cm_G = 200;  % Center for green
cn_G = 200;
cm_B = 150;  % Center for blue
cn_B = 200;

r = 100;
M = zeros(m, n, 3);
for im = 1:m
  for in = 1:n
    M(im, in, 1) = r^2 - (im - cm_R)^2 - (in - cn_R)^2;
    M(im, in, 2) = r^2 - (im - cm_G)^2 - (in - cn_G)^2;
    M(im, in, 3) = r^2 - (im - cm_B)^2 - (in - cn_B)^2;
  end
end

% Limit to interval [0, 1]:
M(M < 0) = 0;
M = M / max(M(:));
image(M);

Die Zentren, die Skalierung der Scheibe und die Funktion mit der die Intensitöt zum Rand abfällt kannst Du selber an Deine Bedürfnisse anpassen.

Ein CIRCLE Befehl würde bei Deinem Problem wohl nicht weiter helfen, da Du weder einen Kreis noch eine normale Kreisscheibe brauchst.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
leon81

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.07.2011, 12:02     Titel:
  Antworten mit Zitat      
Vielen herzlichen Dank!
 
Neues Thema eröffnen Neue Antwort erstellen



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.