読者です 読者をやめる 読者になる 読者になる

Tips by yumatsuge

Computer Scienceを勉強する大学4年生.Python、Chainer、Deep learning、機械学習、人工知能やubuntuの備忘録

Python(Numpy)で大津の2値化(Otsu method)を実装してみた。

前回の予告通り、Python(Numpy)で大津の2値化を実装してみました。

 

大津の2値化は2値化手法の1つで、統計的な観点から2値化を行うための

閾値を決定しているため、

直感的でわかりやすいうえに、けっこうきれいに

2値化できる手法らしいです。

OpenCVにも実装されていている手法です。

opencv.jp - OpenCV: フィルタと色変換(Filters and Color Conversion)サンプルコード -

 

OpenCVで1行で実装できますが、

今回は1年ほど前にNumpyを使わずに実装していたコードがあったので、

Numpyとリスト内包表記をつかって書き換えてみました。

 

大津の2値化の閾値を算出する過程、式は以下のサイトを参考にしました。

判別分析法(大津の二値化) 画像処理ソリューション

大津の二値化処理アルゴリズム

 

せっかく今回もJupyterを使って実装したので、

計算式をJupyterに書いておけばよかったかなと少し後悔していますが、

以下にソースコードを載せました。

 

前半で関数を定義していって、後半で4枚ほど画像を処理しています。

それぞれの出力画像において、

元画像、グレースケール画像、大津の手法、輝度値128の閾値で2値化

で4枚横に並べて出力しています。

ヒストグラムには、大津の手法によって得られた閾値を赤色、

輝度値128の閾値を緑色で縦に線を引いています。

 

大津の2値化(Otsu method)をPython(Numpy)を使って実装

 

結果的に、正しく実装できていない気がします。

 

処理する前の画像、実装した手法で2値化した画像、

OpenCVによって2値化された画像(cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU) : opencv.jp - OpenCV: フィルタと色変換(Filters and Color Conversion)サンプルコード -)

を並べてみると、

こんな感じになります。

 

f:id:yumatsuge:20160812222138j:plain

 

今回作成した2値画像のレナさんは、なんか怖そうな顔になってます...

 

コーディングが下手でこんな顔にしちゃってゴメンね。

いつかまた、コードを修正してきれいに2値化するよ...!