Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

Python初心者がScikit-imageの例題を自分用に使うためのヒント

Python初心者がScikit-imageの例題を自分用に使うためのヒント2 複数のファイルを処理する

に続いて、Scikit-imageの例題を、ほんの少しだけ改変して、遊んでみるために、Python初心者向けの内容を書いてみます。

引き続き Normalized Cut

sphx_glr_plot_ncut_001.png

を例題にとりあげます。

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

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

そこで、ファイルに保存するためのヒントを示したいと思います。

OpenCV-Pythonによる画像保存

cv2.imwrite("out.png", img)
OpenCV-Python Tutorials >> Getting Started with Images

連番ファイルでの画像保存

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 標準ライブラリ / 文字列フォーマット操作
にあります。

ディレクトリやファイル名に関する操作

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がない場合には、
次のようにしてディレクトリを作成するのが常套手段です。

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

Python 標準ライブラリ / os — 雑多なオペレーティングシステムインタフェース

os.makedirs(path[, mode]) 再帰的なディレクトリ作成関数です。 mkdir() に似ていますが、末端 (leaf) となるディレクトリを作成するために必要な中間の全てのディレクトリを作成します。

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

文字列の置換に関する操作

出力ファイル名は入力ファイル名から置換機能で生成することもできます。
文字列にはreplace()メソッドがあり、戻り値として置換後の文字列を返します。
replace(old, new[, count])
Python 標準ライブラリ / 文字列メソッド

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

課題:

「ヒント:for name in glob.glob("*.jpg"):を使って複数のファイルに対して処理してみよう。」
に示した例題を元に、結果をファイルに保存するようにしてみましょう。
条件:出力先のディレクトリ"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"と書かなくてすみます("\"文字を2つ書いています)。

Python3では

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

# -*- 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)

ヒント4GUIを使う

nonbiri15
Python, scikit-learn, OpenCV使いです。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away