微分画像・エッジ画像を求める(Canny)

『エッジ画像を求める』メソッドには、Sobel,Laplacian,Cannyの3種類があります。最後のCannyが出力する画像はドキュメントによれば、他の2つとは異なり勾配画像では無く. エッジか,そうでないかの二値画像となると書いています。
static void Canny(Mat image, Mat edges, double threshold1, double threshold2)
static void Canny(Mat image, Mat edges, double threshold1, double threshold2, int apertureSize)
static void Canny(Mat image, Mat edges, double threshold1, double threshold2, int apertureSize, boolean L2gradient)
Mat image : 処理する8ビット,シングルチャンネルの入力画像。
Mat edges : 出力されるエッジの画像。 
double threshold1,double threshold2 : 閾値1・2 
 小さい方の値がエッジの接続に利用され、大きい方の値が明確なエッジの初期セグメントを検出するのに利用されます。
 詳しくは ここを参照してください。
int apertureSize : sobel演算用の領域のサイズ。3、5、7が選択出来ます。(デフォルト3)
boolean L2gradient : L2ノルム利用有無
 画像勾配の強度を求めるために、精度の高いL2ノルムを利用するか、高速なL1ノルムを利用するかを設定します。
 デフォルトではL1ノルム(false)です。

 実行結果 

閾値の小さな値のほうを変えてみます。
上段:元画像 本を撮影した画像を透視変換したもの sobelと同じ
中段:Imgproc.Canny(mat1, mat2, 100, 200);
下段:Imgproc.Canny(mat1, mat3, 25, 200);
あまり違いがわかりません。両方とも黒石は円 白石は2重の円になっているように見えます。(白石はエッジが2回発生する) 



閾値の大きな値のほうを変えてみます。
上段:元画像
中段:Imgproc.Canny(mat1, mat2, 25, 200);
下段:Imgproc.Canny(mat1, mat3, 25, 100);
大きな値を小さくすると 細かな変化もエッジとして拾っています(右側に注目)。

apertureSizeを変えてみます。
上段:元画像
中段: Imgproc.Canny(mat1, mat2, 25, 200, 3);
下段: Imgproc.Canny(mat1, mat3, 25, 200, 7);
apertureSizeを大きくすると全体がエッジと見られた??(笑い)全体的に白っぽい。

L2gradientを変えてみます。
上段:元画像
中段: Imgproc.Canny(mat1, mat2, 25, 200, 3, false);
下段: Imgproc.Canny(mat1, mat3, 25, 200, 3, true);
あまり差は見受けられませんが、右側の線(ページ部分)に差があります。

 by Android2.2 with OpenCv 2.3.1 for Android   
スポンサーリンク
Rectangle大広告
Rectangle大広告

シェアする

  • このエントリーをはてなブックマークに追加

フォローする