PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mathe: Transformation von 0..1 zu 0..1


aths
2010-05-11, 17:35:33
Für Farbraum-Umwandlungen wie YCbCr multipliziert man den RGB-Vektor mit der Umwandlungmatrix. Um wieder zu RGB zurückzukommen, wird mit dem Inversen der Matrix multipliziert.

Ich suche nach einer Matrix, beim Werten zwischen 0..1 den Bereich nach der Transformation im 0..1-Bereich belässt. Ein Bias spielt keine Rolle (also z. B. ginge auch -0,5..+0,5.)

Zweites Kriterium: Einer der Werte (Y) soll ungefähr die wahrgenommene Helligkeit wiedergeben. Üblich sind z. B. Rot 30%, Grün 60%, Blau 10%. Aus Gründen der Einfachheit wäre auch 25%, 50%, 25% akzeptabel.

Die anderen beiden Komponenten geben die Farbe an. Hier ist kein System einzuhalten, Hauptsache der Bereich bleibt gleich. Ich hab etwas experimentiert, zum Beispiel so:



R G B
Y 0,25 0,5 0,25
M -0,25 0,5 -0,25
N 0,5 0 -0,5



Rückwandlung:

Y M N
R 1 -1 1
G 1 1 0
B 1 -1 -1


Vorteil: Inputs im 0..1-Bereich bleiben dort. (M und N sind von -0,5..+0,5, kein Problem.)

Nachteil: Bei der Rückumwandlung von beliebigen Werten aus den Bereichen für Y=0..1 und M, N =-0,5..+0,5 kommen für R, G, B manchmal Ergebnisse außerhalb des 0..1-Bereiches. Das heißt, diese Matrix erlaubt Kodierung nicht darstellbarer Farben. Das will ich aber verhindern.

Pinoccio
2010-05-11, 17:48:45
Schonmal bei Wikipedia (http://de.wikipedia.org/wiki/YCbCr-Farbmodell#Umrechnung_zwischen_RGB_und_YCbCr) geschaut? Die Gammakorrektur ist - da sie nicht linear ist - nicht als Matrix darstellbar,die RGB<->YCbCr-Konversation auch nur mit zusätzlicher Addition.

mfg

aths
2010-05-11, 17:49:42
Gamma-Charakteristik spielt hier keine Rolle, das ist Vor- und Nachbearbeitung der RGB-Werte. YCbCr kenne ich aber da liegen auch Werte außerhalb. Nur etwa 25% von den YCbCr-Werten liegen im RGB-Würfel. Genau deshalb suche ich eine andere Matrix, um nicht zwei Bit Auflösung zu verschwenden.

pest
2010-05-11, 18:19:02
stelle eine allgemeine matrix auf (mit elementen a,b,c usw...)
führe die matrixmultiplikation durch und bestimme durch ein ungleichungssystem
den bereich der koeffizienten die gültig sein sollen.

aths
2010-05-12, 13:13:46
stelle eine allgemeine matrix auf (mit elementen a,b,c usw...)
führe die matrixmultiplikation durch und bestimme durch ein ungleichungssystem
den bereich der koeffizienten die gültig sein sollen.Krieg ich nicht hin.

Das Problem ist auch nicht eine Matrix zu schaffen, sondern dass die Umkehrmatrix denselben Bereich haben sollte.

malte.c
2010-05-13, 00:30:56
Es dürfte schwierig sein, eine passende Matrix zu finden. Deinen RGB-Farbraum kannst Du als 3D-Würfel mit der Kantenlänge 1 betrachten, in dem die einzelnen Farben Punkte sind. Jeder Punkt in diesem Würfel soll durch die Matrix auf einen Punkt in Deinem neuen Farbraum abgebildet werden. Einen Basisvektor des neuen Farbraums hast Du schon über Deine gewünschte Helligkeit festgelegt, bleiben noch zwei Freiheitsgrade. Über eine Matrixmultiplikation könntest Du den Würfel rotieren und verzerren. Durch Rotation kämst Du schon mal dahin, dass der eine Basisvektor stimmt. Die nächste Anforderung war, dass der Farbraum nicht größer als der RGB-Farbraum sein soll, d.h. dass jeder Punkt im neuen Farbraum innerhalb des RGB-Würfels liegt, damit aus der inversen Abbildung keine ungültigen RGB-Werte resultieren können. Ich nehme aber auch an, dass der neue Farbraum den RGB-Farbraum komplett abdecken soll, damit Du alle RGB-Farben verlustlos (abgesehen von Quantisierungsfehlern) hin- und zurücktransformieren kannst. Die einzige Möglichkeit dazu ist aber, dass der neue Farbraum derselbe Würfel wie der Ursprungsfarbraum ist. Du kannst also ggf. noch die Basisvektoren permutieren, aber das hilft hier nicht weiter. Ich sehe keine Möglichkeit, gleichzeitig diese Bedingung und die Bedingung des einen Helligkeits-Basisvektors zu erfüllen, zumindest nicht mit einer Matrix als Transformation. Damit stellt sich eigentlich nur die Frage, was Du bereit bist aufzugeben: Wenn Du akzeptierst, dass nicht jeder Wert des neuen Farbraums im RGB-Würfel liegt ist, oder andersrum nicht jeder RGB-Wert erhalten bleibt, ist Ycrcb oder etwas vergleichbares schon eine ganz gute Lösung. Wenn Du akzeptierst, dass die Transformation keine Matrix ist, kannst Du durch nichtlineare Funktionen diese Bedingung einhalten, musst aber mehr Rechenaufwand und ggf. visuell nicht ganz intuitive Ergebnisse hinnehmen. Wenn Dir der Helligkeits-Basisvektor egal ist, bleibst Du im RGB-Farbraum...

aths
2010-05-14, 10:04:26
Ja ich hab die Rot-Blau-Koeffizienten bei mir schon so sortiert, dass Rot den kleineren Quantisierungsfehler bei der Rückumwandlung hat als Blau, der von Grün ist noch kleiner. Offenbar gibts aber immer irgendwo Verlust.

Ich hab eine zweite Idee um den Verschnitt (der neue Farbraum ist viel größer als der alte) gering zu halten aber das hilft kaum da er die Sättigungsauflösung bei besonders hellen oder dunklen Farben erhöht – da, wo man es nun gerade nicht braucht.