Python

【OpenCV】閾値による画像の2値化処理

ここでは、画像の2値化処理についてまとめています。

 

画像の2値化とは?

画像の2値化と言うのは、「白黒画像」のことです。

以下の記事でグレースケールを紹介しました。
それぞれの画素の濃淡(強度)に応じて、「閾値」以下なら黒色それ以外なら白色
というように閾値処理を行います。

 

画像の2値化が行われていると、画像処理が高速に行うことができるため、
様々な実用シーンで利用されています。

 

OpenCV での 2値化処理(手動閾値)

それではさっそく、画像の2値化処理を行いましょう。
OpenCV では、標準APIである threshold() を使うことで簡単に実行できます。

ここでは、閾値を 100 として実行してみます。

  • 1~2行目:必要なパッケージを読み込みます
  • 4行目:元画像を読み込んでいます
  • 5行目:閾値を「100」として変数に格納しています
  • 6行目:threshold() API を使って、2値化処理を行います。戻り値は、閾値と2値化画像の配列です
  • 8~11行目:元の画像と2値化処理した画像を表示します
2値化処理結果

閾値100で2値化処理した結果

ポイント

元々白っぽい画像のため、全画素値の強度が閾値を上回っており、全白となってしまいました。

SANACHAN
SANACHAN
適切な閾値の設定方法を次節で紹介いたします。

 

OpenCV での 2値化処理(自動閾値)

閾値を手動で設定すると、上手くいかない場合が多そうです。

そこで、OpenCV では THRESH_OTSU というオプションが用意されており、
これを使うと、閾値を自動で計算して2値化処理を実行してくれます。

  • 5行目以外は、前述と同じです
  • 5行目:threshold() API に THRESH_OTSU を指定し、2値化処理を実行します
2値化処理(自動閾値)

自動閾値で2値化処理した結果

今回はうまく2値化処理することができました。

OpenCV の API threshold() の戻り値 ret に、自動演算された閾値が返ってきます。
サンプル画像の場合は「207.0」が格納されていました。

SANACHAN
SANACHAN
この数値はどこからきているのでしょうか?

 

自動計算された閾値は、元画像のヒストグラムを表示すると何となくわかります。

ヒストグラム_グレースケール

閾値には、全画素の中央値が使用されていそうですね。

参考

ヒストグラムの描き方は「【OpenCV】ヒストグラム均一化」をご覧ください。

 

OpenCV での近傍2値化処理

これまでの例で、2値化処理を行うことができるようになりました。
しかし、暗い部分は黒で塗りつぶされるため、モノの形が見えづらい部分もあるでしょう。

OpenCV では、adaptiveThreshold() という API を使用することで、
ある近傍領域の中で閾値を計算し、それぞれの領域で2値化処理を行うことができます。

  • 1~5行目、および8~11行目は前述と同じです
  • 6行目:adaptiveThreshold() を使用して、近傍領域での2値化処理を実行しています
adaptive_threshold

adaptiveThreshold の実行結果(左:自動閾値、右:近傍2値化)

OpenCV の adaptiveThreshold() で 2値化した画像では、
影の部分もきれいに2値化できていることが分かります。

 

こちらの記事もよく読まれています

  • この記事を書いた人
  • 最新記事
SANACHAN

SANACHAN

「生涯一エンジニア」を掲げ、大手グローバル企業でSE/PGとして8年勤め、キャリアアップ転職した現役のエンジニアです。世にあるメジャーな全プログラム言語(コボル除く)を自由に扱えます。一児の父。自分のため、家族のため、日々勉強してます。システムエンジニア、プログラミングに関する情報を蓄積している雑記帳です。

-Python
-,