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)サンプルコード -)
を並べてみると、
こんな感じになります。
今回作成した2値画像のレナさんは、なんか怖そうな顔になってます...
コーディングが下手でこんな顔にしちゃってゴメンね。
いつかまた、コードを修正してきれいに2値化するよ...!