2012年4月24日火曜日

エッジを検出する その3 - OpenCV for Android


続いてCannyフィルタです。

ガウシアンフィルタとSobelフィルタを組み合わせてエッジを検出します。
まず、ガウシアンフィルタでぼけた画像を作り、その画像にSobelフィルタをかけることでエッジを検出します。
実際には処理はそれだけではなく、色々とやっているようです。

Cannyフィルタを利用するには、Imgproc.Canny()メソッドを利用します。

Imgproc.Canny(Mat image, Mat edges, double threshold1,
double threshold2, int apertureSize, boolean L2gradient)

Mat src          処理したい元画像のMat
Mat edges        変換後Mat
double threshold1   第1閾値
double threshold2   第2閾値
int apertureSize    Sobelのアパーチャサイズ
boolean L2gradient  L2ノルム利用有無


threshold1、threshold2については、値が小さいほうがエッジ同士を接続するために用いられ、大きいほうが強いエッジの初期検出に用いられます。
順番を変えても結果は同じです。

apertureSizeについては、デフォルトが3で、3、5、7が選択出来ます。

L2gradientについては、画像勾配の強度を求めるために、精度の高いL2ノルムを利用するか、高速なL1ノルムを利用するかを設定します。
デフォルトではL1ノルム(false)です。


それでは、実際にやってみましょう。

元画像です。


Imgproc.Canny(mat, dstMat, 50, 200);


Imgproc.Canny(mat, dstMat, 100, 200);


Imgproc.Canny(mat, dstMat, 100, 300);


Imgproc.Canny(mat, dstMat, 50, 200, 5);


Imgproc.Canny(mat, dstMat, 50, 200, 7);


Imgproc.Canny(mat, dstMat, 100, 200, 3, false);


Imgproc.Canny(mat, dstMat, 100, 200, 3, true);


ちなみに平滑化⇒Sobelで同じような結果になるんでしょうか?
Imgproc.GaussianBlur(mat, mat, new Size(3, 3), 0, 0);
Imgproc.Sobel(mat, dstMat, mat.type(), 1, 1, 5);


そう単純では無いようですねw


0 コメント:

コメントを投稿