Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Farbe herabsetzen (https://www.delphipraxis.net/138274-farbe-herabsetzen.html)

hadschi92 6. Aug 2009 12:37


Farbe herabsetzen
 
Liste der Anhänge anzeigen (Anzahl: 2)
Ich versuche in einem Bild die Farben herabzusetzen. Ich habe z.B. ein Bild und möchte dieses Bild auf 16 festgesetzte Farben bringen. Ganz einfach würde das gehen wenn ich Bild.PixelFormat := pf4bit setzen würde. Doch dabei werden Farbverläufe von z.B. Weiß nach Rot in Grau dargestellt. Im Anhang zwei Bilder, an denen man dies sehen kann.

Wie kann man solch eine Funktion schreiben, die auch hellrote Farben in Rot umwandelt? Das Problem ist dabei auch, dass die eine Farbe für den einen Menschen mehr nach Rot, für den anderen mehr nach Weiß aussieht. Fertige Tabellen wird es wohl nicht geben, bzw. für jede dieser 16 Farben einen Farbraum per Hand zu bestimmen wäre auch zu aufwändig. Kann man sowas vielleicht ausrechnen? Oder gibt es andere Vorgehensweisen?

Sherlock 6. Aug 2009 13:00

Re: Farbe herabsetzen
 
Ich denke mal das Stichwort, das Dir für Deine Suche fehlt ist "Dithering". Das erlaubt bei herabgesetzter Farbtiefe durch "intelligentes" nebeneinanderplatzieren von Farbpunkten eine dem Original ähnliche Darstellung.

Sherlock

Medium 6. Aug 2009 13:03

Re: Farbe herabsetzen
 
Die Wikipedia weiss dankenswerterweise wie so oft weiter, und nennt sogar gleich mehrere Verfahren.

Edit: Dithering allein macht eine optimierte Palette aber noch lange nicht wett. Das ist eher ein optionaler nachgelagerter Schritt.

hadschi92 6. Aug 2009 16:22

Re: Farbe herabsetzen
 
Dithering will ich keins einbauen. Das Bild soll nicht unbedingt originalgetreu rekonstruiert werden. Die Farbverläufe sollen nicht nachgebildet werden, ich brauche ein Bild mit harten Kanten. Das Problem ist, dass aus einer hellroten Farbe ein Grauton gemacht wird. Jedoch soll nach meiner Vorstellung aus diesem hellrot ein Rot gemacht werden.

Ich werde es jetzt so versuchen, dass ich die 16 Farben festlege und wenn ich dann einen Farbton habe, dann schaue ich, an welcher Farbe er am nähesten dran ist. Man kann sich den RGB Farbraum ja wie einen Würfel vorstellen und dann kann ich diesen entweder in genügend Quadrate unterteilen oder ich lasse mir noch was anderes zur Bestimmung der Entfernung einfallen.

Falls jemand noch andere Vorschläge hat, nur her damit.

Reinhard Kern 6. Aug 2009 19:16

Re: Farbe herabsetzen
 
Zitat:

Zitat von hadschi92
Falls jemand noch andere Vorschläge hat, nur her damit.

Hallo,

wenn es wirklich ganz und gar nach deinem Geschmack gehen soll, gibt es nur eine Möglichkeit: du machst eine Tabelle mit 24 Mio Einträgen (entsprechend RGB) und schreibst in jede Zelle, welche von den 16 reduzierten Farben das werden soll.

Gruss Reinhard

hadschi92 11. Aug 2009 09:47

Re: Farbe herabsetzen
 
So, ich hab das jetzt folgendermaßen gelöst:

Zuerst rechne ich den RGB-Wert in den HSV-Wert um. Der H-Wert beschreibt dabei den Farbton auf einer 360° Skala. Diese Skala habe ich dann in zwölf Bereiche Aufgeteilt, jede 30 Grad stehen dabei für eine Farbe. Dann muss man natürlich noch die Helligkeit und die Sättigung berücksichtigen und dadurch kann man dann noch die Farben Weiß, Grau und Schwarz definieren.

Was mir noch fehlt wäre z.B. die Farbe Braun, diese ist nämlich garnicht so einfach zusammengestellt: Nach Wolfram|Alpha besteht sie aus der Farbe Orange (30° auf der Farbskala), ist aber nur zu 67% gesättigt. Aber vielleicht kann man den Farbraum noch bisschen erweitern, mit viel ausprobieren bekomme ich sicher noch was raus.

jus 11. Aug 2009 10:53

Re: Farbe herabsetzen
 
Hallo hadschi92,

du könntest alle Farben in Lab Werte umwandeln. Das besondere an den Lab Farbraum ist, dass man quasi mit euklidischen Abständen rechnen kann. Außerdem gibt es eine Formel namens deltaE im Lab-Farbraum, das den Abstand von 2 Lab-Farben auspuckt. Du rechnest für jede Farbe das deltaE zu den 16 Farben aus. Dort wo das deltaE am geringsten ist, da schiebst du die Farbe hin. Was ich nicht abschätzen kann, ist der Rechenaufwand. Aber bei kleinen Bildern sollte es schon funktionieren.


Lg,
jus


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:09 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz