Строим двухцветную гистограмму изображения
Гистограмма обычного цветного изображения получается, если каждый пиксель, который светлее средней по всему изображению яркости, окрашивается в один цвет, например, в белый, а каждый пиксель, который темнее - в другой, например, в чёрный.
На выходе получается Black Lives Matter чёрно-белое или иное двухцветное изображение.
Вот функция и тест для неё, решающие задачу на PHP 7.X, предполагается, что графическая библиотека GD доступна, а исходный файл для тестирования алгоритма размещён в папке скрипта.
<?php define('srcName', 'Lenna.png'); //URL исходной картинки $img = imagecreatefrompng (srcName); if (empty($img)) { echo 'Image '.srcName.' could not be loaded!'; exit; } getHistogram($img); header ('Content-type: image/png'); imagepng ($img); imagedestroy ($img); function getHistogram (&$img) { $black = imagecolorallocate ($img, 0, 0, 0); //тёмный цвет RGB $white = imagecolorallocate ($img, 255, 255, 255); //светлый цвет RGB $width = imagesx ($img); $height = imagesy ($img); $array_lum = array(); //Яркости пикселей $sum_lum = 0 ; //Сумма $average_lum = 0; //Среднее for ($x = 0; $x < $width; $x++) { for ($y = 0; $y < $height; $y++) { $color = imagecolorat ($img, $x, $y); $r = ($color >> 16) & 0xFF; $g = ($color >> 8) & 0xFF; $b = $color & 0xFF; $array_lum[$x][$y] = ($r + $g + $b); $sum_lum += $array_lum[$x][$y]; } } $average_lum = $sum_lum / ($width * $height); for ($x = 0; $x < $width; $x++) { for ($y = 0; $y < $height; $y++) { if ($array_lum[$x][$y] > $average_lum) { imagesetpixel ($img, $x, $y, $white); } else { imagesetpixel($img, $x, $y, $black); } } } } ?>

исходная картинка Lenna.png из папки скрипта

картинка из вывода скрипта
11.07.2020, 15:06 [1441 просмотр]