Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Idee für Algorithmus

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
28.09.2006, 19:43 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Hi,
also ich hab folgendes Problem:

Ich habe eine Farbpalette: 256 Farben - je RGB

Nun such ich zu einem RGB-Wert den Index - NUR: was man sofort sieht - wenn man die Farbe nicht vorhanden ist - krieg ich keinen gültigen "Index" - logisch irgendwo.

Wie mach ich das nun am geschicktesten den "nähesten Treffer" zu finden?

also z.b wenn ich


Code:
200 100 200




suche und drin habe


Code:
201 99 200
230 50 91



das er mir dann logischerweise 201 99 200 ausspuckt (bzw den index davon)

wie mach ich diese Suche am geschicktesten (und vor allem soll das ganze möglichst performant sein und in C, C++ geht auch, nur eben keine stl)

Meine Palette ist im Endeffekt momentan ein "unsigned char[256][3]"-Array.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
28.09.2006, 20:02 Uhr
BoBtheREapER
kein job für nen BoB


ich verstehe nicht wirklich was du vor hast. weite dein beispiel mal ein wenig aus.
--
"Zwei Dinge sind unendlich: Das Universum und die menschliche Dummheit. Aber beim Universum bin ich mir nicht ganz sicher." - Albert Einstein
www.blue-xenon.de.vu
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
28.09.2006, 20:05 Uhr
0xdeadbeef
Gott
(Operator)


Naja, die einfachste Methode wäre, die Abweichungen der einzelnen Farbwerte von der gesuchten Farbe zusammenzuzählen. Für kleine Abweichungen wird das wohl genügen, allerdings kann es dir natürlich passieren, dass du damit Ergebnisse kriegst, die im Farbton doch deutlich abweichen - wenn du zum Beispiel nach 100/100/100 suchst (dunkles Grau) und eine Palette 80/80/80 und 41/100/100 hast, kriegst du auf die Art die 41/100/100 (dunkles Türkis) statt der 80/80/80 (dunkleres Grau) raus. Vielleicht ist es daher sinnvoll, zusätzlich noch die Spanne der Abweichung dazuzuzählen (also maximale Abweichung - minimale Abweichung). In dem Fall wäre bei diesem Beispiel der Abweichungswert für 80/80/80 halt 60, weil dreimal 20 Punkte Abweichung + 0 Punkte Spanne der Abweichung, und 41/100/100 wäre 108: 59 + 0 + 0 Abweichung + 59 Abweichungsspanne.

Jedenfalls wär das so meine erste (ungetestete) Idee. Sollte einfach umzusetzen sein, und mein Gefühl sagt, es sollte brauchbar laufen.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
28.09.2006, 21:50 Uhr
virtual
Sexiest Bit alive
(Operator)



Zitat von FloSoft:

Wie mach ich das nun am geschicktesten den "nähesten Treffer" zu finden?




Der "nächste Treffer" ist recht relativ. Es leuchtet ein, daß wenn jemand von einem gegeben RGB Wert die Blaukomponente um 20% verändert, dies weniger auffällt, als wenn die Grün-Komponente verändert wird. Dies ist so, weil das menschliche Auge sich am meisten an der Helligkeit orientiert. Dazu gibt es verschiedene Untersuchungen.

Wenn es Dir also darum geht, den "nächsten treffer" zu finden, welcher für das menschliche Auge am nächsten liegt, dann ist RGB die denkbar schlechteste Wahl. Vom RGB Farbmodell ausgehend, ist das YIQ Farbmodell ganz brauchbar, um hier eine entsprechende Vergelichoperationen zu machen, siehe auch www.cs.rit.edu/~ncs/color/t_convert.html
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
28.09.2006, 22:44 Uhr
FloSoft
Medialer Over-Flow
(Administrator)



Zitat von 0xdeadbeef:
Naja, die einfachste Methode wäre, die Abweichungen der einzelnen Farbwerte von der gesuchten Farbe zusammenzuzählen. Für kleine Abweichungen wird das wohl genügen, allerdings kann es dir natürlich passieren, dass du damit Ergebnisse kriegst, die im Farbton doch deutlich abweichen - wenn du zum Beispiel nach 100/100/100 suchst (dunkles Grau) und eine Palette 80/80/80 und 41/100/100 hast, kriegst du auf die Art die 41/100/100 (dunkles Türkis) statt der 80/80/80 (dunkleres Grau) raus. Vielleicht ist es daher sinnvoll, zusätzlich noch die Spanne der Abweichung dazuzuzählen (also maximale Abweichung - minimale Abweichung). In dem Fall wäre bei diesem Beispiel der Abweichungswert für 80/80/80 halt 60, weil dreimal 20 Punkte Abweichung + 0 Punkte Spanne der Abweichung, und 41/100/100 wäre 108: 59 + 0 + 0 Abweichung + 59 Abweichungsspanne.

Jedenfalls wär das so meine erste (ungetestete) Idee. Sollte einfach umzusetzen sein, und mein Gefühl sagt, es sollte brauchbar laufen.

das klingt schon ganz gut - ja mal sehen wie ich das umsetzen kann.

Ansonsten - ich hab die Paletten gegeben - d.h ich muss wohl oder übel mit RGB arbeiten. das mit YIQ schaut zwar ganz gut aus - nur naja weiß nicht.

Ich frag mich wie z.b Grafikprogramme wie Photoshop das macht - da kann man ja im Farbwähler beliebige RGB-Farbe auswählen und er sucht sich die "näheste" aus.

Klar - irgendwo verfälscht das das teilweise die Farbe - nur wie arbeiten solche Programme? Wandlet das den gesuchten Farbton dann in YIQ oder ähnliches um und sucht dann da drüber den Wert?

Ansonsten @virtual hast du da ein Beispiel wie man das mit YIQ macht? außerdem versteh ich denen ihr Beispiel nicht so ganz - ich habs nicht so mit der Mathematik.

Im MacOS gibts ja diese "Color2Index"-Funktion - sowas bräuchte ich halt.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: