画像からモノの輪郭だけを抽出することをエッジ検出という
エッジとは、ピクセル値が極端に変わった箇所を強調して抽出するが、より高度な処理が必要
その中でも特に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[0]; $x++){ for ($y =0; $y< $size[1]; $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() を使う
エッジ検出単体でというより、組み合わせて使うイメージか・・・