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

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

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

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

Python 3.x

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

Python

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

Q&A

解決済

2回答

896閲覧

pythonでの画像編集(ガンマ変換)

asahi555

総合スコア7

OpenCV

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

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2023/01/26 22:37

前提

pythonでopencvを使用した画像編集用システムを作っています。
ガンマ変換を行う機能を実装中に以下のエラーメッセージが発生しました。
pythonを使用し始めたばかりのため不自然な部分も多いかと思いますがよろしくお願いいたします。

  • スライダーを使用し読み込んだ画像を、リアルタイムで編集されることを目的としております。

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

Exception in Tkinter callback Traceback (most recent call last): File "C:\Users\wbnw\AppData\Local\Programs\Python\Python311\Lib\tkinter\__init__.py", line 1948, in __call__ return self.func(*args) ^^^^^^^^^^^^^^^^ File "c:\Users\wbnw\OneDrive\デスクトップ\works\name\Python\take_system.py", line 97, in Gnm nim = cv2.cvtColor(tim2, cv2.COLOR_RGB2BGR) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ cv2.error: OpenCV(4.7.0) :-1: error: (-5:Bad argument) in function 'cvtColor' > Overload resolution failed: > - src is not a numpy array, neither a scalar > - Expected Ptr<cv::UMat> for argument 'src'

該当のソースコード

python

1import cv2 2import tkinter as tk 3from tkinter import filedialog 4import numpy as np 5from PIL import Image, ImageTk 6import math 7 8img = cv2.imread('pic/takeshi.jpg') 9 10rim = cv2.cvtColor(Img, cv2.COLOR_BGR2RGB) 11pim = Image.fromarray(rim) 12tim = ImageTk.PhotoImage(pim) 13rim2 = cv2.cvtColor(Img2, cv2.COLOR_BGR2RGB) 14pim2 = Image.fromarray(rim2) 15tim2 = ImageTk.PhotoImage(pim2) 16 17Gim = np.zeros((256,1),dtype=np.uint8) 18def Gnm(event=None): 19 global tim2 20 global nim 21 nim = cv2.cvtColor(tim2, cv2.COLOR_RGB2BGR) 22 while(1): 23 gamma = num02.get() 24 for i in range(256): 25 Gim[i][0] = 255 * (float(i)/255) ** (1.0 /gamma) 26 gim = cv2.LUT(nim, Gim) 27 cvs2.create_image(0, 0, image=gim, anchor=tk.NW) 28 29 k = cv2.waitKey(1) 30 if k == 27: 31 break 32 33sfr.bind("<Enter>", Gnm) 34 35num02 =tk.IntVar() 36num02.set(0) 37 38root = tk.Tk() 39root.title("TestPage") 40root.geometry("1920x1080+50+50") 41 42sfr = tk.Frame(root, relief=tk.FLAT, bg="white" , bd=2) 43sfr.place(x=1110, y=530, width=500, height=510) 44 45scl2 = tk.Scale(sfr, variable=num02, orient='horizontal', length=475, from_=0, to=5, resolution=0.1, command=Gnm) 46scl2.place(x=5, y=85) 47 48root.mainloop() 49cv2.waitKey(0) 50cv2.destroyAllWindows()

試したこと

trackbarやPLT等は試しましたが最終的な完成イメージと異なったため使用しておりません。
また、ソースコードに関してはガンマ変換部分のみ記載しています。

補足情報(FW/ツールのバージョンなど)

Python3.11.1 64-bit

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

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

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

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

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

jbpb0

2023/01/27 00:40

下記は、何でしょうか? ・「rim = cv2.cvtColor(Img, cv2.COLOR_BGR2RGB)」の「Img」 ・「rim2 = cv2.cvtColor(Img2, cv2.COLOR_BGR2RGB)」の「Img2」
asahi555

2023/01/27 00:48

記載漏れです。申し訳ありません... img = cv2.imread('pic/takeshi.jpg') の後に下記を記述しております。 ==================== h0, w0 = img.shape[:2] n = 450 N = 1010 h = round(h0) w =round(w0) if w > h: x = round(float(n) / w, 1) X = round(float(h * x)) Img = cv2.resize(img, (n, X)) H = X W = n x2 = round(float(N) / w, 1) X2 = round(float(h * x2)) Img2 = cv2.resize(img, (N, X2)) H2 = X2 W2 = N else: x = round(float(n) / h, 1) X = round(float(w * x)) Img = cv2.resize(img, (X, n)) H = n W = X x2 = round(float(N) / h, 1) X2 = round(float(w * x2)) Img2 = cv2.resize(img, (X2, N)) H2 = N W2 = X2
jbpb0

2023/01/27 00:57 編集

> File "c:\Users\wbnw\OneDrive\デスクトップ\works\name\Python\take_system.py", line 97, in Gnm nim = cv2.cvtColor(tim2, cv2.COLOR_RGB2BGR) エラーになってる「nim = cv2.cvtColor(tim2, cv2.COLOR_RGB2BGR)」のすぐ上に、インデントを合わせて print(type(tim2)) を追加して実行したら、何て表示されますでしょうか? > > - src is not a numpy array, neither a scalar 「tim2」が「numpy配列」でも「スカラー」でもない、のがエラーの原因ですが、 > tim2 = ImageTk.PhotoImage(pim2) だから、そうですよね
asahi555

2023/01/27 00:59 編集

Exception in Tkinter callback Traceback (most recent call last): File "C:\Users\wbnw\AppData\Local\Programs\Python\Python311\Lib\tkinter\__init__.py", line 1948, in __call__ return self.func(*args) ^^^^^^^^^^^^^^^^ File "c:\Users\wbnw\OneDrive\デスクトップ\works\name\Python\take_system.py", line 96, in Gnm nim = cv2.cvtColor(tim2, cv2.COLOR_RGB2BGR) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ cv2.error: OpenCV(4.7.0) :-1: error: (-5:Bad argument) in function 'cvtColor' > Overload resolution failed: > - src is not a numpy array, neither a scalar > - Expected Ptr<cv::UMat> for argument 'src' とエラーメッセージが出力されました
jbpb0

2023/01/27 01:06 編集

print(type(tim2)) を、「nim = cv2.cvtColor(tim2, cv2.COLOR_RGB2BGR)」のすぐ「上」に追加して実行しましたか? > cv2.error: OpenCV(4.7.0) :-1: error: (-5:Bad argument) in function 'cvtColor' のエラーが出る前に「print(type(tim2))」が実行されるはずなので、その結果が何か表示されるはずなのですが (エラーは消えませんよ) 【追記】 上記を再確認しても、「print(type(tim2))」の結果が見当たらないなら、 tim2 = ImageTk.PhotoImage(pim2) のすぐ「下」に print(type(tim2)) を追加して実行してみてください
asahi555

2023/01/27 01:07 編集

申し訳ありません。 下へ記述してしまっておりました。 <class 'PIL.ImageTk.PhotoImage'> との結果でした。
jbpb0

2023/01/27 01:17 編集

> <class 'PIL.ImageTk.PhotoImage'> 前のコメントにも書きましたが、「numpy配列」か「スカラー」じゃないと、「cv2.cvtColor()」は実行できません 質問のコード中だと、「img」「rim」「Img」「rim2」「Img2」とかが該当します 「def Gnm(event=None):」で処理したいデータは、どれでしょうか? (「tim2」に名前が似てる「rim2」かな?)
asahi555

2023/01/27 01:20

Img2,rim2,pim2,tim2が画像のリサイズ後のデータになるのでこれらの画像を処理したいと考えております。 キャンバスへ画像を配置するためImg2→rim2→pim2→tim2と 処理を重ねているのでtim2を処理したいと考えております。 tim2をnumpy配列もしくはスカラーへ変換すればよいのでしょうか。
jbpb0

2023/01/27 01:23

「def Gnm(event=None):」内の二ヶ所の「tim2」を「rim2」に変えて実行したのでは、質問者さんの意図とは違う結果になるのでしょうか?
asahi555

2023/01/27 01:28

いえ!確かに画像データ自体は同じものなので問題ありません。 rim2へ変更し実行したところ別のエラーメッセージが出力されました。 Exception in Tkinter callback Traceback (most recent call last): File "C:\Users\wbnw\AppData\Local\Programs\Python\Python311\Lib\tkinter\__init__.py", line 1948, in __call__ return self.func(*args) ^^^^^^^^^^^^^^^^ File "c:\Users\wbnw\OneDrive\デスクトップ\works\name\Python\take_system.py", line 104, in Gnm cvs2.create_image(0, 0, image=gim, anchor=tk.NW) File "C:\Users\wbnw\AppData\Local\Programs\Python\Python311\Lib\tkinter\__init__.py", line 2846, in create_image return self._create('image', args, kw) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\wbnw\AppData\Local\Programs\Python\Python311\Lib\tkinter\__init__.py", line 2832, in _create return self.tk.getint(self.tk.call( ^^^^^^^^^^^^^ _tkinter.TclError: image "[[[238 240 235] [207 210 204] [180 184 177] ... [205 207 210] [205 207 210] [206 208 211]] [[241 243 238] [218 221 216] [184 187 182] ... [205 208 211] [205 207 210] [205 207 210]] [[241 243 239] [218 221 216] [187 190 186] ... [206 208 211] [205 207 210] [206 207 211]] ... [[242 242 246] [242 242 246] [242 242 247] ... [213 213 219] [214 214 220] [214 213 220]] [[241 241 246] [242 242 246] [243 243 247] ... [211 211 216] [212 212 218] [213 212 218]] [[241 241 246] [242 242 246] [243 243 247] ... [209 209 215] [210 210 217] [212 211 219]]]" doesn't exist
jbpb0

2023/01/27 01:36

> 別のエラーメッセージが出力されました。 それは、この質問のエラーが直って、コードの先に進んで新たに出た別のエラーなので、別の質問にしてください
asahi555

2023/01/27 01:37

承知致しました。 ありがとうございます。
guest

回答2

0

ベストアンサー

nim = cv2.cvtColor(tim2, cv2.COLOR_RGB2BGR)

  • src is not a numpy array, neither a scalar

「def Gnm(event=None):」内の二ヶ所の「tim2」を「rim2」に変えてみてください

投稿2023/01/27 01:42

jbpb0

総合スコア7651

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

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

0

cvtColorに渡しているデータがnumpy arrayではなくPIL.ImageTk.PhotoImageであることが原因です。

Python

1import tkinter as tk 2import cv2 3from PIL import Image, ImageTk 4 5root = tk.Tk() 6img = cv2.imread('temp.png') 7print(type(img)) # <class 'numpy.ndarray'> 8pim = Image.fromarray(img) 9print(type(pim)) # <class 'PIL.Image.Image'> 10tim = ImageTk.PhotoImage(pim) 11print(type(tim)) # <class 'PIL.ImageTk.PhotoImage'> 12 13#nim = cv2.cvtColor(tim, cv2.COLOR_RGB2BGR) # > - src is not a numpy array, neither a scalar

全体の処理の流れは分かりませんがPhotoImagecv2で画像処理したい場合はnumpy arrayに変換してやる必要があります。
参考:【Python】PIL ⇔ OpenCV2 ⇔ Tkinter 画像オブジェクトの相互変換

投稿2023/01/27 01:06

can110

総合スコア38266

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問