続いて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