Misakichi’s ログblog

好きなものを紹介したり備忘録のため

pythonのscikit-imageで動的閾値処理(画像処理)

実験で得られた画像データに対して粒子統計を行いたいとき(ex:ナノ粉末のSEM像から平均粒径導出したり*)、
まず二値化を行って、粒子の存在する位置を認識させなくてはいけないと思います。
今回はその二値化の話
私はプログラムの専門家でも、画像処理の専門家でもないため話半分にきいてください。
(またどこか間違ってたらお知らせください)


ノイズが完全にランダムな画像だと話は簡単なのですが、
たとえば下の画像のように左下が暗くて、右上にいくにつれ明るくなっていくようなバックグラウンドが存在する場合
普通の二値化ではこのようになってしまいます・・・
f:id:Misaki_yuyyuyu:20170304184031p:plain
要は全体のバックグラウンド平均を求めて、それを基準に二値化してしまうのがいけないので、
局所的なバックグラウンド平均を認識して、二値化を場所場所で行おうというのが動的閾値処理(Dynamic Threshold, DT)の精神みたいです

動的閾値処理に便利なモジュールがskimage.filterのthreshold_adaptiveというやつ
下にDTコードを示します。このpyファイルと同じフォルダに画像ファイルを入れ、実行

で結果がこれ 一番右がDT
f:id:Misaki_yuyyuyu:20170304185444p:plain
実質画像処理してる部分のコードは
adaptive_cut = skif.threshold_adaptive(img, block_size, offset=0)
の一行・・・ これでいいのかという感じですけど、これでいいのだ(完)


一方、粒子統計に転用できそうなコードは以下

f:id:Misaki_yuyyuyu:20170304185855p:plain


自分の研究では当分使わないと思うけど、こういうこともできるんだな~


数独の画像は
画像のしきい値処理 — OpenCV-Python Tutorials 1 documentation
から引っ張ってきました。)
*: これは通常、粉末XRDの結果から導出する方法が一般的だと思いますが・・・