Программно определять читаемый цвет (например, красный, зеленый и т. Д.) Изображения - PullRequest
8 голосов
/ 21 сентября 2011

Я пытаюсь придумать скрипт, который будет программно проходить по изображению и сообщать мне, что это основной цвет (цвета).

В настоящее время скрипт получает значение RGB каждого пикселя. Сравнивает их с предопределенными правилами и пытается подсчитать количество пикселей каждого цвета.

Моя проблема в том, что скрипт немного попал. Кто-нибудь знает лучший способ сделать это (возможно, с использованием другой системы цветового кодирования, которую легче перевести на английский) или существующий набор правил, определяющих цвета через их 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));

?>

Ответы [ 2 ]

2 голосов
/ 26 сентября 2011

Решением было преобразовать RGB в HSL, как было предложено Гербертом.Функция для преобразования в человека все еще нуждается в небольшой доработке / доработке, но вот она:

1 голос
/ 22 сентября 2011

Хорошо, у вас есть графическая библиотека, там должно быть что-то среднее, вы усредняете свою фотографию, берете любой пиксель и тадам, которые у вас есть?

И самое простое решение, найденное здесьis: изменить размер до 1x1px, получить цвет:

Получить цвет изображения

После этого довольно просто найти где-нибудь подробный список rgb для удобочитаемого человеком (например, htmlцветов), закодируйте его как массив и используйте его в своем скрипте -> round () ваши r, g, b, vals с точностью до ваших данных и получите цвет.

Вы должны определить, какая цветовая гранулярностьВы хотите и идете оттуда -> найдите свой набор именованных цветов (я думаю, что все 8-битные цвета имеют имя где-то), а затем уменьшите свою информацию RGB до этого - либо уменьшив информацию о цвете изображения перед его чтением (быстрее), либо с помощьюсокращение информации о цвете во время чтения (более гибкий с точки зрения списка цветов.

Базовый пример некоторых читаемых ресурсов rgb-human:

http://www.w3schools.com/html/html_colornames.asp

Другие:

http://chir.ag/projects/name-that-color/#2B7C97

http://r0k.us/graphics/SIHwheel.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...