2014年1月19日日曜日

Android OpenCV ぼかし

Android OpenCV ぼかし

Android-OpenCV 輪郭抽出(2) のおまけ
OpenCVで輪郭を抽出するときノイズなどが入ってしまい期待しているような輪郭が得られない場合があります。

画像をぼかすことでノイズの影響を減らすことができます。

画像をぼかす(平滑化)には以下の関数(OpenCVリファレンスを参考)

Imgproc.GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX, double sigmaY)
  • src – 入力画像.
  • dstsrc と同じサイズ,同じ型の出力画像.
  • ksize – ガウシアンカーネルサイズ. ksize.widthksize.height は別の値を取ることができますが,両方とも正の奇数でなければいけません.または 0 をとることも可能で,その場合のサイズは sigma* から算出されます.
  • sigmaY (sigmaX,) – ガウシアンカーネルの,XとY方向の標準偏差. sigmaY が 0 ならば, sigmaX と等しくなるようにセットされます.両方の値が 0 の場合は,それぞれ ksize.widthksize.height から求められます. getGaussianKernel() を参照してください.将来これらの引数の意味が変更されたとしても,それに関係なく結果を完全に制御するために, ksize , sigmaX および sigmaY のすべての値を指定することが推奨されます.
  • borderType – ピクセル外挿手法. borderInterpolate() を参照してください.

  • .Imgproc.medianBlur(Mat src, Mat dst, int ksize)
  • src – 1-, 3- あるいは 4-チャンネルの入力画像. ksize が 3 または 5 ならば,この画像のビット深度は CV_8U , CV_16U または CV_32F となります.それ以上のアパーチャサイズの場合は CV_8U だけが可能です.
  • dstsrc と同じサイズ,同じ型の出力画像.
  • ksize – アパーチャサイズ.1より大きな奇数,例えば 3, 5, 7 ... でなければいけません.

  • Imgproc.boxFilter(Mat src, Mat dst, int ddepth, Size ksize, Point anchor, boolean normalize, int borderType)
    • src – 入力画像.
    • dstsrc と同じサイズ,同じ型の出力画像.
    • ksize – 平滑化カーネルのサイズ.
    • anchor – アンカー点.デフォルト値の Point(-1,-1) は,アンカーがカーネル中心にあることを意味します.
    • normalize – カーネルが面積で正規化されているか否かを指定します.
    • borderType – 画像外のピクセルを外挿するために利用される境界モード.


    のいずれかを使うことでできます。


    /*------------------------------------------------------------------------------------

    Mat src;
    Mat dst;

    Imgproc.GaussianBlur( src,  dst, new Size(5,3), 6, 4);

    Mat image = dst;
    List<MatOfPoint> contours;
    Mat hierarchy;

    Imgproc.findContours( image,  contours,  hierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_TC89_L1);

    --------------------------------------------------------------------------------------------------*/

    これでノイズを軽減した画像から輪郭の抽出ができます。精度が上がりますが処理が多くなるので場合によって使い分けるほうがいいのかもしれません。

    0 件のコメント:

    コメントを投稿