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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Python

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

Q&A

解決済

1回答

2132閲覧

エラーが出ず保存されない画像処理プログラムについて

naots

総合スコア11

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Python

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

0グッド

0クリップ

投稿2021/12/23 01:57

前提・実現したいこと

以前の質問でエラーが出ないけど処理された画像が指定したフォルダに保存されない複数の画像を処理するプログラムについて質問しました。

以前の質問からprintを使って以下のように記述して実行してみました。

該当のソースコード

python

1import glob 2import cv2 3for fname in glob.glob("Desktop/clusterling/image/picture*.jpg"): 4 image = cv2.imread(fname) 5 print (image) 6 7 image_mask = cv2.inRange(image, (108,64,155),(255,125,255)) 8 cv2.imwrite("Desktop/clusterling/mask/picture%s.jpg" % fname, image_mask) 9 print('Desktop/clusterling/mask/picture%s.jpg' % fname, image_mask) 10 11 out = cv2.bitwise_and(image, image, mask = image_mask) 12 cv2.imwrite("Desktop/clusterling/red/picture%s.jpg" % fname, out) 13 print(esktop/clusterling/red/picture%s.jpg" % fname, out)

すると以下のように表示されました。
長いので省略して記述します。

[[[148 146 165] [147 145 164] [148 146 165] ... [149 123 123] [145 119 119] [146 120 120]] [[151 150 166] [148 147 163] [144 142 161] ... [146 122 124] [149 125 127] [152 128 130]] [[151 148 163] [149 146 161] [145 142 158] ... [156 133 141] [157 135 140] [170 150 155]] ... [[198 182 199] [206 190 207] [201 188 204] ... [246 224 226] [245 222 226] [247 224 228]] [[203 189 207] [206 193 209] [202 186 203] ... [246 225 227] [247 225 227] [245 223 225]] [[203 189 207] [203 189 207] [204 188 205] ... [246 225 227] [248 226 228] [248 226 228]]] Desktop/clusterling/mask/pictureDesktop/clusterling/image\picture4.jpg.jpg [[0 0 0 ... 0 0 0] [0 0 0 ... 0 0 0] [0 0 0 ... 0 0 0] ... [0 0 0 ... 0 0 0] [0 0 0 ... 0 0 0] [0 0 0 ... 0 0 0]] Desktop/clusterling/red/pictureDesktop/clusterling/image\picture4.jpg.jpg [[[0 0 0] [0 0 0] [0 0 0] ... [0 0 0] [0 0 0] [0 0 0]] [[0 0 0] [0 0 0] [0 0 0] ... [0 0 0] [0 0 0] [0 0 0]] [[0 0 0] [0 0 0] [0 0 0] ... [0 0 0] [0 0 0] [0 0 0]] ... [[0 0 0] [0 0 0] [0 0 0] ... [0 0 0] [0 0 0] [0 0 0]] [[0 0 0] [0 0 0] [0 0 0] ... [0 0 0] [0 0 0] [0 0 0]] [[0 0 0] [0 0 0] [0 0 0] ... [0 0 0] [0 0 0] [0 0 0]]] PS Desktop\clusterling>

試したこと

ここで、別でforを作ればいいと思い以下のように10回forループするようにしてみました。

python

1import glob 2import cv2 3for fname in glob.glob("Desktop/clusterling/image/picture*.jpg"): 4 image = cv2.imread(fname) 5 print (image) 6 7 for i in range(10) 8 image_mask = cv2.inRange(image, (108,64,155),(255,125,255)) 9 cv2.imwrite("Desktop/clusterling/mask/picture%s.jpg" % i, image_mask) 10 print('Desktop/clusterling/mask/picture%s.jpg' % i, image_mask) 11 12 out = cv2.bitwise_and(image, image, mask = image_mask) 13 cv2.imwrite("Desktop/clusterling/red/picture%s.jpg" % i, out) 14 print(esktop/clusterling/red/picture%s.jpg" % i, out) 15

すると、処理された画像が指定したフォルダに保存されるようになりましたが、1枚目を処理したものが10枚保存されそのあとに2枚目に処理された画像10枚が1枚目に処理した画像を上書きする...というのを繰り返され最終的に10枚目を処理した画像が10枚になるだけになってしまいました。

for i in range(10)を入れることで処理した画像が保存されたので、おそらくこの部分に別のコードを入力すれば自分の思う通りに10枚の画像を処理してそれを指定のフォルダに保存するといった流れができるのであと一歩なのですが、ここをどうすればいいか見当が付きません。

なにか記述すべきコードなどがあれば教えていただきたく思います。
よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

Desktop/clusterling/mask/pictureDesktop/clusterling/image\picture4.jpg.jpg [[0 0 0 ... 0 0 0]

出力ファイルパスがおかしいですよね。Desktop/clusterling/mask/ の中の pictureDesktop というディレクトリを指定する意図ではないと思います。これが出力されない原因ではないでしょうか。

python

1 cv2.imwrite("Desktop/clusterling/mask/picture%s.jpg" % fname, image_mask)

出力ファイル名を作るときに、fname から /\ を除去するとか、数値だけ抽出するなどの処理が必要です。

例:

python

1pathlib.Path("Desktop/clusterling/mask") / pathlib.Path(fname).name

投稿2021/12/23 02:16

編集2021/12/23 02:25
int32_t

総合スコア20670

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

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

naots

2021/12/23 04:39

回答ありがとうございます。 以下のようにpathlibを入れて実行してみましたが、やはり同じように表示されて、処理後の画像が保存されません。 import pathlib import glob import cv2 for fname in glob.glob("Desktop/clusterling/image/picture*.jpg"): image = cv2.imread(fname) print (image) image_mask = cv2.inRange(image, (108,64,155),(255,125,255)) cv2.imwrite("Desktop/clusterling/mask/picture%s.jpg" % fname, image_mask) pathlib.Path("Desktop/clusterling/mask") / pathlib.Path(fname).name print('Desktop/clusterling/mask/picture%s.jpg' % fname, image_mask) out = cv2.bitwise_and(image, image, mask = image_mask) cv2.imwrite("Desktop/clusterling/red/picture%s.jpg" % fname, out) pathlib.Path("Desktop/clusterling/red") / pathlib.Path(fname).name print("Desktop/clusterling/red/picture%s.jpg" % fname, out) そもそもpathlibを入れる場所がおかしいのでしょうか。 他に改善点などあれば教えていただきたく思います。 よろしくお願いいたします。
int32_t

2021/12/23 04:42

> そもそもpathlibを入れる場所がおかしいのでしょうか。 はい。まったく意味のないところに入れてます。 imwrite() の中の "Desktop/clusterling/mask/picture%s.jpg" % fname などを置き換えてください。
naots

2021/12/23 05:08

回答ありがとうございます。 その部分をpathlibに置き換えるということは以下のような形でしょうか。 cv2.imwrite(pathlib.Path("Desktop/clusterling/mask") / pathlib.Path(fname).name,image_mask) これで実行してみたら以下のようなエラーが出ました。 例外が発生しました: error OpenCV(4.5.4-dev) :-1: error: (-5:Bad argument) in function 'imwrite' > Overload resolution failed: > - Can't convert object of type 'WindowsPath' to 'str' for 'filename' > - Can't convert object of type 'WindowsPath' to 'str' for 'filename' 恐らく見当違いに記述している可能性があるので置き換えてる部分についておかしなところを教えていただきたく思います。 何度も申し訳ございません。 よろしくお願いいたします。
int32_t

2021/12/23 05:16

> - Can't convert object of type 'WindowsPath' to 'str' for 'filename' 私の回答が言葉足らずなのが悪いのですけども、このエラーメッセージでウェブ検索すると解決策がすぐに見つかると思うので、自分でも調べる習慣を持ってください。 cv2.imwrite(str(pathlib.Path略.name), image_mask) のようにします。
naots

2021/12/23 05:33

無事に思うように動かすことができました。 何度も回答していただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問