YUV to RGB (einfache Berechnung)

Soahc

Aktives Mitglied
Hallo Zusammen,

ich mochte einen kleinen Konverter programmieren, der mit die BitWerte aus dem RGB-Farbmodel in das YUV-Farbmodel und umgekehrt berechnet. Die Werte sollen jeweils immer nur in einem Wertebereich von 8 Bit, also 0..255 liegen. Eigentlich sollte das keine große Sache sein, aber ich bekomms einfach nicht gebacken.

Erstmal gibt es auf jeder Seite im Internet unterschiedliche Formeln. z.B.:

RGB <--> YUV Conversion Formulas
YUV/RGB conversion formulas Definition from PC Magazine Encyclopedia
Welcome to FOURCC.org - YUV to RGB Conversion
YUV-Farbmodell ? Wikipedia

...

Ich habe zwar schon alle Varianten durch, aber hier mal mein Code von der ersten Seite:
[JAVA=42]
private void rgbToYuv(){
this.y = (int) Math.round(this.r * 0.299 + this.g * 0.587 + this.b * 0.114);
this.u = (int) Math.round(this.r * -0.169 + this.g * -0.332 + this.b * 0.500 + 128);
this.v = (int) Math.round(this.r * 0.500 + this.g * -0.419 + this.b * -0.0813 + 128);
}

private void yuvToRgb(){
this.r = (int) Math.round(this.y + (1.4075 * (this.v - 128)));
this.g = (int) Math.round(this.y - (0.3455 * (this.u - 128)) - (0.7169 * (this.v - 128)));
this.b = (int) Math.round(this.y + (1.7790 * (this.u - 128)));
}
[/code]

von RGB nach YUV lässt es sich sehr gut umrechnen, nur wenn ich mit den errechnetten YUV Werten wieder die RGB-Werte errechnen will, kommt totaler Quatsch raus. Hat da jemand einen Tip, was ich falsch gemacht haben könnte?

lg, Soahc
 
Zuletzt bearbeitet:

Ark

Top Contributor
Witzigerweise habe ich gerade genau dasselbe Problem: Irgendwie kommt bei Anwendung der Formeln Murks raus. Meine Untersuchungen haben ergeben, dass es sich dabei wahrscheinlich um Rundungsfehler handelt (bin mir aber nicht sicher). Die exakteste Formel, die ich bisher fand, ist die hier. Die Formel für den Grünanteil kann man alternativ natürlich direkt durch Umstellen herleiten. ;) Danach sind alle Ergebnisse auch praktisch exakt (Ungenauigkeiten der Gleitkommazahlen ausgenommen).

Ark
 

Siassei

Bekanntes Mitglied
Irgendwie kommt bei Anwendung der Formeln Murks raus. Meine Untersuchungen haben ergeben, dass es sich dabei wahrscheinlich um Rundungsfehler handelt (bin mir aber nicht sicher).
Naja, das liegt wohl daran, dass RGB != RGB ist.

Es gibt sRGB, Adobe-RGB, eciRGB, ....
siehe RGB-Farbraum ? Wikipedia

Ein erster Überblick:
Farbraum ? Wikipedia
Welcome to Bruce Lindbloom's Web Site

Ich weiß nicht wie genau du das ganze benötigst, sollte die Umrechnung möglichst gut sein, solltest du einen Umweg über einen normierten Farbraum DIN99 gehen. Von diesen bekommst sehr gute Veröffentlichungen, mit denen du in allen anderen Farbräumen umrechnen kannst.

Die Werte sollen jeweils immer nur in einem Wertebereich von 8 Bit, also 0..255 liegen[/qoute]
Hierfür sollten die 4-stellige Umrechnungszahlen reichen. Ark hat dir den Link bereits gegeben. Ich meine, dass die von sRGB ausgehen.
 

Soahc

Aktives Mitglied
@Ark: Öhmn.. hast Du die Formeln schon in Java-Code übersetzt? ;)

@Siassei: Das ist mir schon klar, aber ich gehe von normalem 8Bit-RGB und 8-Bit YUV aus... beide haben also 3*8 Bit um eine Farbe darzustellen, also müsste man sie doch linear umrechnen können.
 

Ark

Top Contributor
@Ark: Öhmn.. hast Du die Formeln schon in Java-Code übersetzt? ;)
Ja, irgendwo daheim sollten sie liegen, wenn ich mich recht erinnere. :D Allerdings sollte es keine Hürde sein, die Gleichungen einfach selbst umzustellen. ;)

@Siassei: Stimmt, ich gehe von sRGB aus. Danke für den Hinweis.

Ark
 

Ark

Top Contributor
So, bitte nicht über die Unleserlichkeit des Codes beschweren. :D Die Anordnung im Array ist jeweils R,G,B bzw. Y,U,V. Bei RGB wird hier immer auf 0-255 hochgerechnet; runden darfst du selbst. ;)
Java:
	public void fromRGB(double[] rgbvalues,double[] result){
		double r=rgbvalues[0]/255.0;
		double b=rgbvalues[2]/255.0;
		double y=0.299*r+0.587*(rgbvalues[1]/255.0)+0.114*b;
		result[0]=y;
		result[1]=(b-y)*0.493;
		result[2]=(r-y)*0.877;
	}

	public void toRGB(double[] values,double[] rgbresult){
		double y=values[0];
		double b=y+values[1]/0.493;
		rgbresult[2]=b*255.0;
		double r=y+values[2]/0.877;
		rgbresult[0]=r*255.0;
		rgbresult[1]=((y-0.299*r-0.114*b)/0.587)*255.0;
	}

Hat jemand etwas Entsprechendes für YCbCr zu bieten, wie es bei JPEG zum Einsatz kommt? Das würde mich mal interessieren. ^^

EDIT: Okay, diese Seite erscheint gerade extrem interessant. :exclaim:

Ark
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
L Einfache Navigations-App schnell selber Programmieren? Bitte um Ideen und Anregungen. Allgemeine Java-Themen 17
J Einfache Sprachsteuerung Allgemeine Java-Themen 3
L Übergabe an eine eher einfache Java- Applikation wegen Kündigung Allgemeine Java-Themen 1
K Einfache Verkettete Liste mit Node Allgemeine Java-Themen 3
D RMI Einfache Chat-Anwendung mit RMI Allgemeine Java-Themen 0
L einfache Verzinsung mit for-Schleife & Ausschluss von Werten beim Einlesen Allgemeine Java-Themen 5
S Einfache Methode die Groesse eines Objekts zu ermitteln? Allgemeine Java-Themen 12
D einfache Filterung optimieren Allgemeine Java-Themen 16
M Einfache Kundenverwaltung, guter Programmierstil Allgemeine Java-Themen 3
N einfache Klassen Allgemeine Java-Themen 18
M Schnelle Scriptsprache für einfache Funktionen? Allgemeine Java-Themen 5
R Einfache Matheaufgabe - Daten auf Anzeigebereich verteilen Allgemeine Java-Themen 4
E einfache grafische Oberfläche wie in MS C#? Allgemeine Java-Themen 6
V Einfache toString() generieren? Allgemeine Java-Themen 6
E einfache Frage zu Vector Allgemeine Java-Themen 8
E Einfache Frage zu ListIterator Allgemeine Java-Themen 10
E einfache Frage zu getRealPath(.) Allgemeine Java-Themen 2
E einfache Frage zu protected Allgemeine Java-Themen 10
E einfache Frage zu verdeckten Membern Allgemeine Java-Themen 2
E Einfache Fragen zu Dateien Allgemeine Java-Themen 7
pkm Berechnung der Fakultät von Fließkommazahlen anhand von Stirlingformel Allgemeine Java-Themen 4
I Berechnung Lagerbestands / Verfügbarkeitsprüfung Allgemeine Java-Themen 1
L RegEx für Teile einer Berechnung Allgemeine Java-Themen 14
L Korrektur nach der Berechnung vornehmen, aber wie? Allgemeine Java-Themen 11
D Berechnung des Cosinus Allgemeine Java-Themen 4
H float Berechnung: Ergebnis ohne wissenschaftliche Notation Allgemeine Java-Themen 5
A Fehlerhafte Nst Berechnung einer bestimmten Fkt. (Bisektion) Allgemeine Java-Themen 10
E Berechnung des Schnittpunktes von zwei Geraden Allgemeine Java-Themen 1
P Performate Zeiteiteiteilungs- Berechnung Allgemeine Java-Themen 4
B TileMap berechnung? Allgemeine Java-Themen 8
P jodaTime Berechnung Geburtstag Allgemeine Java-Themen 1
K Probleme bei Berechnung der Komplexität Allgemeine Java-Themen 7
S Welcher Schleifen type für eine Berechnung Allgemeine Java-Themen 7
B BlueJ Potenz Berechnung Allgemeine Java-Themen 16
W Berechnung Durchschnitt mit Schleife Allgemeine Java-Themen 9
M Berechnung verbessern Allgemeine Java-Themen 8
W OOP Berechnung des Skalarprodukts Allgemeine Java-Themen 9
H Demonstrationsprogramm zur CRC-Berechnung Allgemeine Java-Themen 2
D Berechnung von Sonnenauf und Sonnenuntergang Allgemeine Java-Themen 2
E Berechnung in Arraylist Allgemeine Java-Themen 10
R Eclipse Verschiedene Ergebnisse bei Berechnung eines double-Werts Allgemeine Java-Themen 5
E Falsche Ergebnisse bei PQ-Formel Berechnung Allgemeine Java-Themen 12
N Optimierung einer Berechnung Allgemeine Java-Themen 17
G java.sql Time Berechnung Allgemeine Java-Themen 6
Eldorado Berechnung von Koordinaten, die zufällig aussehen Allgemeine Java-Themen 5
B Berechnung eines sinh abbrechen, wenn 16. Nachkommastelle sich nicht mehr ändert Allgemeine Java-Themen 7
J Berechnung anhand einer XML-Datei Allgemeine Java-Themen 3
Private Void rekursive vs. iterative Lösung für Berechnung der Fakultät Allgemeine Java-Themen 12
G Programm zur Berechnung von Summe, Median, Erwartungswert, usw von einem Array Allgemeine Java-Themen 7
C Bilder rotieren, Denkfehler in der Berechnung? Allgemeine Java-Themen 2
B Berechnung von Punkten/ If-else Strategie?! Allgemeine Java-Themen 51
T Berechnung in zweidimensionalem Array Allgemeine Java-Themen 3
X hashCode() Berechnung Allgemeine Java-Themen 5
R Tabelle - Berechnung der "Zeilenart" Allgemeine Java-Themen 2
L Berechnung mit Module bis bes.timme Zahl erreicht. Allgemeine Java-Themen 4
P CRC Berechnung Allgemeine Java-Themen 2
J berechnung von potenzen und wurzel-ziehen ohne klasse " Allgemeine Java-Themen 14
D Problem bei einer Berechnung (pow?) Allgemeine Java-Themen 3
P Java-Programm zur Berechnung globaler Minimas und Maximas-ff Allgemeine Java-Themen 4
B Primzahlen Berechnung optimieren Allgemeine Java-Themen 7
A Probleme bei der Berechnung von Pi! Java Problem Allgemeine Java-Themen 2
M Servlet --> Berechnung --> Timeout vom Proxy oder IE!? Allgemeine Java-Themen 7

Ähnliche Java Themen

Neue Themen


Oben