質問: pythonで数百枚ある画像を白黒の二値化するプログラムを作っております。1枚の画像を二値化することはできたのですが数百枚の画像を一度に二値化できるプログラムを教えて頂きたいです。二値化した画像はその後、黒い部分の面積や周囲の長さを求め学習させたいと考えております。 画像はC:\Users\LSL\定義した文字領域に入っており、AC001.png、AC002.png、AC003.png・・・のように名前をつけております。
回答: 以下のような考え方があるので、やりたいこと・持っている知識・使える時間 などを考慮して、良さそうな方法でやってみてください。 1.おそらく既に出来ていると思われるが、画像処理のPythonプログラムで、 コマンドラインパラメータにより入力ファイル、出力ファイルをパス名含めて 指定できるようにする。 あるいは標準入力からファイル名あるいは画像データそのものを入力し、 処理結果を標準出力に出力するとか。 ⇒複数ファイル処理はコマンドラインやバッチファイルのFOR文とか、 別のプログラムを(PythonでもVB,C#でも何でも)作成して、そこから 対象ファイルをパラメータにして画像処理のPythonプログラムを呼び出す。 例えばコマンドラインのFOR文なら、カレントフォルダを処理対象ファイル の入っているフォルダにして、以下のように指定する。 バッチファイルに記述する場合、%Iは%%Iにする。 ``` FOR %I IN (AC*.png) DO Python 画像処理プログラムパス名 %I 出力フォルダ\%I ``` 2.上記画像処理プログラムを関数化し、コマンドラインパラメータで ワイルドカードやフォルダを指定で出来るようにしたmain処理を追加し、 抽出した複数ファイルを処理できるようにする。 追加でサブフォルダがあれば再帰的な処理が出来るように考えても良い。 プログラムを呼び出すのは、上記1.と同じくコマンドラインや別プログラム とする。 ⇒Pythonのosモジュールのlistdirとかglobモジュールのglob等を使って、 パラメータに指定された内容から処理対象ファイルのリストを作成し、 それを画像処理関数で順次処理する。 例として関連する行を抽出すると以下のようになる。 ``` import os.path import glob files = glob.glob('C:\\Users\\LSL\\' + 定義した文字領域の格納変数 + '\\' + 入力ファイル指定の格納変数) for inputfile in files: outputfile = 出力フォルダ名格納変数 + '\\' + os.path.basename(inputfile) 画像処理関数(inputfile, outputfile) ``` 3.画像処理のPythonプログラムにGUIを付加する Pythonに含まれているTkInterや、外部ツールのwxPython, PyQt, PyGTK等 色々な開発環境・ライブラリ・ツールがあり、例えばこんなまとめ記事が あるので、参考に。 Python GUIツールキット個人的な比較のまとめ PythonのGUI開発ツールの選択 検索すれば、他にも色々と出てくると思われる。