画像処理の前処理として、画像の閾値処理(2値化)は非常に有効な手法です。閾値処理とは、指定した基準値(閾値)をもとにピクセル値を変換し、画像をシンプルにする処理です。
この記事では、cv2.threshold()の使い方と、5種類の閾値タイプの違いについて解説します。
閾値処理(2値化)のメリット
閾値処理を行う主なメリットは以下の通りです。
- 処理速度の向上: カラー画像より情報量が少ないため、後続の処理が高速化される
- 対象物の鮮明化: 情報量を削減することで、対象物がよりはっきりと映るようになり、解析の精度が向上する
一方で、閾値をどこに設定するかによって結果が大きく変わるため、閾値の決定が容易ではないという点に注意が必要です。
閾値処理の効果
以下の画像には数字が記載されていますが、暗い部分の数字は目視では確認しづらくなっています。

閾値処理を加えると、暗い部分に隠れていた数字(5、10など)も含め、すべての数字が鮮明に表示されます。

このように、閾値処理によって対象物をより鮮明にすることができます。
閾値処理(cv2.threshold())
OpenCVの閾値処理にはcv2.threshold()を使用します。
cv2.threshold(src, thresh, maxval, type[, dst])引数
| 引数 | 説明 |
|---|---|
| src | 入力画像 |
| thresh | 閾値 |
| maxval | THRESH_BINARYまたはTHRESH_BINARY_INV使用時の最大値 |
| type | 閾値タイプ |
threshで指定した値を基準に閾値判定が行われ、typeで指定したルールに従って各ピクセルの値が書き換えられます。
閾値処理の種類
typeには以下の種類があります。ここでは主要な5つを紹介します。
cv2.THRESH_BINARY
最もスタンダードな閾値処理です。thresh以上のピクセルはmaxvalに、それ以外は0に変換されます。
th, dst = cv2.threshold(src, 3, 255, cv2.THRESH_BINARY)
cv2.imshow("opencv-threshold-example.jpg", dst)
cv2.THRESH_BINARY_INV
THRESH_BINARYの逆です。thresh以下のピクセルはmaxvalに、それ以外は0に変換されます。
th, dst = cv2.threshold(src, 115, 255, cv2.THRESH_BINARY_INV)
cv2.imshow("opencv-thresh-binary-inv.jpg", dst)
色が反転していることが確認できます。
cv2.THRESH_TRUNC
thresh以上のピクセルはthreshの値に変換され、thresh以下のピクセルは元の値のまま保持されます。
cv2.THRESH_TRUNCではmaxvalを指定しても無視されます。
th, dst = cv2.threshold(src, 120, 255, cv2.THRESH_TRUNC)
cv2.imshow("opencv-thresh-trunc.jpg", dst)
cv2.THRESH_TOZERO
thresh以上のピクセルは元の値のまま、それ以外は0に変換されます。
th, dst = cv2.threshold(src, 120, 255, cv2.THRESH_TOZERO)
cv2.imshow("opencv-thresh-tozero.jpg", dst)
120以下の値を持つ数字が消えていることが確認できます。
cv2.THRESH_TOZERO_INV
THRESH_TOZEROの逆です。thresh以下のピクセルは元の値のまま、それ以外は0に変換されます。
th, dst = cv2.threshold(src, 120, 255, cv2.THRESH_TOZERO_INV)
cv2.imshow("opencv-thresh-to-zero-inv.jpg", dst)
THRESH_TOZEROとは逆に、120以下の数字が残っていることが確認できます。
まとめ
今回は、OpenCVの閾値処理(2値化)について紹介しました。
- 閾値処理には
cv2.threshold()を使用する threshを基準にピクセル値を変換し、画像をシンプル化する- 閾値タイプは用途に応じて使い分ける
THRESH_BINARY/THRESH_BINARY_INV: 2値化(白黒変換)THRESH_TRUNC: 上限値でカットTHRESH_TOZERO/THRESH_TOZERO_INV: 閾値以下/以上をゼロにする