Zitat: |
Du solltest die Farben, die am häufigsten vorkommen, aber sich nicht zu ähnlich sind, auswählen. Also musst du eine Liste der Farben generieren und einen gewissen Toleranzwert festlegen. |
Sorry, aber das is ja nun mehr als schwammig. 256 Farben auszuwählen, die das Bild gut wiedergeben können, ist ziemlich schwierig denke ich mal. Und man sieht ja auch, was einfache Programme da manchmal ür nen Murks machen. Denn es kann ja. z.b. sein, dass ein Bild am Rand irgendwo je 10 gleiche Pixel hat, aber der Hauptteil ein buntes Photo ist, bei dem jeder Farbwert höchstens 2mal genau gleich ist...und wenn die Pixel am Rand dann auch noch alles verschiedene Grüntöne sind, aber das Bild zeigt einen Sonnenuntergang am blauen Meer....
Ich würde für Probezwecke erstmal 256 feste Farben wählen, die im RGB- Würfel einigermassen gleichverteilt sind, z.b. 0,0,0 / 42,0,0 / 84,0,0,... , 0,42,0,..., 0,0,42,..... (die 42 hat nix mit meiner Signatur zu tun, aber wenn man den Würfel in ein 6x6x6 Gitter aufteilt, kommt man auf 216 (das sind fast 256) Gitterpunkte, und 256/6 sind etwas mehr als 42...)
Aber angenommen, wir hätten unsere 256 Farben schon.
Das mit der Formel kann gut gehen, muss aber nicht. Das liegt daran, dass Farben mit relativ wenig Kontrast (d.h. sie wirken irgendwie grau) und einer gewissen Helligkeit (ein mittleres Grau, nicht zu hell und nicht zu dunkel), alle sehr nah beieinander im RGB-Würfel liegen. Trotzdem wirkt die eine Farbe etwas grün, die andere etwas rot. Hab mit dieser Abstandsformel eher schlechte Erfahrungen gemacht. Damals hatte ich aber auch nur 24 Farben zur Verfügung, auf die ich das Bild reduzieren musste.
Bin dann mit der Zeit auf den Trichter gekommen, ein anderes Farbmodell zu nehmen. Helligkeit, Sättigung, Farbton. Habe dann aber keine Zeit mehr gehabt, das komplett umzusetzen. Am wichtigsten sollte sein, dass der Farbton getroffen wird, und dann mit einigermassen gleicher Priorität die Helligkeit und Sättigung.
Umrechnung RGB- Helligkeit, Sättigung, Farbton:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| Helligkeit:= (r+g+b) /3
m:=(r+g+b)/3; mb:=b-m; mg:=g-m; mr:=r-m; saettigung := sqrt((mb*mb)+(mg*mg)+(mr*mr)); |
Zum Farbton finde ich grade keine Formel mehr. Hab da nur ne Formel, wie man den Farbton eines Bildes ändert...den Farbton selbst bestimmt habe ich noch nicht. Aber der Farbton ist der Winkel zwischen folgenden beiden Ebenen:
Die erste ist gegeben durch die Punkt 0,0,0 255,255,255 und r,g,b deiner Farbe
Die zweite durch 0,0,0 255,255,255 255,0,0 (das sollte die "rote Ebene" sein, d.h alle Farben auf dieser Ebene nehmen wir als rot wahr.)
Such mal in einem Mathebuch der Oberstufe oder im Netz nach "Winkelberechnung zwischen Ebenen". Mit ein bissel Mathe-Grundkenntnissen kommt man da durch.
Wenn du nun eine bestimmte Farbe ersetzen willst, solltest du eine nehmen, die am ehsten dem Farbwert entspricht, und dann Helligkeit- und Sättigungsdifferenz minimieren.
Aber vielleicht reicht es dir ja auch, das Bild in ein TBitmap zu laden, und dann die Eigenschaft "pixelformat" zu ändern...
We are, we were and will not be.