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

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

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

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

Python

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

Q&A

解決済

2回答

1979閲覧

画像全体を補色に変換したい

potapotapotato

総合スコア13

OpenCV

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

Python

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

0グッド

0クリップ

投稿2021/11/02 08:58

前提・実現したいこと

画像を読み込んで、全画素を補色に変更したく、pythonでプログラムを作っています。
簡単に言うとネガポジ反転の補色バージョンみたいな感じにしたいです。
下に示した問題を解決できるようにご教授願います。

補色の計算式は以下の通りです。ここでいうmax、minはR,G,Bの中の最大値と最小値です。
R’=(Max+Min)-R
G’=(Max+Min)-G
B’=(Max+Min)-B

算出法の原理などはこちら

発生している問題・エラーメッセージ

現在、1×1pxの画像なら変換できるのですが、RGBの中身が複数あることによってこのプログラムじゃダメ見たいです。
1×1px以外の普通の画像でも全体を補色に変換できるにはどうすればよいか、
どんなアプローチをしていけばいいか、ご協力をお願いします。

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

該当のソースコード

python

1import cv2 2import numpy as np 3 4img = cv2.imread('C:/Users/potatato/Desktop/aaa.png') # 画像読み込み 5b,g,r = cv2.split(img) # 色分解 6 7max_rgb = max(r,g,b) #RGB最大 8min_rgb = min(r,g,b) #RGB最小 9 10#補色計算 11r = (max_rgb+min_rgb)-r 12g = (max_rgb+min_rgb)-g 13b = (max_rgb+min_rgb)-b 14 15img_hosyoku = cv2.merge((b, g, r)) # bgr順に色結合 16 17cv2.imwrite("C:/Users/potatato/Desktop/hosyoku.png",img_hosyoku) #保存

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

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

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

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

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

guest

回答2

0

自己解決

もともと行っていた方法で、下記のように1pxずつ処理をすることにより
解決することができました。
質問にかかわっていただいた皆様、
解決のために手伝っていただいた友人。
皆様ありがとうございました。

python

1import cv2 2import numpy as np 3from PIL import Image 4 5img = Image.open('C:/Users/potatato/Desktop/qw.png') # 画像読み込み 6img = img.convert('RGB') 7size = img.size 8img2 = Image.new('RGB',size) 9for x in range(size[0]): 10 #y 11 for y in range(size[1]): 12 #ピクセルを取得 13 r,g,b = img.getpixel((x,y)) 14 15 #最大最小取得 16 max_rgb = max(r,g,b) #RGB最大 17 min_rgb = min(r,g,b) #RGB最小 18 19 #補色計算 20 r = (max_rgb+min_rgb)-r 21 g = (max_rgb+min_rgb)-g 22 b = (max_rgb+min_rgb)-b 23 24 #set pixel 25 img2.putpixel((x,y),(r,g,b,0)) 26 27 28img2.save("C:/Users/potatato/Desktop/hosyoku.png")

投稿2021/11/04 05:29

potapotapotato

総合スコア13

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

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

0

以下のようにします。

python

1import cv2 2 3img = cv2.imread('C:/Users/potatato/Desktop/aaa.png') # 画像読み込み 4 5img_HSV = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) 6img_HSV[:,:,0] = 179 - img_HSV[:,:,0] 7img_hosyoku = cv2.cvtColor(img_HSV, cv2.COLOR_HSV2BGR) 8 9cv2.imwrite("C:/Users/potatato/Desktop/hosyoku.png",img_hosyoku) #保存

上記は間違っていました。以下の方が正しいです。
色相を180度回転しています。

python

1import cv2 2 3img = cv2.imread('C:/Users/potatato/Desktop/aaa.png') # 画像読み込み 4 5img_HSV = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) 6img_HSV[:,:,0] = (img_HSV[:,:,0] + 180) % 180 7img_hosyoku = cv2.cvtColor(img_HSV, cv2.COLOR_HSV2BGR) 8 9cv2.imwrite("C:/Users/potatato/Desktop/hosyoku.png",img_hosyoku) #保存

投稿2021/11/02 10:02

編集2021/11/02 10:47
ppaul

総合スコア24666

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

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

potapotapotato

2021/11/04 00:37

ありがとうございます。 自分の提示した式の算出ページにも色相を180度変えてもできるって書いてましたね、、 RGBでのアプローチしか考えてなかった視野の狭さが恥ずかしいです。 ありがとうございました!
fana

2021/11/04 04:17 編集

同じ話が再び別質問になっています https://teratail.com/questions/367673 この回答の内容では正常な結果を生じないらしいので, ここにたどり着いた第三者にそのことがわかるように…という意味で低評価を入れておきます.
jbpb0

2021/11/04 10:16 編集

> 同じ話が再び別質問になっています 別質問でのfanaさんの指摘と、その対策 (別質問消えてるので) > H+180 がオーバーフローするんじゃない? してます > それ以前に,180足してから180での剰余を取るって意味なくない? 90を足すか引くかします (90足して180での剰余を取る) > そもそもHの値域を把握していないんじゃないの? OpenCVでは0〜179です https://opencv24-python-tutorials.readthedocs.io/en/stable/py_tutorials/py_imgproc/py_colorspaces/py_colorspaces.html 以上を踏まえた変更 img_HSV[:,:,0] = (img_HSV[:,:,0] + 180) % 180 ↓ 修正 img_HSV[:,:,0] = ((img_HSV[:,:,0].astype('uint16') + 90) % 180).astype('uint8')
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問