Как найти доминантный цвет в изображении?

Я хочу найти доминирующий цвет в изображении, как я могу это сделать?

было бы здорово, если бы я мог получить это в HEX-коде (exm: #eeeeee)

Чтобы найти наиболее «доминирующий» цвет в изображении, то есть цвет, который наиболее распространен в изображении: вам нужно создать гистограмму изображения.

Вот код из этой статьи о том, как создать гистограмму в PHP . (Веб-сайт несколько раз удалялся)

<?php $source_file = "test_image.jpg"; // histogram options $maxheight = 300; $barwidth = 2; $im = ImageCreateFromJpeg($source_file); $imgw = imagesx($im); $imgh = imagesy($im); // n = total number or pixels $n = $imgw*$imgh; $histo = array(); for ($i=0; $i<$imgw; $i++) { for ($j=0; $j<$imgh; $j++) { // get the rgb value for current pixel $rgb = ImageColorAt($im, $i, $j); // extract each value for r, g, b $r = ($rgb >> 16) & 0xFF; $g = ($rgb >> 8) & 0xFF; $b = $rgb & 0xFF; // get the Value from the RGB value $V = round(($r + $g + $b) / 3); // add the point to the histogram $histo[$V] += $V / $n; } } // find the maximum in the histogram in order to display a normated graph $max = 0; for ($i=0; $i<255; $i++) { if ($histo[$i] > $max) { $max = $histo[$i]; } } echo "<div style='width: ".(256*$barwidth)."px; border: 1px solid'>"; for ($i=0; $i<255; $i++) { $val += $histo[$i]; $h = ( $histo[$i]/$max )*$maxheight; echo "<img src=\"img.gif\" width=\"".$barwidth."\" height=\"".$h."\" border=\"0\">"; } echo "</div>"; ?> 

В этом примере $max является вашим самым «доминирующим» цветом.

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

Попробуйте следующее: http://www.coolphptools.com/color_extract .

Класс изображения Color Extract PHP вытаскивает наиболее распространенные цвета (в процентах) из файла изображения. Значения цвета находятся в шестнадцатеричном формате.

Звучит как восхитительный код для написания! Я сделал функцию некоторое время назад, которая проходит через каждый пиксель и добавляет оттенок каждому из них. Что вы можете сделать, так это:

Для каждого пикселя найдите самый высокий цвет (r, g или b) и выполните математику ($ colorG ++ или что-то еще)

в конце, узнайте, какой из них самый большой, и будет ваш самый высокий тень rgb.

Интересно, какой цвет выйдет, если вы используете полученное значение rgb …

Что касается ответа tkone, $ max – это просто параметр, показывающий плотность цвета на изображении. я немного изменю код, чтобы вернуть шестнадцатеричный цвет:

 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Empty Document</title> </head> <body> <?php error_reporting(0); function rgb2hex($rgb) { $hex = "#"; $hex .= str_pad(dechex($rgb[0]), 2, "0", STR_PAD_LEFT); $hex .= str_pad(dechex($rgb[1]), 2, "0", STR_PAD_LEFT); $hex .= str_pad(dechex($rgb[2]), 2, "0", STR_PAD_LEFT); return $hex; // returns the hex value including the number sign (#) } $source_file = "image.jpg"; // histogram options $maxheight = 300; $barwidth = 2; $im = ImageCreateFromJpeg($source_file); $imgw = imagesx($im); $imgh = imagesy($im); // n = total number or pixels $n = $imgw*$imgh; $histo = array(); for ($i=0; $i<$imgw; $i++) { for ($j=0; $j<$imgh; $j++) { // get the rgb value for current pixel $rgb = ImageColorAt($im, $i, $j); //echo $rgb."<br>"; // extract each value for r, g, b $r = ($rgb >> 16) & 0xFF; $g = ($rgb >> 8) & 0xFF; $b = $rgb & 0xFF; // get the Value from the RGB value $V = round(($r + $g + $b) / 3); //echo $V."<br>"; // add the point to the histogram $histo[$V] += $V / $n; $histo_color[$V] = rgb2hex([$r,$g,$b]); } } // find the maximum in the histogram in order to display a normated graph $max = 0; for ($i=0; $i<255; $i++) { if ($histo[$i] > $max) { $max = $histo[$i]; } } echo "<div style='width: ".(256*$barwidth)."px; border: 1px solid'>"; for ($i=0; $i<255; $i++) { $val += $histo[$i]; $h = ( $histo[$i]/$max )*$maxheight; echo "<img src=\"img.gif\" width=\"".$barwidth."\" height=\"".$h."\" border=\"0\">"; } echo "</div>"; $key = array_search ($max, $histo); $col = $histo_color[$key]; ?> <p style="min-width:100px; min-height:100px; background-color:<?php echo $col?>;"></p> <img src="<?php echo $source_file?>"> </body> </html> 

Также я должен сказать, что это только самый повторяющийся цвет на изображении, который не может считаться «доминантным цветом».

Вы должны взглянуть на функции GD и Image .

Аналогичный вопрос о SO об извлечении информации о цвете из образа с помощью PHP, и он ссылается на этот класс на github.

Хотя его в javascript, но цветной вор лучше всего подходит для получения доминирующего цвета в изображении.

https://github.com/lokesh/color-thief