Estoy intentando crear un script que ejecutará programáticamente una imagen y me dirá su color primario.Determinado programáticamente el color legible por el ser humano (por ejemplo, rojo, verde, etc.) de una imagen
Actualmente, el script obtiene el valor RGB de cada píxel. Los compara con reglas predefinidas e intenta contar el número de píxeles de cada color.
Mi problema es que el script es un poco al azar. ¿Alguien sabe de una mejor manera de hacerlo (tal vez usando un sistema diferente de codificación de colores que es más fácil de traducir al inglés) o un conjunto existente de reglas que definen los colores a través de su RGB?
<?php
$file = "8629.jpg";
$colors = array("Red" => array("rel" => true, "r" => 0.65, "g" => 0.09, "b" => 0.25, "var" => 0.3),
"Blue" => array("rel" => true, "r" => 0.21, "g" => 0.32, "b" => 0.46, "var" => 0.3),
"Green" => array("rel" => true, "r" => 0, "g" => 0.67,"b" => 0.33, "var" => 0.3),
"Black" => array("rel" => false, "r" => 0, "g" => 0,"b" => 0, "var" => 30),
"White" => array("rel" => false, "r" => 255, "g" => 255,"b" => 255, "var" => 30));
$total = 0;
$im = imagecreatefromjpeg($file);
$size = getimagesize($file);
if (!$im) {
exit("No image found.");
}
for ($x = 1; $x <= $size[0]; $x++) {
for($y = 1; $y <= $size[1]; $y++) {
$rgb = imagecolorat($im, $x, $y);
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;
$colorTotal = $r + $g + $b;
$rRatio = $r > 0 ? $r/$colorTotal : 0;
$gRatio = $g > 0 ? $g/$colorTotal : 0;
$bRatio = $b > 0 ? $b/$colorTotal : 0;
foreach($colors as $key => $color) {
if ($color["rel"]) {
if ((($color["r"] - $color["var"]) <= $rRatio && $rRatio <= ($color["r"] + $color["var"])) &&
(($color["g"] - $color["var"]) <= $gRatio && $gRatio <= ($color["g"] + $color["var"])) &&
(($color["b"] - $color["var"]) <= $bRatio && $bRatio <= ($color["b"] + $color["var"]))) {
$colourCount[$key]++;
$total++;
}
} else {
if ((($color["r"] - $color["var"]) <= $r && $r <= ($color["r"] + $color["var"])) &&
(($color["g"] - $color["var"]) <= $g && $g <= ($color["g"] + $color["var"])) &&
(($color["b"] - $color["var"]) <= $b && $b <= ($color["b"] + $color["var"]))) {
$colourCount[$key]++;
$total++;
}
}
}
}
}
var_dump($colourCount);
foreach($colourCount as $key => $color) {
$colourPrecent[$key] = $color/$total;
}
arsort($colourPrecent);
var_dump($colourPrecent);
foreach($colourPrecent as $key => $color) {
if ($prevVal) {
if ($color < ($prevVal - 0.1)) {
break;
}
}
$primary[] = $key;
$prevVal = $color;
}
echo("The primary colours in this image are " . implode(" and ", $primary));
?>
Hmm, interesante. Me temo que mi única contribución es [esta advertencia] (http://www.thedoghousediaries.com/?p=1406) sobre la definición de colores "legibles por humanos". – Widor
Considerando que una imagen de color verdadero podría tener cada píxel como único, no ganará mucho a menos que empiece a "agrupar" colores similares juntos. Quizás sería más simple encoger la imagen a un píxel de 1x1 y descubrir su color predominante. –
RGB parece ser la [opción menos útil del modelo de color aquí] (http://www.wowarea.com/english/help/color.htm). @Widor, seguramente el script tomará un parámetro IsGuy. ;) – bzlm