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

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

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

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

Q&A

解決済

2回答

495閲覧

分割した画像を保存する際,毎

Skinny-boy

総合スコア1

Python 3.x

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

0グッド

0クリップ

投稿2022/07/14 14:53

機械学習用のデータの水増しのために,画像を分割して保存したいのですが,ファイル名が処理するたびに上書き保存されてしまいます.
リネームの方法も検討したのですが,どうもうまくいかず...
ご教授いただけると幸いです.

実現したいこと

ファイル名が同じでも上書き保存されないようにしたい.
あるいはファイル名が既存のものと重複する場合はファイル名を取得できるようにしたい

該当のソースコード

Python(3.10.5)
ソースコード
from pathlib import Path
import cv2
import numpy as np

img = cv2.imread(r"ファイル保存場所")
rows = 3
cols = 3

chunks = []
for row_img in np.array_split(img,rows,axis=0):
for chunk in np.array_split(row_img,cols,axis=1):
chunks.append(chunk)
print(len(chunks))

#出力先のディレクトリを作成する
output_dir = Path("output")
output_dir.mkdir(exist_ok=True)

#保存する
for i,chunk in enumerate(chunks,1):
save_path = output_dir.name + "/" + f"photo{i}.jpg"
cv2.imwrite(str(save_path),chunk)

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

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

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

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

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

TakaiY

2022/07/15 01:19

> ファイル名が処理するたびに上書き保存されてしまいます ソースコード(インデントがないので推測ですが)を見ても特に問題はなさそうですが、「処理するたび」というのは、もしかして、「ファイル保存場所」のところを別ファイル名に書き換えて複数回実施しているということでしょうか?
Skinny-boy

2022/07/15 04:16

追記・修正の依頼ありがとうございます。 毎処理使うファイルを変えているので、そう言う事になると思います。
TakaiY

2022/07/15 04:30

なるほど。ということは、その時は必ず前のファイルと同じディレクトリに同じファイル名で保存されるので、上書きになりますね。 で、その時に出力される分割したファイルはどうしたいのですか? 別の場所に保存する?
Skinny-boy

2022/07/15 04:38

とりあえずは同じ場所に保存したいと考えています。
TakaiY

2022/07/15 04:45

同じ場所に保存ということは、ファイル名を変えたいということだと思いますが、どのような名前に変えますか?
usekay

2022/07/15 06:10

もとのファイル名+連番とか?
Skinny-boy

2022/07/15 09:36

例えば、分割してできた既存ファイル名がphoto_50まであるとしたら、次の処理ではphoto_51からになるようにしたいです。 わかりづらくてすみません。
TakaiY

2022/07/15 10:05

それ、難しいし、あまり意味があるとは思えない。 そうしたり理由は何ですか?
Skinny-boy

2022/07/15 10:17

より簡単にできる方法であれば別の場所に保存する形でもいいと考えています。 いかんせん始めたばかりで何が簡単そうかの判断もつかないので、調べてやりやすそうな上記の形にした次第です…。
TakaiY

2022/07/15 10:29

こういうとき、よくやるのは、元のファイル名を使ったものです。 1つのディレクトリにまとめたければ、usekayさんの書き込みにあるように、もとのファイル名+連番としたり、元のファイル名と同じ名前のフォルダに入れるなどです。 そうすることで、分割後のファイルが、あとからでもどのファイルjを分割したものなのかすぐにわかるので、使いやすいでしょう。
guest

回答2

0

ベストアンサー

質問でいろいろつついてしまったので、例を作ってみました。
3パターンあります。 参考になれば。

python

1import pathlib 2import re 3import cv2 4import numpy as np 5 6while True: 7 image_name = input(r'元のファイル名を入力してください。 :') 8 image_file_path = pathlib.Path(image_name) 9 if image_file_path.exists(): 10 img = cv2.imread(image_name) 11 break 12 13rows = 3 14cols = 3 15 16chunks = [] 17for row_img in np.array_split(img,rows,axis=0): 18 for chunk in np.array_split(row_img,cols,axis=1): 19 chunks.append(chunk) 20 21#------------------------------ 22# その1: フォルダにある一番大きな番号の続きの番号を振る 23 24#出力先のディレクトリを作成する 25output_dir = pathlib.Path("output") 26output_dir.mkdir(exist_ok=True) 27 28output_dir_file_list = output_dir.glob("photo*.jpg") 29num_list = [] 30for n in output_dir_file_list: 31 m = re.match(r'photo0*(\d+).jpg', n.name) 32 num_list.append(int(m.groups()[0])) 33if len(num_list) == 0: 34 max_num = 0 35else: 36 max_num = max(num_list) 37 38#保存する 39for i,chunk in enumerate(chunks,1): 40 save_path = output_dir.name + "/" + f"photo{max_num + i}.jpg" 41 cv2.imwrite(str(save_path),chunk) 42 43 44#------------------------------ 45# その2: 元画像ファイル名と同じ名前のフォルダに入れる 46#出力先のディレクトリを作成する 47output_dir = pathlib.Path(image_file_path.stem) 48output_dir.mkdir(exist_ok=True) 49 50#保存する 51for i,chunk in enumerate(chunks,1): 52 save_path = output_dir.name + "/" + f"photo{i}.jpg" 53 cv2.imwrite(str(save_path),chunk) 54 55#------------------------------ 56# その3: 元画像ファイル名に連番を付けた名前にする 57#出力先のディレクトリを作成する 58output_dir = pathlib.Path("output") 59output_dir.mkdir(exist_ok=True) 60 61#保存するUファイル名は 62for i,chunk in enumerate(chunks,1): 63 save_path = output_dir.name + "/" + f"{image_file_path.stem}_{i}.jpg" 64 cv2.imwrite(str(save_path),chunk) 65

投稿2022/07/15 12:00

TakaiY

総合スコア12666

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

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

0

py

1save_path = output_dir.name + "/" + f"photo{i}.jpg" 2if os.path.isfile(save_path): 3 print(f"『{save_path}』はもうあるよ") 4else: 5 6 cv2.imwrite(str(save_path),chunk) 7

てこと?

投稿2022/07/14 15:22

usekay

総合スコア395

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問