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

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

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

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python 3.x

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

Q&A

解決済

2回答

2474閲覧

フォルダ内の画像全てを加工して,加工前の名前で保存したい

blackmk

総合スコア23

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python 3.x

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

0グッド

0クリップ

投稿2019/01/23 16:26

現在,以下のように画像にマスキングを施しているのですが,これをフォルダ内の画像全てに適応して,加工前の名前(このコード上では「2019」など)で保存したいです.一応,globを使ったコードを書いてみたのですが,書いた所から先が,どのようにすれば良いか分かりません.ご指摘よろしくお願いします.
一つ目のコードは動作確認済です.二つ目のコードをRUNしても,エラーも出ず,保存先に画像も保存されておりません.

python

1# -*- coding: utf-8 -*- 2 3import cv2 4import numpy as np 5 6def main(): 7 8 img = cv2.imread("C:/data/2019.jpeg") 9 10 mask = cv2.imread("C:/data/1.jpg", 0) 11 12 img2 = cv2.bitwise_and(img, img, mask=mask) 13 14 cv2.imwrite(C:/data/masked/2019.jpg", img2) 15 16 17if __name__ == '__main__': 18 main()

以下に,加筆したものを記します.

python

1# -*- coding: utf-8 -*- 2 3import cv2 4import numpy as np 5import glob 6 7 8files = glob.glob("C:/data/folder/*.jpg") 9for file in files: 10 11 12 def main(): 13 14 img = cv2.imread(file) 15 16 mask = cv2.imread("C:/data/1.jpg", 0) 17 18 img2 = cv2.bitwise_and(img, img, mask=mask) 19 20 cv2.imwrite("C:/masked/*.jpg", img2) 21 22 23 if __name__ == '__main__': 24 main()

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

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

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

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

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

guest

回答2

0

ベストアンサー

cv2.imwrite("C:/masked/*.jpg", img2)
のようにしても * の部分に対応するファイル名を補完してくれたりはしませんよ。
出力するファイル名は自分で決める必要があります。

os モジュールを使って、もとのファイル名を取得して以下のようにしてください。

※ このままでは動かないので、適宜変えてください。

python

1import glob 2import os 3 4import cv2 5import numpy as np 6 7out_dir = 'output' 8os.makedirs(out_dir, exist_ok=True) 9 10for path in glob.glob("C:/data/folder/*.jpg"): 11 src = cv2.imread(path) 12 13 # なにか処理 14 15 # 出力パスを決める 16 basename = os.path.basename(path) 17 out_path = os.path.join(out_dir, basename) 18 # 保存 19 cv2.imwrite(out_path, dst)

投稿2019/01/23 16:49

編集2019/01/23 16:50
tiitoi

総合スコア21956

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

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

blackmk

2019/01/28 09:08

ありがとうございます。スムーズに動きました!
guest

0

基本的に、関数はトップレベルで定義するようにした方がコードは書きやすいです。

Python

1import glob 2import cv2 3 4 5_mask = cv2.imread("C:/data/1.jpg", 0) 6assert _mask is not None 7 8def en_mask(p): 9 img = cv2.imread(p) 10 assert img is not None 11 12 return cv2.bitwise_and(img, img, mask=_mask) 13 14 15def main(): 16 for path in glob.glob("C:/data/folder/*.jpg"): 17 masked = en_mask(path) 18 19 name = path.split('\')[-1] 20 cv2.imwrite(f'C:/masked/{name}', masked) 21 22 23if __name__ == '__main__': 24 main()

動作未検証ですので、ちょっとしたバグを埋め込んでいるかもしれません。悪しからず。

投稿2019/01/23 16:41

LouiS0616

総合スコア35668

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

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

blackmk

2019/01/28 09:09

ありがとうございます!スムーズに動きました!コードのご指摘もありがとうございます.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問