サイトアイコン sciencompass

【python】指定したフォルダに存在する画像をリサイズして一つに出力する【ChatGPT】

Comfreak / Pixabay

日付や番号ごとに集めた写真を簡単に確認する方法が欲しく、最近はやりのChatGPTにプログラムを書いてもらいました。

Pythonを使って指定したフォルダに存在する画像をリサイズ、一つの画面に出力するというプログラムになっています。

ChatGPTによるプログラムの解説を示します。

今回作成したプログラムの流れは、

  1. ID(番号や日付などを想定)を入力するよう投げかけます。
  2. 現在のディレクトリ(0s.getcwd())にIDを追加したパスを作成します。
    ここでは、IDの名前のディレクトリが現在のディレクトリ内にあると仮定します。
  3. 空のリスト”jpg_files”を作成します。ディレクトリ内に”.jpg”で終わるファイルがあるか、ループを回します。もし該当するファイルがあれば、完全パスを”jpg_files”リストに追加します。
  4. “resized_images”という空のリストを作成します。次に、”jpg_files” リスト内の各ファイルに対してループ処理を行います。各ファイルに対して、 cv2.imread() 関数を用いて画像を読み込み、 cv2.resize() を用いて画像を 400 × 400 ピクセルにリサイズします。そして、リサイズされた画像を resized_images リストに追加します。
  5. combined_img 変数を作成し、これを resized_images リストの最初の画像と等しく設定します。次に、cv2.hconcat() を用いて、resized_images のリストにある残りの画像をループさせ、各画像をリストの前の画像と水平方向に連結しています。これにより、リサイズされたすべての画像を並べて表示した1枚の画像ができあがります。
  6. 最後に、cv2.imshow()で合成された画像を画面に表示し、cv2.waitKey()でユーザがキーを押すのを待ってからウィンドウを閉じます

ChatGPTが作成したプログラムは下記のとおりです。


import os
import cv2

#Step 1: Enter ID number
id_num = input("Enter ID number: ")

#Step 2: Search directory of which name is ID number
dir_path = os.path.join(os.getcwd(), id_num)

#Step 3: Search ".jpg" files in the directory and save name in list
jpg_files = []
for file in os.listdir(dir_path):
if file.endswith(".jpg"):
jpg_files.append(os.path.join(dir_path, file))

#Step 4: Load each files and resized by OpenCV
resized_images = []
for file in jpg_files:
img = cv2.imread(file)
resized_img = cv2.resize(img, (400, 400))
resized_images.append(resized_img)

#Step 5: Show every resized files in one screen
combined_img = resized_images[0]
for i in range(1, len(resized_images)):
combined_img = cv2.hconcat([combined_img, resized_images[i]])
cv2.imshow("Resized Images", combined_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

ですが、これをそのまま実行するとIndentationErrorというエラーが出てきます。
for文のインデントが正しくないのが原因なのですが、これをChatGPTが修正できるかどうか試してみました。
上のソースコードをコピーし、間違いがあれば修正してください、と投げかけたところ、

以下は、修正されたプログラムコードです。修正点は、for文のインデントが正しくない部分を修正しました。

import os
import cv2

#Step 1: Enter ID number
id_num = input("Enter ID number: ")

#Step 2: Search directory of which name is ID number
dir_path = os.path.join(os.getcwd(), id_num)

#Step 3: Search ".jpg" files in the directory and save name in list
jpg_files = []
for file in os.listdir(dir_path):
 if file.endswith(".jpg"):
  jpg_files.append(os.path.join(dir_path, file))

#Step 4: Load each files and resized by OpenCV
resized_images = []
for file in jpg_files:
 img = cv2.imread(file)
 resized_img = cv2.resize(img, (400, 400))
 resized_images.append(resized_img)

#Step 5: Show every resized files in one screen
combined_img = resized_images[0]
for i in range(1, len(resized_images)):
 combined_img = cv2.hconcat([combined_img, resized_images[i]])
cv2.imshow("Resized Images", combined_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

とインデントが間違いだったことに気づきました。

モバイルバージョンを終了