Оператор Кэнни на 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 = 1
11.07.2020, 19:38 [1210 просмотров]