БлогNot. Строим двухцветную гистограмму изображения

Строим двухцветную гистограмму изображения

Гистограмма обычного цветного изображения получается, если каждый пиксель, который светлее средней по всему изображению яркости, окрашивается в один цвет, например, в белый, а каждый пиксель, который темнее - в другой, например, в чёрный.

На выходе получается 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 из папки скрипта
исходная картинка Lenna.png из папки скрипта
картинка из вывода скрипта
картинка из вывода скрипта

Почему эта картинка?


теги: графика php цвет алгоритм

11.07.2020, 15:06; рейтинг: 69