OpenCV 4.13.0
Open Source Computer Vision
読み込み中...
検索中...
見つかりません
🤖 AIによる機械翻訳(非公式) — これは OpenCV 4.13.0 公式リファレンス(英語)を AI (Claude) で自動翻訳したものです。訳に誤りを含む場合があります。正確な情報は 公式英語版(原文) を参照してください。
基本的なしきい値処理

前のチュートリアル: 画像ピラミッド
次のチュートリアル: inRangeを用いたしきい値処理

原著者Ana Huamán
互換性OpenCV >= 3.0

目的

このチュートリアルでは、以下の方法を学ぶ:

  • OpenCVの関数cv::thresholdを用いて基本的なしきい値処理を実行する

理論

覚え書き
以下の説明はBradskiとKaehlerによる書籍Learning OpenCVに基づいている。それでは

しきい値処理とは?

  • 最も単純なセグメンテーション(領域分割)手法
  • 応用例: 解析したい対象物に対応する画像の領域を分離する。この分離は、対象物のピクセルと背景のピクセルとの間の輝度の差に基づく。
  • 対象とするピクセルをそれ以外(最終的に除外されるもの)と区別するために、各ピクセルの輝度値をしきい値(解決すべき問題に応じて決定される)と比較する。
  • 重要なピクセルを適切に分離できたら、それらを識別するために特定の値を設定できる(すなわち、\(0\)(黒)、\(255\)(白)、または用途に適した任意の値を割り当てられる)。

しきい値処理の種類

  • OpenCVは、しきい値処理を実行するための関数cv::thresholdを提供する。
  • この関数では\(5\)種類のしきい値処理を行える。それらを以下のサブセクションで説明する。
  • これらのしきい値処理がどのように動作するかを説明するため、強度値 \(src(x,y)\) を持つピクセルからなる入力画像があるとする。下のプロットはこれを示している。水平な青い線はしきい値 \(thresh\) (固定)を表す。

2値化しきい値処理 (Threshold Binary)

  • このしきい値処理は次のように表せる。

    \[\texttt{dst} (x,y) = \fork{\texttt{maxVal}}{if \(\texttt{src}(x,y) > \texttt{thresh}\)}{0}{otherwise}\]

  • つまり、ピクセル \(src(x,y)\) の強度が \(thresh\) より大きければ、新しいピクセル強度は \(MaxVal\) に設定される。それ以外の場合、ピクセルは \(0\) に設定される。

反転2値化しきい値処理 (Threshold Binary, Inverted)

  • このしきい値処理は次のように表せる。

    \[\texttt{dst} (x,y) = \fork{0}{if \(\texttt{src}(x,y) > \texttt{thresh}\)}{\texttt{maxVal}}{otherwise}\]

  • ピクセル \(src(x,y)\) の強度が \(thresh\) より大きければ、新しいピクセル強度は \(0\) に設定される。それ以外の場合は \(MaxVal\) に設定される。

切り捨て (Truncate)

  • このしきい値処理は次のように表せる。

    \[\texttt{dst} (x,y) = \fork{\texttt{threshold}}{if \(\texttt{src}(x,y) > \texttt{thresh}\)}{\texttt{src}(x,y)}{otherwise}\]

  • ピクセルの最大強度値は \(thresh\) であり、\(src(x,y)\) がそれより大きければその値は切り捨てられる。下の図を参照。

0へのしきい値処理 (Threshold to Zero)

  • この処理は次のように表せる。

    \[\texttt{dst} (x,y) = \fork{\texttt{src}(x,y)}{if \(\texttt{src}(x,y) > \texttt{thresh}\)}{0}{otherwise}\]

  • \(src(x,y)\) が \(thresh\) より小さければ、新しいピクセル値は \(0\) に設定される。

反転0へのしきい値処理 (Threshold to Zero, Inverted)

  • この処理は次のように表せる。

    \[\texttt{dst} (x,y) = \fork{0}{if \(\texttt{src}(x,y) > \texttt{thresh}\)}{\texttt{src}(x,y)}{otherwise}\]

  • \(src(x,y)\) が \(thresh\) より大きければ、新しいピクセル値は \(0\) に設定される。

コード

解説

プログラムの全体的な構造を確認しよう:

  • 画像を読み込む。BGRであればグレースケールに変換する。これには関数 cv::cvtColor を使えることを思い出そう。
  • 結果を表示するウィンドウを作成する。
  • Create \(2\) trackbars for the user to enter user input:
    • しきい値処理の種類: 2値化、0へのしきい値処理など...
    • しきい値
  • ユーザがしきい値としきい値処理の種類を入力するまで(またはプログラムが終了するまで)待機する。
  • ユーザがいずれかのトラックバーの値を変更するたびに、関数 Threshold_Demo (Javaでは update)が呼び出される。

ご覧のとおり、関数 cv::threshold が呼び出される。C++コードでは \(5\) 個の引数を与える。

  • src_gray: 入力画像
  • dst: 出力先(出力)画像
  • threshold_value: しきい値処理を行う基準となる \(thresh\) の値
  • max_BINARY_value: 2値化しきい値処理で使用する値(選択されたピクセルに設定する値)
  • threshold_type: \(5\) 種類のしきい値処理のいずれか。これらは上記の関数のコメント部分に列挙されている。

結果

  1. このプログラムをコンパイルした後、画像へのパスを引数として与えて実行する。例えば、次のような入力画像に対して実行する。
  1. まず、反転2値化しきい値処理で画像をしきい値処理してみる。\(thresh\) より明るいピクセルは暗くなることが予想され、実際にそのようになる。これは下のスナップショットで確認できる(元画像では犬の舌と目が画像の他の部分と比べて特に明るいことに注目すると、それが出力画像に反映されている)。
  1. 次に0へのしきい値処理を試す。これにより、最も暗いピクセル(しきい値未満)は完全に黒くなり、しきい値より大きい値を持つピクセルは元の値を保つことが予想される。これは出力画像の次のスナップショットで確認できる。