エッジ検出

画像からモノの輪郭だけを抽出することをエッジ検出という
エッジとは、ピクセル値が極端に変わった箇所を強調して抽出するが、より高度な処理が必要
その中でも特にCannyアルゴリズムが性能が高いと言われている

imagefilter ( $image , IMG_FILTER_EDGEDETECT );
imagefilter ( $image , IMG_FILTER_BRIGHTNESS , 20 );
imagefilter ( $image , IMG_FILTER_CONTRAST , -255 );

### measure of overall sharpness and generating a score
imagecolorat — ピクセルの色のインデックスを取得

chicks.jpg

cherry.jpg

function getBlurAmount($image){
	$size = getimagesize($image);
	$image = ImageCreateFromJPEG($image);
	imagefilter($image, IMG_FILTER_EDGEDETECT);
	$blur = 0;
	for ($x = 0; $x < $size&#91;0&#93;; $x++){
		for ($y =0; $y< $size&#91;1&#93;; $y++){
			$blur += imagecolorat($image, $x, $y) & 0xFF;
		}
		return $blur;
	}
}

$e1 = getBlurAmount("chicks.jpg");
$e2 = getBlurAmount("cherry.jpg");
echo "relative blur of first image is" . $e1 / min($e1, $e2) .", and relative blur of second image is" . $e2 / min($e1, $e2) . ".<br>";
echo $e1. "<br>";
echo $e2;

relative blur of first image is1.0578699268003, and relative blur of second image is1.
55206
52186

### Cannyアルゴリズム
1. ノイズ削減
-> 画像を平滑化してノイズ削減
2. 画像の輝度勾配を見つける
-> 平滑化された画像からSobelフィルタを使って縦方向(G_y)と横方向(G_x)の1次微分を取得、2つの微分画像からにエッジの勾配と方向を求める
3. 非極大値の抑制
 -> エッジと関係ない画素を取り除く(勾配方向に対して極大値であるか確認)
4. Hysteresisを使った閾値処理
 -> minVal と maxVal を使って、正しいエッジとそうでないエッジを区分する
OpenCVではcv2.Canny() を使う

エッジ検出単体でというより、組み合わせて使うイメージか・・・