Python初心者がScikit-imageの例題を自分用に使うためのヒント3　ファイルに書き込む


[Python初心者がScikit-imageの例題を自分用に使うためのヒント](http://qiita.com/nonbiri15/items/ae1c51abd65faf27d99f)

[Python初心者がScikit-imageの例題を自分用に使うためのヒント2　複数のファイルを処理する](http://qiita.com/nonbiri15/items/f50857dc555064134db6)

に続いて、[Scikit-image](http://scikit-image.org/)の例題を、ほんの少しだけ改変して、遊んでみるために、Python初心者向けの内容を書いてみます。

引き続き [Normalized Cut](http://scikit-image.org/docs/dev/auto_examples/segmentation/plot_ncut.html#normalized-cut) 


![sphx_glr_plot_ncut_001.png](https://qiita-image-store.s3.amazonaws.com/0/83761/a9d934ce-c89b-9f9e-4c3a-ae314a3e7139.png)

を例題にとりあげます。

[Python初心者がScikit-imageの例題を自分用に使うためのヒント2　複数のファイルを処理する]では、さまざまな画像に対して処理することができました。

ただ、今のままでは結果がファイルに保存できていないため不満を感じることかと思います。


そこで、ファイルに保存するためのヒントを示したいと思います。
###**OpenCV-Pythonによる画像保存**
cv2.imwrite("out.png", img)
[OpenCV-Python Tutorials >> Getting Started with Images](http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_gui/py_image_display/py_image_display.html#py-display-image)
###**連番ファイルでの画像保存**

```.py:
for  i in range(len(names)):
    img = cv2.imread(names[i])
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    oname = "gray_%04d.png"  % i
    cv2.imwrite(oname, gray)
```


C言語のprinft()/sprinft()/fprintf() の書式設定に相当する機能は
[Python 標準ライブラリ / 文字列フォーマット操作](http://docs.python.jp/2.7/library/stdtypes.html#string-formatting)
にあります。


###**ディレクトリやファイル名に関する操作**
os.path.dirname()
os.path.basename()
os.path.splitext()
os.path.join()

[Python 標準ライブラリ / os.path — 共通のパス名操作]（http://docs.python.jp/2.7/library/os.path.html）


出力先のディレクトリodirがない場合には、
次のようにしてディレクトリを作成するのが常套手段です。

```.py:
if not os.path.isdir(odir):
    os.makedirs(odir)
```

[Python 標準ライブラリ / os — 雑多なオペレーティングシステムインタフェース](http://docs.python.jp/2.7/library/os.html)
> os.makedirs(path[, mode]) 再帰的なディレクトリ作成関数です。 mkdir() に似ていますが、末端 (leaf) となるディレクトリを作成するために必要な中間の全てのディレクトリを作成します。


oname = os.path.join(odir, "img_%05d.png" % i)
のようにして出力ファイル名に出力ディレクトリを含めれば、
スクリプトの実行ディレクトリとは別のディレクトリに出力することができます。

###**文字列の置換に関する操作**
出力ファイル名は入力ファイル名から置換機能で生成することもできます。
文字列にはreplace()メソッドがあり、戻り値として置換後の文字列を返します。
replace(old, new[, count])
[Python 標準ライブラリ / 文字列メソッド](http://docs.python.jp/2.5/lib/string-methods.html)


こういった機能を使って、出力先のファイル名を自在に設定することができます。


###**課題：**
[「ヒント：for name in glob.glob("*.jpg"):を使って複数のファイルに対して処理してみよう。」](http://qiita.com/nonbiri15/items/f50857dc555064134db6)
に示した例題を元に、結果をファイルに保存するようにしてみましょう。
条件：出力先のディレクトリ"out"を作って、そこにファイルを保存する。
条件："image.jpg"という入力に対して、"out/image_ncut.png"というファイル名で保存する。

ここまでに示したヒントで、コーディングできるはずです。
OpenCV-Python, scikit-image, scikit-learn のライブラリをPythonの初心者であっても楽しみましょう。


###**付記：**
・Pythonでディレクトリの区切りを記述するときにはWindowsであっても"abc/def.txt"のように"/"文字を使うことができます。
・"\"での区切り文字を使いたい場合には, name = r"abc\def.txt"のように""の前にrという記号をつけると便利です。その場合にはname = "abc\\\def.txt"と書かなくてすみます("\"文字を２つ書いています)。


### Python3では
https://docs.python.jp/3/library/pathlib.html
を使うのがよいようです。


```.py:
# -*- coding: utf-8 -*-
# pylint: disable=C0103
import pathlib
from skimage import io, segmentation, color
from skimage.future import graph

def plotNcut(img):
    """
    img: color img

    """

    labels1 = segmentation.slic(img, compactness=30, n_segments=400)
    g = graph.rag_mean_color(img, labels1, mode='similarity')
    labels2 = graph.cut_normalized(labels1, g)
    return color.label2rgb(labels2, img, kind='avg'), labels2

if __name__ == "__main__":
    oDir = pathlib.Path("out")
    if not oDir.is_dir():
       oDir.mkdir() 
    for p in pathlib.Path("../images").glob("*.png"):
        print(p)
        
        oname = oDir.joinpath(p.with_suffix(".jpg").name)
        img = io.imread(p)
        out, _ = plotNcut(img)
        io.imsave(str(oname), out)
        print(oname)
```


[ヒント４GUIを使う](http://qiita.com/nonbiri15/items/1e1a1cf668c84178405e)