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

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

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

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

Q&A

解決済

2回答

2086閲覧

ディレクトリ内ファイルの一括処理について

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

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

0グッド

0クリップ

投稿2019/05/21 08:01

ディレクトリ内の画像処理について、複数の画像を一括で赤(255,0,0)→(1,0,0)にするコードで悩んでいます。
自分ないに書いてみたのですが、TypeError: string indices must be integersエラーがでてうまくいきません。

import cv2
import os

設定(org)
img_dir = '入力ディレクトリ ’
out_dir = '出力ディレクトリ'
os.makedirs(out_dir, exist_ok=True)

WIDTH=1000
HEIGHT=500

path="./パス名"
files=os.listdir(path)

print(files)

for file in files:
for x in range(HEIGHT):
for y in range(WIDTH):
r,g,b = file[x, y]
if (r, g, b) == (255, 0, 0):
file[x,y]=1,0,0
else:
file[x,y]=0,0,0

print(files)

上記のコードでおかしい点を教えていただきたいです。
よろしくお願いします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

以下の問題点があるように思います。

  1. OpenCV はチャンネルの並び順が BGR なので、赤は (255, 0, 0) ではなく、(0, 0, 255)
  2. numpy 配列に対して、for 文で1ピクセルずつ見ていくのは非効率

→ numpy の indexing を使う。

サンプルコード

python

1from pathlib import Path 2 3import cv2 4import numpy as np 5 6input_dir = Path('input') 7output_dir = Path('output') 8output_dir.mkdir(exist_ok=True) 9 10before = (0, 0, 255) 11after = (0, 0, 1) 12 13for img_path in input_dir.iterdir(): 14 # 画像を読み込む。 15 img = cv2.imread(str(img_path)) 16 17 # (0, 0, 255) を (1, 0, 0) に置換する。 18 idx_to_replace = (img == before).all(axis=2) 19 img[idx_to_replace] = after 20 img[~idx_to_replace] = (0, 0, 0) 21 22 # 保存する。 23 save_path = output_dir / img_path.name 24 cv2.imwrite(str(save_path), img) 25 print('{} ==> {}'.format(img_path, save_path))

投稿2019/05/21 08:39

編集2019/05/21 09:54
tiitoi

総合スコア21956

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

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

退会済みユーザー

退会済みユーザー

2019/05/21 09:51

ご丁寧にありがとうございます。 記載し忘れていましたが、(0,0,255)以外はすべて(0,0,0)で処理したいのですが、上記のプログラムに加える方法を教えていただけないでしょうか。 お手数おかけします。
tiitoi

2019/05/21 09:55

回答を修正しました。 なお、(0,0,0)と(0, 0, 1)は近い色なので、画像で見ると真っ黒になると思います。
退会済みユーザー

退会済みユーザー

2019/05/22 07:43

ありがとうございます! 無事解決しました。
guest

0

file文字列です。文字列に対してr,g,b = file[x, y]という操作ができないので提示エラーが発生しています。
img = cv2.imread(file)の結果に対して処理をしましょう。

投稿2019/05/21 08:17

can110

総合スコア38258

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

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

退会済みユーザー

退会済みユーザー

2019/05/21 09:49

ありがとうございます。 いろんな方法で試したいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問