БлогNot. Оператор Кэнни на PHP

Оператор Кэнни на PHP

Этот алгоритм популярен при обнаружении и выделении границ на изображении.

Аргумент $level функции canny определяет чувствительность алгоритма, ниже показана пара картинок при различных значениях $level, а также исходник самого приложения, проверенный в XAMPP.

Исходное изображение и версия PHP те же, что в этой заметке.

Цвета конвертируются в модель HSV из обычной RGB.

<?php
 $filename = "Lenna.png";
 $dimensions = getimagesize($filename);
 $w = $dimensions[0]; // width
 $h = $dimensions[1]; // height
 
 $img = imagecreatefrompng($filename);
 canny ($img,$w,$h,1);
 header('Content-Type: image/png');
 imagepng($img);
 imagedestroy($img);

 function RGBtoHSV($r, $g, $b) { //r,g,b из диапазона 0..255
  $r = $r/255.; $g = $g/255.; $b = $b/255.; //преобразуем в 0..1
  $cols = array("r" => $r, "g" => $g, "b" => $b);
  asort ($cols, SORT_NUMERIC);
  $min = key(array_slice($cols, 1)); // "r", "g" или "b"
  $max = key(array_slice($cols, -1));
  if ($cols[$min] == $cols[$max]) { //тон цвета
   $h = 0;
  }
  else {
   if($max == "r") {
    $h = 60. * ( 0 + ( ($cols["g"]-$cols["b"]) / ($cols[$max]-$cols[$min]) ) );
   } 
   elseif ($max == "g") {
    $h = 60. * ( 2 + ( ($cols["b"]-$cols["r"]) / ($cols[$max]-$cols[$min]) ) );
   } 
   elseif ($max == "b") {
    $h = 60. * ( 4 + ( ($cols["r"]-$cols["g"]) / ($cols[$max]-$cols[$min]) ) );
   }
   if($h < 0) {
    $h += 360;
   }
  }
  if ($cols[$max] == 0) { //насыщенность 
   $s = 0;
  } 
  else {
   $s = ( ($cols[$max]-$cols[$min])/$cols[$max] );
   $s *= 255;
  }
  $v = $cols[$max]; //яркость
  $v *= 255;
  return(array($h, $s, $v));
 }


function canny (&$img,$w,$h,$level) {
 $color1 = imagecolorallocate ($img, 255, 255, 255); //светлый цвет RGB
 $color2 = imagecolorallocate ($img, 0, 0, 0); //тёмный цвет RGB
 for ($hi=0; $hi < $h; $hi++) {
  for ($wi=0; $wi < $w; $wi++) {
   $rgb = imagecolorat($img, $wi, $hi);
   $r = ($rgb >> 16) & 0xFF;
   $g = ($rgb >> 8) & 0xFF;
   $b = $rgb & 0xFF;
   $hsv = RGBtoHSV($r, $g, $b);
   $brgb = imagecolorat($img, $wi, ($hi<$h-1 ? $hi+1 : $hi)); //пиксель ниже
   $br = ($brgb >> 16) & 0xFF;
   $bg = ($brgb >> 8) & 0xFF;
   $bb = $brgb & 0xFF;
   $bhsv = RGBtoHSV($br, $bg, $bb);
   if ($hsv[2]-$bhsv[2] > $level) {  //Если разница в HUE больше $level, найден край
    imagesetpixel ($img, $wi, $hi, $color1);
   } 
   else {
    imagesetpixel($img, $wi, $hi, $color2);
   }
  }
 }
}
?>
результат при $level = -10
результат при $level = -10
результат при $level = 1
результат при $level = 1

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

11.07.2020, 19:38; рейтинг: 63