2012年2月20日月曜日

画像を2値化する その1 - OpenCV for Android


画像を2値化するには、Imgproc.threshold()メソッドを使用します。

Imgproc.threshold(Mat src, Mat dst, double thresh, double maxval, int type)


 Mat src        処理したい元画像のMat
 Mat dst        変換後Mat
 double thresh     閾値
 double maxval     最大値
 int type        閾値処理の種類


typeについてはImgprocに以下定数が用意されています。


 THRESH_BINARY    閾値以下の値は0に,それ以外はmaxValに
 THRESH_BINARY_INV  閾値より大きい値は0に,それ以外はmaxValに
 THRESH_TRUNC     閾値より大きい値は閾値に,それ以外はそのままに
 THRESH_TOZERO    閾値より大きい値はそのままに,それ以外は0に
 THRESH_TOZERO_INV 閾値以下の値はそのままに,それ以外は0に


また、特殊な値として「THRESH_OTSU」というものもあります。
上記と組み合わせて使用し、その場合Otsuアルゴリズムとやらを使って最適な閾値を決定するため、threshは無効となります。
8bit画像にのみ有効なようです。


それでは実際にやってみましょう。
Imgproc.threshold(mat, mat, 100.0, 255.0,
  Imgproc.THRESH_BINARY);


∑(゚Д゚;)エーッ

ぜんぜん2値じゃないw
ということで、グレースケールに変換してから2値化してみます。
きっとそういうことです。


THRESH_OTSUを使って閾値を自動にします
Imgproc.threshold(mat, mat, 0.0, 255.0,
  Imgproc.THRESH_BINARY | Imgproc.THRESH_OTSU);


Imgproc.threshold(mat, mat, 0.0, 255.0,
  Imgproc.THRESH_BINARY_INV | Imgproc.THRESH_OTSU);  


Imgproc.threshold(mat, mat, 0.0, 255.0,
  Imgproc.THRESH_TRUNC | Imgproc.THRESH_OTSU);


Imgproc.threshold(mat, mat, 0.0, 255.0,
  Imgproc.THRESH_TOZERO | Imgproc.THRESH_OTSU);


Imgproc.threshold(mat, mat, 0.0, 255.0,
  Imgproc.THRESH_TOZERO_INV | Imgproc.THRESH_OTSU);



イソギンのワサワサ感が2値化された後でもたまらないですねぇ。


0 コメント:

コメントを投稿