それでは,上のコードを用いて,画像のセグメンテーションをしてみましょう.
基本的にはchanvase.py を実行すれば可能なのですが,convergenceの関数のところで,以下のように修正しました.
基本的にはchanvase.py を実行すれば可能なのですが,convergenceの関数のところで,以下のように修正しました.
# Convergence Test def convergence(p_mask, n_mask, thresh, c): diff = np.array(p_mask.astype(np.int)) - np.array(n_mask.astype(np.int)) ## modified n_diff = np.sum(np.abs(diff)) if n_diff < thresh: c = c + 1 else: c = 0 return c
コードサンプル (上のサイトから少し修正).py
もし,パッケージなどでエラーがあれば,以下のようにパッケージをインストールしてみてください.私は,scipy の方で
ImportError: dlopen(/usr/local/lib/python2.7/site-packages/scipy/special/_ufuncs.so, 2): Library not loaded: /usr/local/opt/gcc/lib/gcc/5/libquadmath.0.dylib Referenced from: /usr/local/lib/python2.7/site-packages/scipy/special/_ufuncs.so Reason: image not found
Error1
のようなエラーがあったので,以下の方法で対処しました.
sudo pip install --upgrade --force-reinstall scipy
solve
実行結果
python chanvese.py iteration: 0 iteration: 50 iteration: 100 iteration: 150 iteration: 200 iteration: 250 iteration: 300 iteration: 350 iteration: 400 iteration: 450 iteration: 500 iteration: 550 iteration: 600 iteration: 650 iteration: 700 iteration: 750 iteration: 800 iteration: 850 iteration: 900 iteration: 950
update
via github.com
うまく動いているようですね!
Rice 画像のセグメンテーション
それでは,別の画像でSegmentation を行ってみましょう.
今回使うのはImageJのサンプルの,Rice 画像です.
今回使うのはImageJのサンプルの,Rice 画像です.
コードを以下のように変更して,セグメンテーションを行います.
if __name__ == "__main__": img = nd.imread('./../rice.png', flatten=True) mask = np.zeros(img.shape) shp = img.shape mask[30:shp[0]-30, 30:shp[1]-30] = 1 ##modified chanvese(img, mask, max_its=1000, display=True, alpha=1.0)
コードサンプル.py