Ugleh - 5 months ago 8x
PHP Question

# RGB to closest predefined color

Edit:

``````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];
}
}
``````

My goal is this. I grab a picture and loop through each pixel and grab its x,y, and rgb.

Instead of just grabbing the rgb, I have a predefined array and I'm looking for the closest match from the color I grabbed to the predefined array.
The goal here is to only use colors from the predefined array.
Here is my array of colors.

``````\$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));
``````

and here is my existing code that loops through it all.

``````\$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 is a User Defined Function, but what I want to accomplish is to change that function with the function to grab the closest color.

\$colorsofimage contains an array of each pixels info with hex:x:y
what i want it to be is rgb2hex(NEWFUNCTION(\$r,\$g,\$b));
So that the new hex is the 1 out of the predefined array.

I hope you understood, because I have no clue how to do it because I don't know the algorithm of a color.

You have to calculate the distance to each color, and pick the smallest.

There are a few ways to do this. A simple method would be to calculate the distance would be:

``````sqrt((r-r1)^2+(g-g1)^2+(b-b1)^2)
``````

A better method might be to incorporate the weighted values to calculate a distance, for instance the values used when converting RGB->YUV:

``````Y = 0.299 * R + 0.587 * G + 0.114 * B
``````

in that case you would use

``````sqrt(((r - r1) * .299)^2 + ((g - g1) * .587)^2 + ((b - b1) * .114)^2)
``````

Of course, since you don't need the exact distances, just a comparison, you can and probably should just skip the square root, making the last calculation:

``````((r - r1) * .299)^2 + ((g - g1) * .587)^2 + ((b - b1) * .114)^2
``````
Source (Stackoverflow)