6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

OpenCV(C++)で指定範囲部分だけ二値化

Last updated at Posted at 2019-08-01

#はじめに
OpenCV(C++)で二値化を何気なく行っていたが,今更自分の理解が間違っていたことに気づいた.
そこで,もしかしたら他の人も勘違いしているのかもと思って,参考になればなと思う.

#Threshold関数
二値化を行うのに用いるThreshold関数.
ドキュメントにはこう書かれている.


double threshold(const Mat& src, Mat& dst, double thresh, double maxVal, int thresholdType)

配列の要素に対して,ある定数での閾値処理を行います.

パラメタ:	
src  入力配列(シングルチャンネル,8ビット,あるいは32ビット浮動小数点型).
dst  src と同じサイズ,同じタイプの出力配列.
thresh  閾値.
maxVal  閾値処理の種類が THRESH_BINARY  THRESH_BINARY_INV の場合に利用される,最大値の値.
thresholdType  閾値処理の種類.

公式ドキュメント: Threshold関数

ここで,私はthreshの値〜maxValの値までの範囲を抽出すると思っていた.
つまり,下記のように書くと120〜140の間の部分のみが抽出ができると思っていた.


double threshold(const Mat& src, Mat& dst, double 120, double 140, THRESH_BINARY)

miss.png

だが,実際は,120〜255の間の画素を抽出し,抽出した画素を140の明るさで画像を生成,dstに入れ込む,というものであった.

指定範囲(上記の例の場合,120〜140)だけを2値化したい

120〜140の部分を抽出する場合の関数を作ってみた.

Mat Binarization(Mat input, int low, int high){
  Mat thresh_1, thresh_2, output;

  threshold(input, thresh_1, low, 255, CV_THRESH_BINARY);       // binalized
  threshold(input, thresh_2, high, 255, CV_THRESH_BINARY_INV);  // binalized
  bitwise_and(thresh_1, thresh_2, output);                      // and演算

  return output;
}
  • 引数
    • input:入力画像(グレースケール化された画像)
    • low:低閾値(上記の例の場合,120)
    • high:高閾値(上記の例の場合,140)
  • 返り値
    • output:(二値化されたMat型の画像)

終わりに

いかがでしたか.
自分のような勘違いをしている人は少ないかもしれませんが,少しでもお役に立てればと思います.
また,何か間違いがあれば,コメントなどでお知らせいただければ幸いです.

6
3
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?