【Python/OpenCV】大津の手法で二値化処理

Python版OpenCV(cv2.threshold)もしくはNumPyで大津の手法(判別分析法)を実装し、画像を二値化する方法をソースコード付きで解説します。

【はじめに】大津の手法とは

大津の手法(判別分析法)は、自動的に閾値を決定して二値化処理を行う手法の1つです。
この手法では、分離度が最も大きくなるときの閾値を求めます。(詳細は下記ページ参照)

関連記事
原理はこちら 大津の二値化処理の原理

今回は、Python言語で以下の2通りの方法で処理を実装してみました。

説明
方法① NumPyで大津のアルゴリズムを書いて実装
方法② cv2.thresholdで簡単に実装(1行で書けちゃうので楽チン)

動画解説版

書式

ret, dst = cv2.threshold(src, threshold, max_value, threshold_type)
パラメータ名 説明
src 入力画像(グレースケール)
threshold 閾値(大津の手法を使う場合は自動で設定してくれるので0)
max_value 二値化したときの最大値(真っ白にするなら255)
threshold_type 使用する二値化手法(大津ならcv2.THRESH_OTSUを指定)
dst 出力画像

【サンプルコード】Python3 + OpenCV

サンプルプログラムのソースコードです。

方法①


方法②


ポイント

クラス間分散の分子が最大ならば、分離度も最大になります。
よって、計算高速化のためにクラス間分散の分子のみを計算して比較しています。

実行結果

サンプルプログラムの実行結果です。

■入力画像(左)と出力画像(右)

【PythonでOpenCV入門】使い方とサンプル集
OpenCV(Intel Open Source Computer Vision Library)とは、インテル社で開発された画像処理・画像認識用のオープンソースライブラリです。Python/C++/Java/Android/Node.js...

コメント

  1. 匿名 より:

    実装,参考にさせていただきます.
    方法①の最後の部分,間違ってませんか?
    >>gray[gray=t] = max_value
    ここは
    gray[gray>t] = max_value
    gray[gray<=t] = min_value
    などとしないと二値化されないように思えます.

    • 管理人 より:

      ※匿名様
      コメントありがとうございます。
      ご指摘いただいた通り、誤りでしたので修正しました。

  2. 匿名より より:

    方法①のコードを実行した結果
    s = n1 * n2 * (mu1 – mu2) ** 2

    で「overflow encountered in long_scalars」と出ており、オーバーフローを起こしてるようです。