🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

OpenCV

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

Python 3.x

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

Python

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

Q&A

解決済

3回答

25815閲覧

python,OpenCV,numpyによる色抽出・変換

Haku_val

総合スコア14

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

OpenCV

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

Python 3.x

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

Python

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

0グッド

4クリップ

投稿2017/11/13 09:18

###前提・実現したいこと
pythonで画像の色変換を行いたいのですが,
opencvのimreadで画像を読み込み,
例えば[R,G,B]=[255,0,0]の画素を[R,G,B]=[0,0,255]にしようとプログラムを組んでいるのですが,
numpyのwhere等を使って一括で変換する方法ってありますか?
現状は,ループで1画素ずつ判定して行っています.

###該当のソースコード

python

1import sys,cv2 2import numpy as np 3 4args = sys.argv 5img = cv2.imread(args[1]) 6 7find_color = np.array([255,0,0]) 8change_color = np.array([0,0,255]) 9 10height,width,channels = img.shape 11img2 = np.empty((height,widht,channels)) 12 13for y in range(height): 14 for x in range(width): 15 if np.allclose(img[y,x,:],find_color[-1::-1]): 16 img2[y,x,:] = change_color[-1::-1] 17 18cv2.imwrite("result.png",img2)

###試したこと

python

1img2 = np.where( np.allclose(img[:,:,:],find_color[-1::-1]), change_color,img) 2cv2.imwrite("result.png",img2)

とやりましたが,上手く行かなかったため,for文で一画素ずつ行っています

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

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

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

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

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

guest

回答3

0

はずしてるかもですが

画像が以下のような3次元のnumpy.ndarrayだったとして・・・
height x width x channel(=RGB)
2x2x3の小さなサンプルで、参照色を赤(255,0,0)、置換色を緑(0,255,0)とし
全ピクセルの中の参照色のピクセルを置換色に置き換えるコードを実験してみました。

python

1import numpy as np 2 3# before color 4c_b = np.array([255, 0, 0], dtype=np.uint8) 5 6# after color 7c_a = np.array([0, 255, 0], dtype=np.uint8) 8 9# image: 2x2x(3channel)の適当なイメージを作る 10img = np.zeros([2, 2, 3], dtype=np.uint8) 11img[0,0] = img[1,1] = c_b 12 13print('--- before ---') 14print(img) 15 16# 色の置き換え 17img[np.logical_and.reduce(img == c_b, axis=2)] = c_a 18 19print('--- after ---') 20print(img)

結果

text

1--- before --- 2[[[255 0 0] => 赤黒 3 [ 0 0 0]] 黒赤 4 5 [[ 0 0 0] 6 [255 0 0]]] 7--- after --- 8[[[ 0 255 0] => 緑黒 9 [ 0 0 0]] 黒緑 10 11 [[ 0 0 0] 12 [ 0 255 0]]]

投稿2017/11/13 12:34

編集2017/11/13 12:59
KSwordOfHaste

総合スコア18402

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

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

0

ベストアンサー

ご提示のコードを実行した結果、次のような仕様と理解しました。

  • Pure RedPure Blueに置き換え
  • その他の個所は黒染め

Python

1cond_p = (img[..., 0] == 0) & (img[..., 1] == 0) & (img[..., 2] == 255) 2cond_f = np.logical_not(cond_p) 3img[cond_p] = [255, 0, 0] 4img[cond_f] = [ 0, 0, 0]

もっと簡単に書けるような気もする... 関数化すれば、あんまり気にならないかもしれませんが。

実行例

実行例
余談ですが、上の図錯視効果があるような... 台形の大きさを定規で測ってしまいました。

投稿2017/11/13 12:14

編集2017/11/13 12:35
LouiS0616

総合スコア35668

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

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

0

皆様の回答を見るまでただただ軸を入れ替えると思っていました。
OpenCVではこんな感じです。
OpenCVの閾値関係のチュートリアルはこちらにあります。

閾値処理のみ閾値処理+軸の入れ替え
イメージ説明イメージ説明イメージ説明

Python

1 2# -*- coding: utf-8 -*- 3import cv2 4import numpy as np 5 6img = cv2.imread("original.png") 7cv2.imshow("ORIGINAL",img) 8 9# 色を分割 10b,g,r = cv2.split(img) 11 12# 以下、マスク処理 13#################### 14# マスク処理の実体 15mask =( b > 200) & (g < 200) 16# マスクに従って塗りつぶし 17img_masked = cv2.bitwise_and(img,img,mask=mask.astype(np.uint8)) 18 19# 軸の入れ替えを追加する場合 20#################### 21# B --> R 22b,g,r = cv2.split(img_masked) 23img_masked_change = cv2.merge((r,g,b)) 24#################### 25 26# 表示関係 27cv2.imshow("MASKED",img_masked ) 28cv2.imshow("MASKED-CHANGE", img_masked_change) 29cv2.imwrite("masked.png",img_masked) 30cv2.imwrite("masked_change.png", img_masked_change) 31 32cv2.waitKey(0)

BGRの入れ替えだけでしたらこんな感じで

BeforeAfter
イメージ説明イメージ説明

Python

1# -*- coding: utf-8 -*- 2import cv2 3import numpy as np 4 5img = cv2.imread("lenna.png") 6cv2.imshow("TEST",img) 7cv2.waitKey(0) 8 9b,g,r = cv2.split(img) 10 11# BGR --> BRG 12img = cv2.merge((b,r,g)) 13 14cv2.imshow("TEST",img) 15cv2.waitKey(0)

投稿2017/11/13 10:53

編集2017/11/13 22:33
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問