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

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

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

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

Python 3.x

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

Python

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

Q&A

解決済

1回答

766閲覧

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/27 01:52

編集2023/01/27 02:33

前提

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

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

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

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

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

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

can110

2023/01/27 02:06 編集

ぱっと見て前の質問と同じく値の型が違うのが原因かと思ったのですが その点についてどうお考えか(~なのでそうではない、など)を質問本文に記載ください。
asahi555

2023/01/27 02:34 編集

コメントありがとうございます。 質問へ追記させていただきました。 コメントしていただいた意図と違いましたら申し訳ございません。
can110

2023/01/27 03:47

状況がよく分からないのですが 原因が分かって修正したら直ったが、別のところで違うエラーが出るようになった という感じでしょうか?
jbpb0

2023/01/27 12:58

> cvs2.create_image(0, 0, image=gim, anchor=tk.NW)の上へ pim3 = Image.fromarray(gim) tim3 = ImageTk.PhotoImage(pim3) というコードを追記しcanvas.create_images()を実行可能にできるようにしました とは、 cvs2.create_image(0, 0, image=gim, anchor=tk.NW) ↓ 修正 pim3 = Image.fromarray(gim) tim3 = ImageTk.PhotoImage(pim3) cvs2.create_image(0, 0, image=tim3, anchor=tk.NW) を行った、ということでしょうか?
asahi555

2023/01/27 15:25

>can110さん 前回質問させてただいた事を受けてデータの変更を行ったが同じエラーメッセージが出力され、どうすればよいのかわからないという状況です。
asahi555

2023/01/27 15:25

>jbp0さん はい。その認識で間違いございません。
jbpb0

2023/01/27 23:39

その修正をして、当方のmacのpythonで実行してみたら、 > Gim[i][0] = 255 * (float(i)/255) ** (1.0/gamma) > TypeError: unsupported operand type(s) for /: 'float' and 'str' > のエラーメッセージが修正されません ではなく、 Gim[i][0] = 255 * (float(i)/255) ** (1.0 /gamma) ZeroDivisionError: float division by zero というエラーが出ました そこで、プログラム開始時点で「gamma」が「0」にならないように num02 =tk.IntVar() num02.set(0) ↓ 修正 num02 =tk.DoubleVar() num02.set(2.2) の修正もしたら、(スライダーを「0.0」に動かさなければ)エラーは出なくなりました
asahi555

2023/01/28 01:26

ありがとうございます。 それに加えてgamma=num02.get()を def Gnm(num02): ~~~ gamma = float(num02) ~~~ としましたところエラーメッセージは出力されず、確認のため記述したprint(gamma)にてスライダーの値が出力されました。
jbpb0

2023/01/28 08:23 編集

当方のmacのpythonでは、「gamma = num02.get()」のままで、そのすぐ下に「print(gamma)」を追加して実行したら、スライダーの数値が表示されました 質問者さんの環境と当方の環境で、何が違うのでしょうね? コード中で「num02」に関するのは、他には num02 =tk.DoubleVar() num02.set(2.2) だけですよね? 【追記】 質問者さんの環境のpythonで下記のコードを実行したら、何て表示されますでしょうか? import tkinter as tk root = tk.Tk() num02 =tk.DoubleVar() num02.set(2.2) gamma = num02.get() print(type(gamma)) print(gamma) 当方のmacのpythonでは、下記の通りです >>> print(type(gamma)) <class 'float'> >>> print(gamma) 2.2
guest

回答1

0

ベストアンサー

cvs2.create_image(0, 0, image=gim, anchor=tk.NW)の上へ
pim3 = Image.fromarray(gim)
tim3 = ImageTk.PhotoImage(pim3)
というコードを追記しcanvas.create_images()を実行可能にできるようにしました

質問のコードから

python

1 cvs2.create_image(0, 0, image=gim, anchor=tk.NW)

↓ 修正

python

1 pim3 = Image.fromarray(gim) 2 tim3 = ImageTk.PhotoImage(pim3) 3 cvs2.create_image(0, 0, image=tim3, anchor=tk.NW)

の修正をして、当方のmacのpythonで実行してみたら、

Gim[i][0] = 255 * (float(i)/255) ** (1.0/gamma)
TypeError: unsupported operand type(s) for /: 'float' and 'str'
のエラーメッセージが修正されません

ではなく、

Gim[i][0] = 255 * (float(i)/255) ** (1.0 /gamma) ZeroDivisionError: float division by zero

というエラーが出ました

 
そこで、プログラム開始時点で「gamma」が「0」にならないように

python

1num02 =tk.IntVar() 2num02.set(0)

↓ 修正

python

1num02 =tk.DoubleVar() 2num02.set(2.2)

の修正もしたら、(スライダーを「0.0」に動かさなければ)エラーは出なくなりました

投稿2023/01/29 13:06

編集2023/01/29 13:10
jbpb0

総合スコア7653

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問