Einfärben und Palette Best-Fit-Algorithmen
-
01-10-2019 - |
Frage
Wurde Stochern Google und haben festgestellt, nicht wie das, was ich bin nach. so was ist es bin ich nach? gut zwei Dinge:
-
zunächst Ich suche eine Algorithmus / Pseudo-Code / weiß-Papiere eine Best-Fit-Farbe für ein zu bestimmen, geben r, g, b Tupel von und Anordnung von 256 RGB Tupel.
-
Zweitens, ich suche für eine Algorithmus / Pseudo-Code / weiß-Papiere recolor eine 8bit-Palette Bild (mit Die obige RGB-Palette), um entweder ein Farbton / Sättigung gegeben oder durch r, g, b Kanal-Modifikations. auch wäre schön, wenn es möglich ist, ein Update hinzufügen für Gamma- und artifacting Pixel in das Einfärben als auch.
jemand irgendwelche Hinweise / Hinweise / Tipps, wo ich so etwas finden könnte (ich weiß, sie müssen vorhanden sein, sonst einige photoshops Funktionen würde nicht)
UPDATE: hier ist eine grundlegende euklidische Distanz RGB-Palette-Index-Finder:
uint_8 __stdcall GFXUTIL_GetNearestPaletteIndex(const uint_8* pPalette, size_t nSize, uint_8 nRed, uint_8 nGreen, uint_8 nBlue)
{
if(pPalette == NULL)
return 0;
int nDistance = -1;
size_t nIndex = 0, nFoundIndex = 0;
while(nIndex < nSize)
{
int nDistRed = pPalette[0] - nRed;
int nDistGreen = pPalette[1] - nGreen;
int nDistBlue = pPalette[2] - nBlue;
int nCurrentDistance = (nDistRed * nDistRed) + (nDistGreen * nDistGreen) + (nDistBlue * nDistBlue);
if(nCurrentDistance < nDistance)
{
nFoundIndex = nIndex;
nDistance = nCurrentDistance;
}
nIndex++;
pPalette += sizeof(uint_32);
}
return nFoundIndex;
}
Lösung
Siehe http://en.wikipedia.org/wiki/Color_difference wie zu berechnen Abstände zwischen den Farben, so dass die Augenempfindlichkeit berücksichtigt wird.
Andere Tipps
Wenn Sie es schneller als lineare Suche wollen, dann schauen Sie VP-Baum oder KD-Baum.
Wenn Sie es wahrnehmungs genau wollen, gehen Sie dann die Suche in Lab-Farbraum .