Python版OpenCV(cv2.threshold)で大津の手法(判別分析法)を実装し、画像を二値化する方法をソースコード付きで解説します。
大津の手法とは
本ページの内容は以下動画で解説しています。
大津の手法(判別分析法)は、自動的に閾値を決定して二値化処理を行う手法の1つです。
この手法では、分離度が最も大きくなるときの閾値を求めます。(詳細は下記ページ参照)
【画像処理】大津の二値化処理の原理・特徴・計算式
画像処理における大津の手法(判別分析法)を用いた二値化処理の原理や計算式についてまとめました。
今回は、Python言語で以下の2通りの方法で処理を実装してみました。
方法①・・・cv2.thresholdで簡単に実装(1行で書けちゃうので楽チン)
方法②・・・NumPyで大津のアルゴリズムを書いて実装
書式
ret, dst = cv2.threshold(src, threshold, max_value, threshold_type)
パラメータ名 | 説明 |
---|---|
src | 入力画像(グレースケール) |
threshold | 閾値(大津の手法を使う場合は自動で設定してくれるので0) |
max_value | 二値化したときの最大値(真っ白にするなら255) |
threshold_type | 使用する二値化手法(大津ならcv2.THRESH_OTSUを指定) |
dst | 出力画像 |
サンプルコード①OpenCVで実装
OpenCVで大津の手法を実装した場合のサンプルプログラムのソースコードです。
サンプルコード②NumPyで実装
NumPyで大津の手法を実装した場合のサンプルプログラムのソースコードです。
ポイント
クラス間分散の分子が最大ならば、分離度も最大になります。
よって、計算高速化のためにクラス間分散の分子のみを計算して比較しています。
実行結果
サンプルプログラムの実行結果です。
■入力画像(左)と出力画像(右)
→
関連ページ
【Python版OpenCV超入門】使い方とサンプルコードを解説
Python版OpenCVで画像処理プログラミングを行う方法を入門者向けにソースコード付きで解説するページです。
コメント
実装,参考にさせていただきます.
方法①の最後の部分,間違ってませんか?
>>gray[gray=t] = max_value
ここは
gray[gray>t] = max_value
gray[gray<=t] = min_value
などとしないと二値化されないように思えます.
※匿名様
コメントありがとうございます。
ご指摘いただいた通り、誤りでしたので修正しました。
方法①のコードを実行した結果
s = n1 * n2 * (mu1 – mu2) ** 2
で「overflow encountered in long_scalars」と出ており、オーバーフローを起こしてるようです。