Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Farben vergleichen
Dexter
myCSharp.de - Member



Dabei seit:
Beiträge: 481
Herkunft: Österreich, Vlbg

Themenstarter:

Farben vergleichen

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 6.860
Herkunft: Waidring

beantworten | zitieren | melden

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!"
private Nachricht | Beiträge des Benutzers
Dexter
myCSharp.de - Member



Dabei seit:
Beiträge: 481
Herkunft: Österreich, Vlbg

Themenstarter:

beantworten | zitieren | melden

Gut, danke :)

Ich werd mich dann mal mit L*a*b* etwas intesiver beschäftigen.


Dexter
Programmierer sind Maschinen die Koffein in Quellcode umsetzen.
private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 6.860
Herkunft: Waidring

beantworten | zitieren | melden

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!"
private Nachricht | Beiträge des Benutzers
Dexter
myCSharp.de - Member



Dabei seit:
Beiträge: 481
Herkunft: Österreich, Vlbg

Themenstarter:

beantworten | zitieren | melden

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


Dexter
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Dexter am .
Programmierer sind Maschinen die Koffein in Quellcode umsetzen.
private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 6.860
Herkunft: Waidring

beantworten | zitieren | melden

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!"
private Nachricht | Beiträge des Benutzers
MrSparkle
myCSharp.de - Team

Avatar #avatar-2159.gif


Dabei seit:
Beiträge: 5.655
Herkunft: Leipzig

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
dr4g0n76
myCSharp.de - Experte

Avatar #avatar-1768.jpg


Dabei seit:
Beiträge: 2.920
Herkunft: Deutschland

beantworten | zitieren | melden

@Dexter:

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

@GFoidl:
Zitat
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.
private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 6.860
Herkunft: Waidring

beantworten | zitieren | melden

Hallo MrSparkle,
Zitat von 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).
Zitat
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.
Zitat
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
Zitat
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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von gfoidl am .

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!"
private Nachricht | Beiträge des Benutzers
dr4g0n76
myCSharp.de - Experte

Avatar #avatar-1768.jpg


Dabei seit:
Beiträge: 2.920
Herkunft: Deutschland

beantworten | zitieren | melden

Zitat
Hallo dr4g0n7,

Hallo Gfoidl. ;-)
Zitat
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)
Zitat
Aber Danke - ich werde dein Projekt weiter verfolgen.

offtopic: Es lohnt sich. ;-)
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von dr4g0n76 am .
Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.
private Nachricht | Beiträge des Benutzers
dr4g0n76
myCSharp.de - Experte

Avatar #avatar-1768.jpg


Dabei seit:
Beiträge: 2.920
Herkunft: Deutschland

beantworten | zitieren | melden

@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.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von dr4g0n76 am .
Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.
private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 6.860
Herkunft: Waidring

beantworten | zitieren | melden

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!"
private Nachricht | Beiträge des Benutzers
dr4g0n76
myCSharp.de - Experte

Avatar #avatar-1768.jpg


Dabei seit:
Beiträge: 2.920
Herkunft: Deutschland

beantworten | zitieren | melden

@gfoidl:
Zitat
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

Zitat
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
Zitat
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.
private Nachricht | Beiträge des Benutzers
MrSparkle
myCSharp.de - Team

Avatar #avatar-2159.gif


Dabei seit:
Beiträge: 5.655
Herkunft: Leipzig

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Dexter
myCSharp.de - Member



Dabei seit:
Beiträge: 481
Herkunft: Österreich, Vlbg

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 6.860
Herkunft: Waidring

beantworten | zitieren | melden

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!"
private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 6.860
Herkunft: Waidring

beantworten | zitieren | melden

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!"
private Nachricht | Beiträge des Benutzers