Farbpalettenkonvertierung

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

Vorneweg Grafikprogrammierung hab ich nur kurz an der Uni gestreift, ein paar theo. Grundlagen sind da nur hängengeblieben.
Mir fehlen Denkanstöße damit ich weiter forschen kann, Code kann ich nachreichen.

Ich habe ein Projekt, wo ich ein Bild mit einer Palette in einer anderen Farbpalette überführen will.

Dafür gibts eine Reihe von Einschränkungen, die wichtigsten:
  • Ziel-Farbpalette besteht aus 64 vordef. Farben(RGB gleichverteilt)
  • Zur Einfachung darf ich aus diesen 16 auswählen , theoretisch kann ich zwischen 2 Paletten schalten
Die Probleme was ich dabei habe:
  • Grafik sieht stark reduziert aus, da selten 16 Farbe nach der Palettenkonvertierung über bleiben
  • Dithering erzeugt zwar Rauschen aber die Abstufung der Farben könnten besser sein.
Der aktuelle Ansatz, war nun mit Irfanview das Bild auf 16 reduzieren und auf die gewünschte Auflösung bringen damit garantiert ist das ich nicht zu viele Farbe am Ende habe.
Da wird schon Floyd-Steinberg Dithering verwendet seitens Irfanview.

Dann mit meinen Skript drüberlaufen lassen mit nearest_color nach Rec. 709 (sRGB) luma coef.
Da kommen nie mehr als 10 Farben raus, liegt wohl am Ausgangsmaterial.
Dann Dithering(Floyd-Steinberg), das verrauscht das Bild einigermaßen aber toll sieht das nicht immer aus, gerade wenn sowas wie Nebel vorkommt oder das Bild sehr viele ähnliche Farben verwendet .
Gibt's da noch weitere Möglichkeiten der Qualitätsverbesserung?

Bild
Bild
Bild

Die Frage die mich beschäftigt, wenn ich Dithering vom ursprünglichen Bild nehme, bekomme ich da bessere Ergebnisse?
Wenn die verwendeten Farbwerte nicht weit auseinander liegen, bekomme ich recht wenig Farben, teils nur 5.
Wie reduziere ich die Anzahl der Farben wieder, wenn ich obigen Ansatz verfolge?
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
Benutzeravatar
__blackjack__
User
Beiträge: 13123
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@darktrym: Was heisst denn du *darfst* 16 Farben wählen? Sollte das eigentlich Du *musst* heissen, denn ansonsten könnte man ja einfach(er) auf die 6-Bit-RGB-Palette konvertieren. Und was heisst zwischen zwei Paletten schalten? Einmal irgendwo im Bild bzw. ab einer festen Zeile? Oder in jeder Zeile?

Hier mal was man mit ImageMagick's ``convert`` daraus machen kann. Verkleinert, auf 6-Bit-RGB reduziert (von links nach rechts: kein Dithering, 2×2 ordered dithering, 4×4 ordered dithering), und dann auf 16 Farben reduziert, und für die Anzeige 2×2 Pixel, damit es nicht so klein dargestellt wird:
BildBildBild
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

Dann hole ich mal etwas aus.
Die Plattform verwendet Kacheln von 8x8 Pixels.
Jede Kachel ist dabei genau einer Farbpalette von 16 Farben zugewiesen.
Diese 16 Farben kann ich frei wählen aus einem Satz von 64 Farben.
Somit gibt es ein Optimierungsproblem, welche Farbpalette ist die günstigste für das Bild.
In dem hier verwendeten Bild liegen die Farben zum Glück weit auseinander, hier ein anderes Beispiel:

Bild
Bild

Bild
Bild

Die Kanten gehen fast unter im Bild.
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
Benutzeravatar
grubenfox
User
Beiträge: 433
Registriert: Freitag 2. Dezember 2022, 15:49

darktrym hat geschrieben: Dienstag 28. März 2023, 12:06 Die Plattform verwendet Kacheln von 8x8 Pixels.
Jede Kachel ist dabei genau einer Farbpalette von 16 Farben zugewiesen.
Diese 16 Farben kann ich frei wählen aus einem Satz von 64 Farben.
Also jede Kachel kann eine unterschiedliche Farbpalette von jeweils 16 aus 64 Farben haben?
Benutzeravatar
__blackjack__
User
Beiträge: 13123
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ich vermute jede Kachel kann eine von *zwei* Paletten mit jeweils 16 aus 64 Farben haben. Das klingt nämlich verdächtig nach Sega Master System. Da kann man zwei solche Paletten festlegen. Beide können für Hintergrund-Kacheln verwendet werden, eine nur für Sprites. Und 8×8 Pixel haben die Kacheln dort auch.

Zumindest solange das Bildmaterial so ”eintönig” ist, lohnt sich der Aufwand dafür aber wahrscheinlich nicht. Bei dem Bild aus dem ersten Beitrag, was ja das bisher ”farbenfroheste” war, kamen beim runter rechnen auf 6-Bit-RGB immer so 25 Farben raus, die weitere Reduktion auf 16 Farben hat aber kaum einen Unterschied in der Bildqualität gemacht.

Bei dem Bildmaterial ist der fehlende Kontrast wohl auch ein Problem, weil es im Zielfarbraum nur 4 Helligkeitsstufen gibt. Und bei der geringen Auflösung gehen beim Dithering dann Details wie Kanten verloren.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
__blackjack__
User
Beiträge: 13123
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Hier noch mal was ImageMagick aus den beiden Bildern macht:

BildBildBild
BildBildBild

Die beiden Probleme sind wenig Kontrast bei Details/Linien und wenn die Farbe(n) im Original nicht so ziemlich genau eine Farbe aus dem Zielfarbraum treffen, viel Dithering für eigentlich einfarbige Flächen. Dann noch die geringe Auflösung, und Details gehen ganz schnell im Dithering unter.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten