Laden...

Farben vergleichen

Erstellt von Dexter vor 14 Jahren Letzter Beitrag vor 14 Jahren 6.415 Views
D
Dexter Themenstarter:in
481 Beiträge seit 2005
vor 14 Jahren
Farben vergleichen

Hallo!

Ich bräuchte nen kleinen Denkanstoß 😃

Ich bekomme eine Farbe geliefert und ca. 20 verschiedene Referenz-Farben.
Ich sollte jetzt herausfinden, welcher Referenz-Farbe die aktuelle Farbe am ähnlichsten ist, jedoch sollte eine Farbe, welche überhaupt nicht zu den Referenz-Farben passt, auch nicht einer zugeordnet werden.

Jetzt meine Frage:
Welchen Farbraum würdert ihr mir empfehlen? RGB bzw. HSV/HSL?

Dexter

Programmierer sind Maschinen die Koffein in Quellcode umsetzen.

6.911 Beiträge seit 2009
vor 14 Jahren

Hallo,

RGB ist für den Vergleich denkbar ungeignet.

Lösbar ist dies zB mit dem HSV-Farbraum - ist relativ einfach in der Umrechnung zu HSV <-> RGB - oder über den CieLab-Farbraum der am besten an die psycho-visuelle Eigenschaften der Menschen angepasst wurde. Dieser ist aber etwas komplizierter für die Konvertierungen.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

D
Dexter Themenstarter:in
481 Beiträge seit 2005
vor 14 Jahren

Gut, danke 😃

Ich werd mich dann mal mit Lab* etwas intesiver beschäftigen.

Dexter

Programmierer sind Maschinen die Koffein in Quellcode umsetzen.

6.911 Beiträge seit 2009
vor 14 Jahren

Hallo,

dann gleich der Hinweis dass es nicht den RGB-Farbraum gibt sondern mehrere. Achte darauf um welchen es sich genau handelt (sRGB, Adob-RGB, etc.). Das erspart dir dann Ärger 😉

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

D
Dexter Themenstarter:in
481 Beiträge seit 2005
vor 14 Jahren

Was erstellt den Bitmap für einen RGB-Farbraum?
Ich meine Bitmap.GetPixel()

Dexter

Programmierer sind Maschinen die Koffein in Quellcode umsetzen.

6.911 Beiträge seit 2009
vor 14 Jahren

Hallo,

das ist eine gute Frage zur der sich MS in der Doku ausschweigt und ich weiß es selbst noch nicht genau - muss dieses Problem auch erst bewältigen 😉

RGB <-> HSV gibt mit den üblichen Formeln kein Problem.
RGB <-> XYZ gibt tw. Probleme da RGB != RGB, XYZ wird als Zwischenstufe zu Lab benötigt

Ich weiß es noch nicht (und hab gerade wenig Zeit an diesem Projekt weiter zuarbeiten).

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

5.658 Beiträge seit 2006
vor 14 Jahren

Ist das nicht eine rein akademische Diskussion? Wir arbeiten ja hier nicht mit Druckmaschinen und müssen Farbräume umwandeln. Ich hab mir jedenfalls noch nie Gedanken darüber gemacht, welche RGB-Farbraum Microsoft verwendet. Alle Umrechnungen usw. haben halt funktioniert, da mußte ich das nicht hinterfragen.
Ich nehme jedenfalls an, daß Microsoft den sRGB-Raum verwendet, da es selbst an der Entwicklung beteiligt war.

Weeks of programming can save you hours of planning

2.921 Beiträge seit 2005
vor 14 Jahren

@Dexter:

In der LowLevelGraphicsLibrary sind die Farbräume die hier angesprochen wurden schon implementiert. Siehe Namespace "LowLevelGraphics.ColorSpaces"

@GFoidl:

Lösbar ist dies zB mit dem HSV-Farbraum - ist relativ einfach in der Umrechnung zu HSV <-> RGB - oder über den CieLab-Farbraum der am besten an die psycho-visuelle Eigenschaften der Menschen angepasst wurde. Dieser ist aber etwas komplizierter für die Konvertierung

Vorerst geht die Library genau diesen Weg.

Link: LowLevelGraphicsLibrary

Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.

6.911 Beiträge seit 2009
vor 14 Jahren

Hallo MrSparkle,

Ist das nicht eine rein akademische Diskussion? Wir arbeiten ja hier nicht mit Druckmaschinen und müssen Farbräume umwandeln.

Du vielleicht nicht 😜
Der Ähnlichkeitsvergleich lässt sich mit RGB nicht durchführen, ergo muss ein anderer Farbraum her welcher das zulässt.
Andere Farbräume spielen in der Visualisierung eine dominante Rolle. Und da CieLab am besten an die Wahrnehmung angepasst ist/wurde hat das schon Vorteile. .net hat (leider) nur RGB und sonst nichts. Mit RGB lässt sich aber nicht viel mehr anfangen als auf einem Bildschirm darzustellen (dazu wurde es ja erdacht). Für die Visualisierung scheidet es nahezu aus (außer für die letzendliche Darstellung am Bidlschirm).

Ich hab mir jedenfalls noch nie Gedanken darüber gemacht, welche RGB-Farbraum Microsoft verwendet.

Ich bis vor kurzem auch nicht. Aber da die Methoden für HSV der Color-Struktur schon etwas anderes liefern als erwartet bin ich vorsichtig geworden.

daß Microsoft den sRGB-Raum verwendet

Wie du festgestellt hast war MS an der Entwicklung beteiligt, aber das soll für mich noch nichts bedeuten. MS war schon an so vielem beteiligt und dann kam es ganz anders 😉

Alle Umrechnungen usw. haben halt funktioniert, da mußte ich das nicht hinterfragen.

Hast du auch eine RGB-Farbe in einen anderen Farbraum konvertiert und dann wieder zurück und geprüft ob es die selbe Farbe ist? Das ist mein Hauptproblem in dieser Hinsicht.
Von welcher Quelle hast du die Umrechnungen?

Hallo dr4g0n76,

so wie ich das sehe ist die Library noch in der Entwicklung denn für die Farbräume notwendigen Member sind nicht vorhanden (1. Downloadlink). BTW: Die Klassen sind internal und somit von außen nicht verwendbar.

Aber Danke - ich werde dein Projekt weiter verfolgen.

mfG Gü

Edit: Copy&Paste-Fehler im Namen von dr4g0n76 behoben - Sorry

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

2.921 Beiträge seit 2005
vor 14 Jahren

Hallo dr4g0n7,

Hallo Gfoidl. 😉

so wie ich das sehe ist die Library noch in der Entwicklung denn für die Farbräume notwendigen Member sind nicht vorhanden (1. Downloadlink). BTW: Die Klassen sind internal und somit von außen nicht verwendbar.

Ja die neue Version ist natürlich in der Entwicklung. Die ursprüngliche Library von früher wurde entfernt und diese Library hochgestellt. Dementsprechend habe ich diese hochgestellt.

Sie soll alle möglichen Grundfilter, Objektextraktoren und ColorSpaces enthalten.
Da ich zuletzt bemerkt hatte, dass manche der Matrizen zwar vorwärts aber nicht rückwärts funktionieren habe ich momentan ToColor von manchen befehlen entfernt.
Es ist ja so wie Du sagst RGB -> Nach Farbraum 1 -> RGB dann müssen RGB vor und nach der Transformation im Idealfall gleich sein.

Deshalb habe ich hier das ganze angegeben. Zumindest die HIN-Transformation sollte funktionieren. (wie gesagt auch hier noch größtenteils ungetestet)

Aber Danke - ich werde dein Projekt weiter verfolgen.

offtopic: Es lohnt sich. 😉

Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.

2.921 Beiträge seit 2005
vor 14 Jahren

@Dexter:

Es gibt aber auch noch eine ganz andere Möglichkeit.
Merk Dir die Differenzen.

Sprich(Pseudo-Code):

  • Für jede Farbe
    Vergleiche mit jeder der Referenzfarben ColorFunctions.Differenz(ReferenzFarbe_, GelieferteFarbe
    (Damit bekommst Du einen Int-Wert)
    Merk Dir das ganze in einem Array (Immer Paar Farbe, Differenz) hinzufügen
    Sortiere das Array nach der Differenz.

Das Farbenpaar mit dem kleinsten Int-Wert ist die ähnlichste Farbe.

Auszug aus ColorFunctions.Distance (LowLevelGraphics.ColorFunctions)


     /// <summary>
        /// Calculates the color distance between color 1 and color 2
        /// </summary>
        /// <param name="color1"></param>
        /// <param name="color2"></param>
        /// <returns></returns>
        public static int Distance(Color color1, Color color2)
        {
            return (int)Math.Sqrt(
                (double)((((color1.R - color2.R) * (color1.R - color2.R))
                + ((color1.G - color2.G) * (color1.G - color2.G)))
                + ((color1.B - color2.B) * (color1.B - color2.B)))
            );
        }

EDIT: Anmk.: dazu ist dann keine Konvertierung in einen anderen Farbraum nötig.

Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.

6.911 Beiträge seit 2009
vor 14 Jahren

Hallo dr4g0n76,

sorry - vorhin hab ich deinen Namen falsch kopiert

Das mit den Abständen im RGB-Würfel ist eine einfache gute Variante, allerdings entspricht der berechnete Farbabstand nicht (unbedingt) dem wahrgenommenen. Aus diesem Grund wurde auch CieLab entwickelt indem ähnliche Abstände als ähnliche Farbunterschiede wahrgenommen werden.

Allerdings kommt es darauf an wie "genau" der Fragesteller messen will. Er kann ja mal probieren und schauen ob das Ergebnis mit der RGB-Abstands-Methode ausreicht.

Eine andere ebenfalls einfache Methode wäre im HSV-Modell die Werte zu vergleichen. Der Vergleich kann Analog zu dr4g0n76s Vorschlag erfolgen.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

2.921 Beiträge seit 2005
vor 14 Jahren

@gfoidl:

Das mit den Abständen im RGB-Würfel ist eine einfache gute Variante, allerdings entspricht der berechnete Farbabstand nicht (unbedingt) dem wahrgenommenen. Aus diesem Grund wurde auch CieLab entwickelt indem ähnliche Abstände als ähnliche Farbunterschiede wahrgenommen werden.

Eben, vermutlich reicht das schon.

HCL-Farbformat wäre noch besser, ist aber noch nicht komplett umgesetzt.
ToColor für Rückumrechnung in RGB fehlt nocht.

http://mmis.doc.ic.ac.uk/mmir2005/CameraReadyMissaoui.pdf

Allerdings kommt es darauf an wie "genau" der Fragesteller messen will. Er kann ja mal probieren und schauen ob das Ergebnis mit der RGB-Abstands-Methode ausreicht.

Seh ich genau so

Eine andere ebenfalls einfache Methode wäre im HSV-Modell die Werte zu vergleichen. Der Vergleich kann Analog zu dr4g0n76s Vorschlag erfolgen.

Nope, da soll er dann lieber ein anderes nehmen.

Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.

5.658 Beiträge seit 2006
vor 14 Jahren

Hallo gfoidl,

danke für deine ausführlichen Anmerkungen, hätte ich doch wissen müssen, als ich mich in diese akademische Diskussion eingemischt hab 😃

Ich bin davon ausgegangen, daß es hier um eine einfache Zuordnung von Farben am Bildschirm und nicht im Druck geht...aber egal. Ich hab bisher keine Probleme mit irgendwelchen Umwandlungen gehabt, weil ich meist mit Echtzeitgrafik arbeite und man dort nichteinmal die Zeit hat, die Abweichungen nachzuprüfen... Natürlich hab ich beim Testen Abweichungen festgestellt, aber die habe ich unter Umrechnungs-, Rundungs- u.a. Fehler abgehakt. Woher ich die einzelnen Gleichungen hab, kann ich dir natürlich nicht mehr sagen.

Ich persönlich bin ja nach wie vor der Meinung, daß für den Anwendungsfall von Dexter mit ein paar Referenzfarben die Umrechnung von dr4g0n76 ausreichen würde...

Ansonsten finde ich die Hintergründe, die du hier auf den Tisch bringst natürlich sehr spannend.

Christian

Weeks of programming can save you hours of planning

D
Dexter Themenstarter:in
481 Beiträge seit 2005
vor 14 Jahren

So ich werde dann mal auch was dazu sagen 😃

Der Vergleich im RGB-Farbraum ist leider nicht ausreichend, da dieses Projekt später vielleicht in der Industrie eingesetzt wird und da zB auch Schwarz von Anthrazit unterschieden werden muss.

Ich habe bereits ein fertiges Programm erstellt, welches mir die Farben in den CieLab-Farbraum transformiert und dann mit einem vom User wählbaren Algorithmus von zwei Farben die Differenz ausrechnet.

Hier noch zwei Links, die mir dabei sehr geholfen haben 😃

Manipulating colors in .NET - Part 1
Delta E (CIE 1976)

Dexter

Programmierer sind Maschinen die Koffein in Quellcode umsetzen.

6.911 Beiträge seit 2009
vor 14 Jahren

Hallo,

der 1. Link (bzw. der Code dessen) hat das Problem dass zB RGB -> CieLab -> RGB nicht (richtig) funktioniert. Tw. da für RGB dann Werte außerhalb des Intervalls [0,255] entstehen oder die Farbe anders ist als zuvor. Beachte dies! Das ist auch das Problem das ich noch nicht gelöst habe (aus Zeitmangel).

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

6.911 Beiträge seit 2009
vor 14 Jahren

Hallo,

hab meine Klasse mal vervollständigt so dass sie auch funktioniert 😉

Siehe: Farbkonvertierung RGB <-> HSV und RGB <-> CIE-Lab

@dr4g0n76: Sofern hilfreich kannst du die Konvertierungen für deine Library gerne verwenden 😉

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"