Im RGB-vordefinierte Farbe am nächsten
Edit:
Mit der Antwort ich habe diese Funktion
function grabclosestcolor($r, $g, $b){
$colors = array(array(124,12,12),array(7,7,11),array(110,224,219),array(123,123,123),array(124,177,74),array(130,86,53),array(77,77,77),array(164,124,68),array(204,196,132),array(164,148,147),array(163,123,67),array(26,122,26), array(195,195,50),array(193,193,193),array(255,248,73),array(243,243,243));
$differencearray = array();
foreach ($colors as $value) {
$difference = sqrt(pow($r-$value[0],2)+pow($g-$value[1],2)+pow($b-$value[2],2));
array_push($differencearray, $difference);
$smallest = min($differencearray);
$key = array_search($smallest, $differencearray);
return $colors[$key];
}
}
Mein Ziel ist es diese. Ich schnappe mir ein Bild und eine Schleife durch jedes pixel und greifen Sie seine x -, y-und rgb.
Anstatt nur grabbing die rgb -, ich habe ein vordefiniertes array und ich bin auf der Suche nach der nächsten übereinstimmung von der Farbe, die ich ergriff, um das vordefinierte array.
Das Ziel hier ist, verwenden Sie nur Farben aus dem vordefinierten array.
Hier ist mein array von Farben.
$colors = array(array(124,12,12),array(7,7,11),array(110,224,219),array(123,123,123),array(124,177,74),array(130,86,53),array(77,77,77),array(164,124,68),array(204,196,132),array(164,148,147),array(163,123,67),array(26,122,26), array(195,195,50),array(193,193,193),array(255,248,73),array(243,243,243));
und hier ist mein vorhandener code durchläuft es alle.
$int = imagesx($im) - 1;
$int2 = imagesy($im) - 1;
$start2 = 0;
do{
$start = 0;
do{
$rgb = imagecolorat($im, $start, $start2);
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;
$value = rgb2hex($r,$g,$b).":$start:$start2";
array_push($colorsofimage, $value);
} while($int > $start++);
} while($int2 > $start2++);
rgb2hex ist eine benutzerdefinierte Funktion, was ich aber erreichen möchte ist, das zu ändern-Funktion mit der Funktion zu packen, der nächsten Farbe.
$colorsofimage enthält ein array der einzelnen Bildpunkte info mit hex:x:y
was ich will ist rgb2hex(NEWFUNCTION($r,$g,$b));
Also, dass die neue hex ist die 1 aus dem vordefinierten array.
Ich hoffe Sie verstehen, denn ich habe keine Ahnung, wie es zu tun, denn ich weiß nicht, der Algorithmus für eine Farbe.
- Je nachdem, wie schwer Sie gehen wollen, die Antwort auf meine (ähnliche) Frage von nutzen sein können - stackoverflow.com/questions/4057475/...
- Wieder, ich don T wissen, PHP, gut, aber die Funktion, die Sie geben, wie Ihre Lösung aussieht, wesentlich weniger effizient als die, die ich früher vorgeschlagen: stackoverflow.com/questions/4485229/...
- warum ist es eine Rückkehr in die foreach-Schleife?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie, um die Entfernung zu berechnen, um jede Farbe, und wählen Sie die kleinste.
Gibt es ein paar Möglichkeiten, dies zu tun. Eine einfache Methode wäre, um die Entfernung zu berechnen wäre:
Eine bessere Methode sein könnte, um zu integrieren, gewichtete Werte zum berechnen einer Entfernung, zum Beispiel die Werte bei der Konvertierung von RGB->YUV:
in diesem Fall würden Sie
Natürlich, da brauchen Sie nicht die exakte Distanzen, nur ein Vergleich, Sie können und sollten wahrscheinlich überspringen Sie einfach die Quadratwurzel, so dass die Letzte Berechnung:
Den RGB-Farbe-Raum ist einfach ein Würfel. In 24-bit-Farbe, jede Seite hat eine Länge von 256, so dass Werte von 0 bis 255. Um zu finden Sie die nächstgelegene Farbe in diesem Würfel, müssen Sie eine Distanz-Funktion. Die einfachsten und intuitivsten ist die Euklidische Distanz: wenn Sie die Farbe (r1, g1, b1) und eine andere Farbe (r2, g2, b2) die Entfernung wäre
sqrt((r2-r1)^2 + (g2-g1)^2 + (b2-b1)^2)
.Die Herausforderung für Sie ist, dann finden die beste übereinstimmung über alle Werte in den vordefinierten array. Ich schlage vor, Sie starten einfach durch die Iteration über alle Ihre Werte und überprüfen Sie die Entfernung für jeden in der Reihe. Beachten Sie, dass für dieses Ziel Sie nicht brauchen, um ausführen die
sqrt
einfach den Vergleich auf die Summe der Quadrate ausreichen würde, und hätte den Vorteil, dass alle integer-Mathematik. Mein PHP ist nicht so toll, aber grob Sie tun würde:Gibt es komplizierter Distanz-Funktionen (zum Beispiel, eine bessere Berücksichtigung der psychovisual interpretation der Farbe Unterschiede (Blick in Delta E), aber ich vermute, das ist mehr, als Sie brauchen.
sqrt
- Funktion, die ich meine... Wenn wir gehen, verwenden Sie diesqrt
Funktion, als es der Unterschied zwischen der euklidischen Entfernungen und manhattan-Distanzen... aber wenn Sie beseitigen, die, als Sie sind, nur unter meiner Wert-und Quadratur es... Der einzige Grund, warum wir Platz für absolute Werte... die sqrt-bringt uns dem wahren Wert, aber es kann beseitigt werden, da wir den Vergleich von Entfernungen zu einem statischen array,... aber wenn Sie gehen, um zu beseitigen die sqrt-Sie sind unter der manhattan-Distanz wieder, deine zahlen sind nur größer ist alles...Da diese Frage wird angezeigt in der top-ten-Google-Suche Ergebnisse, hier ist eine komplexere Funktion, die ich schrieb vor einigen Jahren, das produziert bessere Ergebnisse als die vorhandenen PHP-Funktionen.
Berechnung der Entfernung vom Eingang die Farbe auf alle möglichen Kandidaten von Ihrer palette, und wählen Sie dann die mit dem kleinsten Abstand als der, um es zu ersetzen mit.
Abstand kann definiert werden, in irgendeiner Weise, die Sie mögen; euklidische Distanz scheint praktikabel für RGB Würfel, Zylinder oder HSL/HSV-Kegel.
Es gibt keinen Punkt in die Quadratwurzel. Finden Sie die kürzeste Entfernung ist das gleiche wie das finden der kürzesten quadrierten Entfernung.
sqrt
ist ein teurer Vorgang ist, so einfach überspringen.Ob es wirklich wichtig ist, natürlich, hängt davon ab, wie oft Ihr Programm wird diese Berechnung, aber es ist immer noch sinnlos, es zu haben.