プログラム化する最大のメリットは自動化にあります。過去単一画像のリサイズ処理を紹介しましたが、今回はフォルダにある画像を全て一括でリサイズする方法を紹介します。
こんにちは。wat(@watlablog)です。
そろそろプログラム化の恩恵が得られる内容も書いていこうと思います。今回はフォルダ内の画像を一括でリサイズする方法を紹介します!
ファイルを一括リサイズするために必要な2つのこと
①ファイルパスを自動で取り扱う
ファイルを一括で処理するためには、まずはファイル名を自動で取得したり、自動で保存用のパスに変換したり、拡張子の情報を使ってエラー処理したりといったことが必要です。
それらの内容は「Pythonでフォルダ内のファイル一覧を取得する3つのメリット」に記載しましたので、是非こちらの記事を確認してみて下さい。今回は過去のアルゴリズムをそのまま使います。
②リサイズの関数
ファイルリサイズはOpenCVの関数を使うことで簡単に書くことが出来ます。具体的なリサイズの方法は「Python/OpenCVで画像をリサイズする方法」に書きましたので、こちらも併せて参照頂ければと思います。
実際に今回実行するプログラムで得られる結果は以下の画像で示すサイズ変換画像です。前回は単一画像だけに実行していましたが、今回はフォルダ内の画像を一括で処理します。
フォルダ内の画像を一括リサイズするPythonコード
全コード
今回は二つのdef関数を使います。初めは前回作成したファイルリスト関数を使ってから再度forループでリサイズをしていくことを考えましたが、それだとムダに2回forループを回すことになるので、今回はファイル名操作部分の途中でリサイズ関数を実行する方式にしました。
基本的には過去記事の2つの内容を組み合わせただけなので、以下の全コード内記載のテキスト説明をご確認下さい。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
import cv2 import glob import os # 画像リサイズをする関数 def resize(path): img = cv2.imread(path, 1) # カラー画像の読み込み h, w, ch = img.shape[:3] # 画像のサイズを取得(グレースケール画像は[:2] hr = int(h * 2) # 縦方向のサイズを計算 wr = int(w * 2) # 横方向のサイズを計算 img = cv2.resize(img, (wr, hr)) # 画像をリサイズする return img # 指定されたディレクトリ内のファイル情報を取得する関数 def bundle_resize(dir): path_list = glob.glob(dir + '\*') # 指定されたディレクトリ内の全てのファイルを取得 name_list = [] # ファイル名の空リストを定義 ext_list = [] # 拡張子の空リストを定義 # ファイルのフルパスからファイル名と拡張子を抽出 for i in path_list: file = os.path.basename(i) # 拡張子ありファイル名を取得 name, ext = os.path.splitext(file) # 拡張子なしファイル名と拡張子を取得 name_list.append(name) # 拡張子なしファイル名をリスト化 ext_list.append(ext) # 拡張子をリスト化 out_path = os.path.join(*[dir, name + '_resize' + ext]) # 保存パスを作成 img = resize(i) # リサイズ関数を実行 cv2.imwrite(out_path, img) # リサイズ後の画像を保存 return # ファイルを探してリサイズする関数を実行 bundle_resize('dir') |
実行結果
以下が本コードの実行結果です。元ファイルは「sample_〇〇.JPG」ですが、リサイズしたファイルは「sample_〇〇_resize.JPG」と元ファイルの名前を参照しつつリサイズした事がわかるようにしました。
まとめ
今回は過去の「Pythonでフォルダ内のファイル一覧を取得する3つのメリット」と「Python/OpenCVで画像をリサイズする方法」を組み合わせて一括リサイズプログラムを書いてみました。
内容は非常にシンプルですが、一括でファイルに処理を施し自動で保存していくプログラムは汎用性のある内容かと思います。
今回はシンプルな方法ですが、今後処理の内容を変えれば色々応用がきくプログラムになったと思います!
Twitterでも関連情報をつぶやいているので、wat(@watlablog)のフォローお待ちしています!
こんにちは
サンプルありがとうございます。
質問ですが、このソースをベースに、jpg や、pngなどのファイルをwebp形式に変換させるにはどうすればいいでしょうか?
ご訪問ありがとうございます。
私の方がwebp形式に詳しくないので、明確な答えにならず申し訳ないのですが、Googleが作った画像形式とお見受けします。
以下は外部サイト様ですが、おそらく目的のコードかなと思った記事がありましたのでご紹介させて頂きます。
https://rmc-8.com/programming/python/conv_to_webp_with_python
こちらでもwebpを使ったコードは今後念頭に置いておきたいと思いますが、まずは上記リンクがわかりやすいと思いますので、ご覧頂ければと思います。