#背景
金属の表面をよく磨いて適切に腐食処理すると以下のような金属組織を観察することができる。
[引用元:http://www.iri.pref.niigata.jp/topics/H29/29kin20.html]
太い線のようなものが『結晶粒界』、結晶粒界に囲まれた領域が『結晶粒』である。結晶粒の大きさはその金属の作られた過程(加熱温度等)により変化する。金属を売ることを生業にしている人たちは、この結晶粒の大きさが適切に制御されていることを保証しなければならない。出荷前には顕微鏡で金属を観察し、結晶粒の大きさを計測する必要がある。
どのようにして大きさを計測するのか。やり方の一つにクロスセクション法と呼ばれる以下の方法がある。
[クロスセクション法]
① 縦・横・斜め2方向に同じ長さの線を引く。
② 結晶粒界との交点の数を数え上げる。
③ 縦に引いた線と結晶粒界の交点の数を数える。
④ 線の長さ(150㎛)を交点の数で割る。これにより、結晶粒の縦方向の大きさの平均が出る。
⑤ ③④の流れを横と斜め2方向の線に対して行う。
以上の作業により結晶粒の縦横斜め方向の径の平均が算出される。ただ、実際には莫大な数の製品に対して莫大な部位の写真を調べる必要があり、これを毎回人の手でやるのは非常に困難である。
#やりたいこと
上述の写真を入力画像とし、クロスセクション法による処理を経て、縦横斜め方向の結晶粒の大きさの平均を算出するプログラムを組む。Python3.0 + OpenCVで実装する。
#やってみたこと
とりあえず二値化+ノイズ処理してみる。適切に粒界だけ取り出せればあとの作業は何も難しくない。
img=cv2.imread("29kin20.jpg")
gray=cv2.cvtColor(img,cv2.COLOR_RGB2GRAY) #グレイスケール化
ret, th2=cv2.threshold(gray,0,255,cv2.THRESH_OTSU) #大津法で二値化
mask=cv2.medianBlur(th2,3) #ノイズ除去
#課題
①結晶粒内のポツポツは判定のノイズなので消したい。medianBlurでは消しきることが出来なかったので他の方法を探す必要あり。
②切れている結晶粒界は可能な限りつなげたい。点線を実線にするアルゴリズムとか落ちてないだろうか。
今日はここまで。