ITや趣味など気軽に投稿しています。

【Python】OpenCVで画像の閾値処理(2値化)をする

画像処理の前処理として、画像の閾値処理(2値化)は非常に有効な手法です。閾値処理とは、指定した基準値(閾値)をもとにピクセル値を変換し、画像をシンプルにする処理です。

この記事では、cv2.threshold()の使い方と、5種類の閾値タイプの違いについて解説します。

閾値処理(2値化)のメリット

閾値処理を行う主なメリットは以下の通りです。

  • 処理速度の向上: カラー画像より情報量が少ないため、後続の処理が高速化される
  • 対象物の鮮明化: 情報量を削減することで、対象物がよりはっきりと映るようになり、解析の精度が向上する

一方で、閾値をどこに設定するかによって結果が大きく変わるため、閾値の決定が容易ではないという点に注意が必要です。

閾値処理の効果

以下の画像には数字が記載されていますが、暗い部分の数字は目視では確認しづらくなっています。

閾値処理前

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

閾値処理後

このように、閾値処理によって対象物をより鮮明にすることができます。

閾値処理(cv2.threshold())

OpenCVの閾値処理にはcv2.threshold()を使用します。

cv2.threshold(src, thresh, maxval, type[, dst])

引数

引数説明
src入力画像
thresh閾値
maxvalTHRESH_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

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_BINARY_INV

色が反転していることが確認できます。

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_TRUNC

cv2.THRESH_TOZERO

thresh以上のピクセルは元の値のまま、それ以外は0に変換されます。

th, dst = cv2.threshold(src, 120, 255, cv2.THRESH_TOZERO)
cv2.imshow("opencv-thresh-tozero.jpg", dst)
cv2.THRESH_TOZERO

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)
cv2.THRESH_TOZERO_INV

THRESH_TOZEROとは逆に、120以下の数字が残っていることが確認できます。

まとめ

今回は、OpenCVの閾値処理(2値化)について紹介しました。

  • 閾値処理にはcv2.threshold()を使用する
  • threshを基準にピクセル値を変換し、画像をシンプル化する
  • 閾値タイプは用途に応じて使い分ける
  • THRESH_BINARY / THRESH_BINARY_INV: 2値化(白黒変換)
  • THRESH_TRUNC: 上限値でカット
  • THRESH_TOZERO / THRESH_TOZERO_INV: 閾値以下/以上をゼロにする