2012年2月20日月曜日

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



引き続き画像を2値化です。
今回はImgproc.adaptiveThreshold()メソッドを使用してみます。

Imgproc.adaptiveThreshold(Mat src, Mat dst, double maxValue,
  int adaptiveMethod, int thresholdType, int blockSize, double C)

Mat src         処理したい元画像のMat
Mat dst          変換後Mat
double maxValue   条件を満たすピクセルに割り当てられる値
int adaptiveMethod  適応的閾値アルゴリズムの種類
int thresholdType   閾値処理の種類
int blockSize      閾値を算出するために使用する近傍領域のサイズ
double C        平均または加重平均から引かれる定数

はい、正直意味が分かりません。
この辺の知識経験の無さを実験でカバーするのがこのブログの趣旨なので気にしません。

ちなみに、blockSizeには2で割り切れない整数を利用します。
(偶数だと実行エラーとなります)

thresholdTypeについてはthreshold()のtypeに選択出来る定数の中の「THRESH_BINARY」か「THRESH_BINARY_INV」を選択出来ます。
adaptiveMethodについてはImgprocに以下定数が用意されています。

ADAPTIVE_THRESH_MEAN_C
閾値 T(x,y)は,(x,y)の近傍blockSize x blockSizeの平均からCを引いた値

ADAPTIVE_THRESH_GAUSSIAN_C
閾値 T(x,y)は,(x,y)の近傍blockSize x blockSizeの加重平均からCを引いた値

はい、やっぱり分かりませんね。

で在るが故に、実際にやってみましょう。
Imgproc.adaptiveThreshold(mat, mat, 255,
  Imgproc.ADAPTIVE_THRESH_MEAN_C,
  Imgproc.THRESH_BINARY, 7, 8);

Imgproc.adaptiveThreshold(mat, mat, 255,
  Imgproc.ADAPTIVE_THRESH_MEAN_C,
  Imgproc.THRESH_BINARY, 7, 2);

Imgproc.adaptiveThreshold(mat, mat, 255,
  Imgproc.ADAPTIVE_THRESH_GAUSSIAN_C,
  Imgproc.THRESH_BINARY, 7, 8);

Imgproc.adaptiveThreshold(mat, mat, 255,
  Imgproc.ADAPTIVE_THRESH_GAUSSIAN_C,
  Imgproc.THRESH_BINARY, 7, 2);


うーん。。あんまり差が分からないですね。

ちなみに版画みたいに見えるのはイソギンのせいです。
版画で画像検索すると似たようなのがたくさんhitして、だんだん版画にしか見えなくなってきました。




0 コメント:

コメントを投稿