前提
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\hello.py", line 78, 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 "[[[209 215 201] [138 144 131] [ 90 96 86] ... [133 138 144] [133 137 144] [136 139 145]] [[217 223 209] [160 166 155] [ 97 102 94] ... [134 139 145] [133 137 144] [134 137 144]] [[217 223 212] [160 166 156] [101 106 99] ... [135 140 146] [134 138 144] [135 138 145]] ... [[218 218 230] [219 219 231] [220 220 232] ... [150 150 162] [151 151 164] [151 150 164]] [[217 217 229] [219 219 231] [221 221 233] ... [145 145 157] [147 147 160] [149 147 161]] [[217 217 229] [219 219 231] [221 221 233] ... [141 141 153] [144 144 159] [147 146 162]]]" doesn't exist
該当のソースコード
python
1#ライブラリ 2#======================================== 3import cv2 4import tkinter as tk 5from tkinter import filedialog 6import numpy as np 7from PIL import Image, ImageTk 8import math 9 10#ウィンドウ/フレームの作成 11#======================================== 12root = tk.Tk() 13root.title("TestPage") 14root.geometry("1920x1080+50+50") 15 16frm = tk.Frame(root, width=1025, height=1025, padx=2, pady=2, bg="gray") 17frm.place(x=70, y=15) 18 19sfr = tk.Frame(root, relief=tk.FLAT, bg="white" , bd=2) 20sfr.place(x=1110, y=530, width=500, height=510) 21 22#画像の読み込み 23#======================================== 24img = cv2.imread('pic/test.jpg') 25 26#アスペクト比を固定しリサイズ 27#======================================== 28 29h0, w0 = img.shape[:2] 30n1 = 450 31n2 = 1010 32h = round(h0) 33w =round(w0) 34 35if w > h: 36 x2 = round(float(n2) / w, 1) 37 X2 = round(float(h * x2)) 38 Img2 = cv2.resize(img, (n2, X2)) 39 H2 = X2 40 W2 = n2 41else: 42 x2 = round(float(n2) / h, 1) 43 X2 = round(float(w * x2)) 44 Img2 = cv2.resize(img, (X2, n2)) 45 H2 = n2 46 W2 = X2 47 48 #画像の配置 49#======================================== 50rim2 = cv2.cvtColor(Img2, cv2.COLOR_BGR2RGB) 51pim2 = Image.fromarray(rim2) 52tim2 = ImageTk.PhotoImage(pim2) 53 54cvs2 = tk.Canvas(frm, width=1007, height=1007) 55cvs2.place(x=5, y=5) 56cvs2.create_image(0, 0, image=tim2, anchor=tk.NW) 57 58#todo:γ変換 59#======================================== 60Gim = np.zeros((256,1),dtype=np.uint8) 61def Gnm(event=None): 62 global rim2 63 global nim 64 gamma = num02.get() 65 for i in range(256): 66 Gim[i][0] = 255 * (float(i)/255) ** (1.0 /gamma) 67 gim = cv2.LUT(rim2, Gim) 68 cvs2.create_image(0, 0, image=gim, anchor=tk.NW) 69 70 #値の格納 71#======================================== 72num02 =tk.IntVar() 73num02.set(0) 74 75#スライダー 76#======================================== 77scl2 = tk.Scale(sfr, variable=num02, orient='horizontal', length=475, from_=0, to=5, resolution=0.1, command=Gnm) 78scl2.place(x=5, y=85) 79 80#処理 81#==================== 82root.mainloop() 83cv2.waitKey(0) 84cv2.destroyAllWindows()
試したこと
Gim = np.zeros((256,1),dtype=np.uint8) def Gnm(event=None): global tim2 global nim nim = cv2.cvtColor(tim2, cv2.COLOR_RGB2BGR) while(1): gamma = num02.get() for i in range(256): Gim[i][0] = 255 * (float(i)/255) ** (1.0 /gamma) gim = cv2.LUT(nim, Gim) cvs2.create_image(0, 0, image=gim, anchor=tk.NW) k = cv2.waitKey(1) if k == 27: break sfr.bind("<Enter>", Gnm)
と記述していましたがwhile文を削除致しました。
また、画像データがnumpyではなかったため修正致しました。
trackbarやPLT等は試しましたが最終的な完成イメージと異なったため使用しておりません。
また、ソースコードに関してはガンマ変換部分のみ記載しています。
<追記>
cvs2.create_image(0, 0, image=gim, anchor=tk.NW)の上へ
pim3 = Image.fromarray(gim)
tim3 = ImageTk.PhotoImage(pim3)
というコードを追記しcanvas.create_images()を実行可能にできるようにしましたが、
return self.func(*args)
Gim[i][0] = 255 * (float(i)/255) ** (1.0/gamma)
TypeError: unsupported operand type(s) for /: 'float' and 'str'
のエラーメッセージが修正されませんでした。
補足情報(FW/ツールのバージョンなど)
Python3.11.1 64-bit

回答1件
あなたの回答
tips
プレビュー