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

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

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

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

2430閲覧

指定したフォルダ内の複数枚数の画像処理について

naots

総合スコア11

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/12/13 04:53

編集2021/12/13 06:11

以下のプログラムで入力画像から特定の色を抽出したり2値化しました。

python

1import cv2 2image = cv2.imread("picture1.jpg") 3image_mask = cv2.inRange(image, (0,0,200),(10,10,255)) 4cv2.imwrite("mask.jpg", image_mask) 5out = cv2.bitwise_and(image, image, mask = image_mask) 6cv2.imwrite("red.jpg", out)

これでは一枚の画像しか処理できないのですが、指定したフォルダ内の複数枚の画像処理をして処理した結果を別の指定したフォルダに保存させることはできますでしょうか。

2行目に入力画像を指定して、4行目に2値化した画像、6行目に特定の色を抽出した結果を出力しているのでここを変更すればいいと思ったため、以下のサイトを参考にパスを記入しました
Python, OpenCVで画像ファイルの読み込み、保存(imread, imwrite)

python

1import cv2 2image = cv2.imread("Desktop\clusterling\image\picture*.jpg") 3image_mask = cv2.inRange(image, (108,64,155),(255,125,255)) 4cv2.imwrite("Desktop\clusterling\mask\mask%s.jpg", image_mask) 5out = cv2.bitwise_and(image, image, mask = image_mask) 6cv2.imwrite("clusterling\gazousyoriconv\red%s.jpg", out)

しかし以下のようなエラーが発生しました。

SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape

変更する場所やフォルダ指定なのでパスを指定するまではよいと思うのですがどこがいけないのかよくわかりません。

よろしくお願いいたします。

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

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

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

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

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

naots

2021/12/13 05:26

ご指摘ありがとうございます。自身で調べて試したことを追加しました。
guest

回答2

0

ベストアンサー

例えば imread() の公式のドキュメントには

Loads an image from a file.

と書いてあり、1つのファイルから1つの画像を読み込むことがわかります。ワイルドカードに対応しているとかフォルダを指定できるとかはまったく書いてありません。複数のファイルを処理したい場合には複数回 imread() を呼ぶ必要があります。

glob() でファイルのリストを得てループするとよいでしょう。

python

1for fname in glob.glob("Desktop\clusterling\image\picture*.jpg") 2 image = cv2.imread(fname) 3 4 image_mask = cv2.inRange(image, (108,64,155),(255,125,255)) 5 # 文字列操作でfnameからマスク用のファイル名を作って、imwrite()に指定する 6 cv2.imwrite(..., image_mask) 7 8 out = cv2.bitwise_and(image, image, mask = image_mask) 9 # 文字列操作でfnameからred用のファイル名を作って、imwrite()に指定する 10 cv2.imwrite(..., out)

投稿2021/12/14 02:55

int32_t

総合スコア21695

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

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

naots

2021/12/14 06:21

回答ありがとうございます。 以下のように修正して実行してみたらエラーは出なくなりましたが、画像処理して指定のフォルダに保存する処理が行われませんでした。 import cv2 import glob for fname in glob.glob("Desktop/clusterling/image/picture*.jpg"): image = cv2.imread(fname) image_mask = cv2.inRange(image, (108,64,155),(255,125,255)) cv2.imwrite("Desktop/clusterling/mask/mask%s.jpg" % fname, image_mask) out = cv2.bitwise_and(image, image, mask = image_mask) cv2.imwrite("Desktop/clusterling/gazousyoriconv/red%s.jpg" % fname, out) 改善すべき点があれば教えていただきたく思います。 よろしくお願いいたします。
int32_t

2021/12/14 06:34

ぱっと見ではとくに変なところは見つかりませんね。 デバッガやprintなどでどこまで期待通り動いているか検証してください。
guest

0

ファイル名に%の文字は使えません。
そこでなにをしようとしてるんでしょう

投稿2021/12/13 05:58

y_waiwai

総合スコア88040

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

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

y_waiwai

2021/12/13 06:25

あらかじめそのようにファイル名の文字列を作ってから、そいつに渡しましょう
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問