質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

421閲覧

Python3 フォルダ内の特定のサイズの画像を別フォルダへ移動する方法について

SuzuAya

総合スコア71

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/05/05 11:49

編集2019/05/06 07:51

前提・実現したいこと

様々なサイズの画像が格納されているフォルダの中から、特定のサイズの画像のみ取り出し、別フォルダへ移動したいと考えているのですが、
そのような場合はどうすればよいか教えていただけるととても助かります。
調べたところ、os.listdirでサイズごとのソートはできるようですが、別フォルダへの移動方法がわかりませんでした。

該当のソースコード

以下のコードで、フォルダ内のすべての画像のサイズと枚数は特定できました。

#train, testフォルダ内の画像サイズを一括取得 import glob import os import cv2 import sys # 引数は画像のファイルパス # 画像を読み込み、解像度情報を返す関数 def get_resolution(filepath): img = cv2.imread(filepath) # 画像ファイルの読み込みに失敗したらエラー終了 if img is None: print("Failed to load image file.") sys.exit(1) # カラーとグレースケールで場合分け if len(img.shape) == 3: height, width, channels = img.shape[:3] else: height, width = img.shape[:2] channels = 1 return width,height,channels # 引数はディレクトリ # ディレクトリ内のファイルの解像度をカウントする def count_resol(directory): print(directory) files = glob.glob(directory) d={} for file in files: width,height,channels = get_resolution(file) info = str(width) + "," + str(height) + "," +str(channels) d.setdefault(info,0) d[info] += 1 print(d) # 対象ディレクトリを指定する,複数のディレクトリを指定可能 directory = ["./train/NORMAL/*jpeg", "./test/NORMAL/*.jpeg"] for d in directory: count_resol(d)

###補足情報
以下のコードを追記してみたのですが、うまくいきませんでした。
お手数をお掛けしますが、どのように修正したら良いかご存じの方がいらっしゃいましたら教えていただけるととても助かります。
こちらの質問も参考にしてみました。
https://teratail.com/questions/149325

import glob import os import re import shutil #画像の保存名に'1536_496'が入っているものを別フォルダに移動 input_dir = './NORMAL_resize_rename_10000' # 移動元ディレクトリ output_dir = './NORMAL_resize_rename_copy_10000' # 移動先ディレクトリ # 出力ディレクトリが存在しない場合、作成する。 os.makedirs(output_dir, exist_ok=True) for path in glob.glob(input_dir + "/*.jpeg"): img = Image.open(path) # 画像を path から読み込み match = re.search('1536_496', input_dir + "/*.jpeg") if match: move('./NORMAL_resize_rename_10000/' + file, './NORMAL_resize_rename_copy_10000/')

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

otn様にアドバイスをいただき、最終的に以下のコードでうまくいきましたので共有させていただきます。

import glob import os import cv2 import sys import shutil # 引数は画像のファイルパス # 画像を読み込み、解像度情報を返す関数 def get_resolution(filepath): img = cv2.imread(filepath) # 画像ファイルの読み込みに失敗したらエラー終了 if img is None: print("Failed to load image file.") sys.exit(1) # カラーとグレースケールで場合分け if len(img.shape) == 3: height, width, channels = img.shape[:3] else: height, width = img.shape[:2] channels = 1 return width,height,channels # 引数はディレクトリ # ディレクトリ内のファイルの解像度をカウントする def count_resol(directory): print(directory) files = glob.glob(directory) mov_dir = './NORMAL_resize_copy_100_1_0506' # 追加 os.makedirs(mov_dir, exist_ok=True)# 追加 d={} for file in files: width,height,channels = get_resolution(file) info = str(width) + "," + str(height) + "," +str(channels) d.setdefault(info,0) d[info] += 1 if width ==1536 and height == 496: shutil.copy(file, './NORMAL_resize_copy_100_1_0506/' )# shutil.copyに修正、コピー元をfileに修正 print(d) # 対象ディレクトリを指定する,複数のディレクトリを指定可能 directory = ["./train/NORMAL/*jpeg", "./test/NORMAL/*.jpeg"] for d in directory: count_resol(d)

投稿2019/05/06 13:16

編集2019/05/10 13:25
SuzuAya

総合スコア71

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

https://docs.python.org/ja/3.7/library/shutil.html
の、shutil.move
#追記
こういうことでは?最初のコードに2行追加。

Python

1def count_resol(directory): 2 print(directory) 3 files = glob.glob(directory) 4 d={} 5 for file in files: 6 width,height,channels = get_resolution(file) 7 info = str(width) + "," + str(height) + "," +str(channels) 8 d.setdefault(info,0) 9 d[info] += 1 10 if width==512 and height==496: # 追加 11 move('./train/NORMAL/' + file, './train_NORMAL_resize/') # 追加 12 print(d)

投稿2019/05/05 12:14

編集2019/05/06 09:41
otn

総合スコア84533

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SuzuAya

2019/05/05 12:36

早速ご回答頂き、ありがとうございました。 shutil.moveを使って別フォルダへ画像を移動したことはあるのですが、サイズ指定をしたことがなく。。 以下のようにコードを書いてみたのですが、うまく動きませんでした。 #train画像の内、512 * 496サイズのものだけ移動 import os from os import listdir from shutil import move input_dir = './train/NORMAL' # 画像があるディレクトリ output_dir = './train/NORMAL_resize' # 移動先のディレクトリ img_size = (512,496) os.makedirs(output_dir, exist_ok=True) for file in listdir('./train/NORMAL')[:]: if file_size = img_size: move('./train/NORMAL/' + file, './train_NORMAL_resize/')
otn

2019/05/05 12:44

↑どこからこんな物が?? 質問のコードにmoveを追加するのでは??
SuzuAya

2019/05/05 12:50

質問したコードで取得した画像のサイズは何種類かあり、その中の512*496サイズのものだけshutil.moveを使って別フォルダに移動したいので、上記コードを追記してみました。
SuzuAya

2019/05/06 07:57

まず、画像の保存名にその画像のサイズ名を追記してリネームし、re.searchを使ってそのサイズ名に一致する画像を別フォルダに移動する方法に変更してみました。 まだコードはうまく動かないのですが、もしお気づきの点がありましたらアドバイスいただけますと幸いです。
SuzuAya

2019/05/06 12:03

ありがとうございます!google colabの不具合なのか、試そうとしたところ「failed to load image」というエラーが表示されたため、解消され次第実行してみます。貴重なお時間を割いて頂き、本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問