PDA

View Full Version : [Frage] Rgb


Ikaru
16-05-2003, 14:14
Hallo Leute,
Ich hab eine Frag zu meinem Beispiel,

Kurzbeschreibung
Ein Farbwert im RGB-Farbwürfel (Rot, Grün, Blau je 256 Stufen) soll auf einen Farbwürfel mit 147 Farbwerten abgebildet werden. Dazu ist eine Bewertung der 8 Ecken des Teilquaders, in dem der Farbwert liegt, auszugeben.

Was ist ein Teilquader ? hehe


Aufgabenstellung:
Lesen Sie drei Farbwerte ein, die den Helligkeiten der Komponenten Rot, Grün und Blau im RGB-Farbraum entsprechen (bekannt als "True Color"). Stellen Sie sich den RGB-Farbraum als dreidimensionalen Würfel vor (jeweils 0..255, 0..255, 0..255), wobei jede Koordinatenachse einer der Farbkomponenten entspricht.

Ihr Programm soll die eingelesen Farbwerte umwandeln, wobei das Reduktionverhältnis der Helligkeiten 256:256:256 -> 7:7:3 (Rot:Grün:Blau) sein soll. Nach der Umwandlung ergibt sich also ein Farbraum von (0..6,0..6,0..2).
Um eine Farbe aus dem Farbraum (0..255, 0.255, 0..255) in einen kleineren Farbraum zu konvertieren, muß der RGB-Farbwürfel in Quader unterteilt werden. Die Seitenlängen der Teilquader erhalten Sie, indem Sie auf der Rot- und auf der Grün-Achse 255/7 berechnen und auf der Blau-Achse 255/3. Wenn sich für die resultierenden Eckpunkte der Teilquader Koordinaten mit Nachkommastellen ergeben (das passiert sicher bei 255/7), müssen Sie die Koordinaten dieser Eckpunkte auf ganze Zahlen runden.
Bei der Umwandlung wird festgestellt, in welchem Teilquader der eingelesene Farbwert liegt. Wenn der Punkt genau auf der Grenze von Quadern liegt, wählen Sie jenen Teilquader, dessen Koordinaten am kleinsten sind.
Als Ausgabe sollen Sie für jede der 8 Ecken dieses Teilquaders den normierten Abstand liefern, den dieser Eckpunkt (der einer darstellbaren Farbe entspricht) von dem tatsächlichen Punkt hat. Der normierte Abstand ist jener Abstand der, wenn man alle 8 Abstände aufsummiert, 1 ergibt.



Also ich habe das so verstanden:
Man macht zu erst einen Farbwuerfel mit den angegeben farben rot gelb blau und wenn jemand Werte fuer R, G u. B eingibt, ergibt sich ein Punkt im Wuerfel. Dann sollen die Abstaende der 8 ecken des Wuerfels zu dem Punkt berechnet werden. (das waere ja nicht so schwer).
Aber warum soll ich den RGB-Farbwürfel in Quader einteilen ? Und wie solle ich mir das vorstellen ? :confused:

jeuneS2
16-05-2003, 16:06
Du sollst nicht die Abstände vom Punkt zu den Ecken des Würfels, sondern zu den Ecken des Teilquaders berechnen, i.e. du berechnest die Abweichung der möglichen runterkonvertierten Farben zur Originalfarbe.

Bruno
16-05-2003, 20:32
also ich hab mich mal künstlerisch betätigt und da ein bisserl was gezeichnet ;) (okay, ich gebs ja zu, ich bin total unbegabt...)

also, der erste würfel stellt den anfänglichen rgb-würfel dar, zugegebenermaßen vereinfacht, aber ich hatte echt keien lust, jetzt einen würfel mit einem 256X256X256 gitterraster zu versehen... dieser würfel beschreibt alle farben, die dein bildschirm mit rgb darstellen kann. jetzt mußt du ein programm schreiben, daß solche rgb-farbwerte in farbwerte für ein system umwandelt, daß nicht alle 256^3 farben darstellen kann, sondern eben nur 147. um diese farben zu beschreiben, kann man jetzt auch einen würfel zeichnen (der würd dann so irgendwie wie der unter dem rgb-würfel aussehen - hab jetzt nicht nachgerechnet, aber ich glaub, 147 farben wär ein 8X8X8 würfel) wenn du jetzt einen wert von farbmodell 1 in farbmodell 2 umrechnen willst, zeichnest du den wert aus 1 (sprich eine frarbe, die in rgb dargestellt werden kann) in den würfel von 2 ein und schaust, in welchem der "unterwürfel" er liegt, da jeder dieser unterwürfel eine von system 2 unterstützte farbe darstellt. damit hast du mal die 8 eckpunkte vom unterwürfel. und dann berechnest du die normierten abstände, den dein rgb-wert von diesen eckpunkten hat. die normierten abstände haben die eigenschaft, daß, wenn du die 8 abstände, die dein wert von den eckpunkten hat, zusammenzählt, genau eins rauskommt (desshalb auch normiert).

Bruno

Frule
16-05-2003, 22:06
Werf mal einen Blick auf:
http://stud4.tuwien.ac.at/~e0225445/rgb_wuerfel.html :)

Ich habe gestern mein RGB-Wuerfel Beispiel abgegeben.

Also, ich hab's folgendermassen gemacht: zuerst teilst du den Würfel auf Teilquader auf, dann überprüfst in welchem Teilquader (Bereich) sich der eingelesene Punkt befindet, dann berechnest du die Koordinaten jedes der acht Eckpunkte dieses Quaders und schliesslich findest die Abstände zwischem dem Punkt und den Eckpunkten. Den normierten Abstand bekommst du, indem du die Summe aller Abstände duch den absoluten Abstand dividierst. So was: norm_abstand = summe / abs_abstand.

Ich hoffe, ich hab dir a bissl geholfen.

Ikaru
17-05-2003, 00:58
Danke Bruno deine Erklaerung hat das ganze fuer mich ein bisschen verstaendlicher gemacht.
Danke Frule habe auch den gleichen Ansatzt bin aber noch am kruebeln wie ich die Eck Punkte berrechnen soll

Hab mal so angefangen:

x= Math.pow((quaderRot - rot),2);
y= Math.pow((quaderGruen - gelb),2);

ecke=(x+(Math.pow(gelb,2));

A=Math.sqrt(ecke+h);

nur wie bekomme ich h ? Also die Hoehe ? In deinem beispiel R

h= Math.pow((quaderBlau - blau),2); ?? Geht das ueberhaupt ?

Irgend wie und irgend wo haengst bei mir noch hehe

Bruno
17-05-2003, 01:40
du meinst die eckpunkte der unterwürfel? die müssen ja ihn festen schritten erfolgen, also von der rgb-wert von rot und grün wär was wie:
0 = der wert 0, rgb von z.b.: 36 = 1, rgb von 72 = 2 ... rbg 256=7
von blau wärs halt das selbe, nur mit 3 statt mit 7.

bei der berechnung der eckpunkte, die deinem punkt am nächsten sind, würd ichs so machen:
ich würd zwei zweidimensionale ebenen berechnen(siehe skizze ;) )

da auf jedes wertepaar bei so einem zweidimensionalen raum zwei wertepaare im dreidimensionalen kommen, (hinter jedem x,y-wertepaar liegt ja außer dem sichtbaren noch ein zusätzliches paar mit den selben x und y aber anderen z-koordinaten) würd ich die ergebnisse aus den beiden 2d-berechnungen an einer koordinate zusammenhängen. in meinem bsp wären z.b. die g-werte sowohl in der gb als auch in der rg ebene vorhanden => ich würd die koordinaten von p mit denen von p1 und p2 zusammenhängen, da die ja den selben g-wert haben und daher hintereinander liegen. so kommst du auf deine 8 punkte mit drei variablen.

auf die werte, welcher punkt am nächsten ist, kommst du auch mit einfachen abfragen: wenn r zwischen 0-36 liegt, ist der unmewandelte r-wert 0, zwischen 36 und 72 ist er 1,... so kommst du auf die eckpunkte. dann mußt du dir nur noch die normalvektoren ausrechnen.

Bruno

Smoerebroed
27-05-2003, 18:39
Hi leute;)

Ich zermarter mir grad mein hirn über dieses beispiel... ich hab zwar jetzt kapiert was ich machen muss - btw die obigen Antworten und fragen haben einiges aufgrklärt :). Das Problem is nur wenn ich das mit den angegebenen Eingabedaten mal durchrechne krieg ich da Werte raus die ned bei den ausgabedaten stehn:/.

Kann das sein das die falsch sind - oder hab i an Hund drin? :confused:

Bruno
27-05-2003, 18:59
naja, ich hab zwar die angabe nicht und kann daher nicht nachrechnen, aber generell gilt, daß die zwar bei den spezifikationen schon von zeit zu zeit fehler machen, aber die sind ziemlich schnell bekannt und werden glaub ich auch ausgebessert...

also ich würd sagen, du hast da irgendwo einen fehler drin... wennst aber echt nicht draufkommst, kannst ja mal in eine spez-sprechstunde schaun und es mit denen dort durchgehen, oder aber du lädst dir ein funktionierendes programm runter und schaust, mit wem deren ergebnis übereinstimmt...

Smoerebroed
27-05-2003, 19:44
lol ich hab meinen Fehler schon gefunden.... ich hab die Eckpunkte der Teilquader nicht gerundet :hewa:
thx trotzdem