aus RGB Werten Farben auslesen



  • ich habe eine Frage, und zwar ob es möglich ist, Farben von c++ bestimmen zu lassen also, 255,0,0 ist rot aber 255,40,40 ist auch Rot. Gibt es dafür eine Funktion die mir es ermöglicht zu sagen: "diese RGB Werte ähneln am meisten dieser Farbe, deshalb ist es ..." Danke für die Hilfe im vorraus



  • @thinki Das ist eine Funktion, die du so nicht in der c++-Standardbibiothek finden wirst, sondern eher in irgendwelchen Bibliotheken für Bildverarbeitung. Sowas kann man auch mit nicht allzu großem Aufwand selbst implementieren. Letztendlich handelt es bei der "Ähnlichkeit" von Farben um eine Metrik (Abstandsfunktion) im verwendeten Farbraum.

    Der simpelste Ansatz ist wohl, die RGB-Werte als Punkte im (3D-)RGB-Farbraum aufzufassen und einfach den euklidischen Abstand zwischen beiden zu berechnen:

    d(a,b)=(ab)T(ab)=(arotbrot)2+(agruenbgruen)2+(ablaubblau)2d(a, b) = \sqrt{ (a-b)^T(a-b) } = \sqrt{ (a_{rot} - b_{rot})^2 + (a_{gruen} - b_{gruen})^2 + (a_{blau} - b_{blau})^2 }

    Wenn du nur wissen willst, ob eine Farbe näher als die andere ist, kannst du auch die Wurzel weglassen und nur mit dem Abstandsquadrat arbeiten. Das ist etwas flotter zu berechnen. Wenn du Zugang zu ner Vektor/Matrixbibliothek hast, dann kannst du das auch als Skalarprodukt oder als Matrixmultiplikation formulieren, wie ich das in der ersten Formel gemacht habe. Die Länge eines (Spalten-) Vektors (dasselbe wie eine n×1n \times1-Matrix) xRn\bold x \in R^n ist xTx\sqrt{ \bold x^T\bold x }, also seine Transponierte mit dem Vektor (matrix-) multipliziert.

    Diese euklidische Metrik im RGB-Raum funktioniert zwar einigermassen, ist aber kein sonderlich gutes Abstandsmaß, da sie nicht immer dem tatsächlich wahrgenommenen Farbabstand entspricht. Wenn du bessere Ergebnisse erzielen willst, solltest du eine geeignetere Metrik wählen, siehe dazu z.B.: https://en.wikipedia.org/wiki/Color_difference

    ... oder recherchiere im Netz zu dem Thema. Das kann durchaus umfangreich werden, wenn man es besonders gut machen will 🙂



  • hilfe das is ja ne ganze wissenschaft wollte nur was kleines praktisches Programmieren. Naja ich werde das mal mit Mathe versuchen mal gucken wie das dann wird, danke aber für die Hilfe



  • @thinki sagte in aus RGB Werten Farben auslesen:

    hilfe das is ja ne ganze wissenschaft wollte nur was kleines praktisches Programmieren. Naja ich werde das mal mit Mathe versuchen mal gucken wie das dann wird, danke aber für die Hilfe

    Ja, ist mit vielen auf den ersten Blick simplen Themen so, wenn an tiefer einsteigt 😉

    Nimm einfach den Abstand zwischen den beiden Punkten im RGB-Raum. Das ist für simple Anwendungen "gut genug" und das solltest du hinbekommen, oder? Abstand von 2 Punkten im 3D-Raum? Pythagoras ...



  • @Finnegan ich wüsste es in einem 2d Raum aber im 3d Raum hab ich noch nix berechnet nein wäre nett wenn du mir das nochmal erklären könntest



  • @thinki sagte in aus RGB Werten Farben auslesen:

    @Finnegan ich wüsste es in einem 2d Raum aber im 3d Raum hab ich noch nix berechnet nein wäre nett wenn du mir das nochmal erklären könntest

    Ich habs oben schon geschrieben, hier nochmal etwas anders. Der Abstand zwischen den Punkten aa und bb die jeweils x,y,zx, y, z-Koordinaten haben (axa_x, aya_y, aza_z, etc.) ist:

    d(a,b)=(axbx)2+(ayby)2+(azbz)2d(a, b) = \sqrt{ (a_x - b_x)^2 + (a_y - b_y)^2 + (a_z - b_z)^2 }

    ist sehr ähnlich wie für den 2D-Raum. Das ist letztendlich die Länge des Vektors der von Punkt bb nach Punkt aa verläuft, also die Länge den Vektors aba - b, wobei a,bR3a, b \in \mathbb{ R }^3.

    Oder schau dir den Link an, den ich gepostet habe: https://en.wikipedia.org/wiki/Color_difference. Die erste Formel die da steht, das ist genau dasselbe, nur etwas anders geschrieben. Vielleicht hilft das fürs Verständnis.


Log in to reply