###前提・実現したいこと
プログラミング初心者です。Windows10、Python3.6、OpenCV環境で
画像ファイルを読み込むダイアログ→未変換状態の画像を表示
ボタンを押すと画像をグレースケール等処理する→処理した画像を元画像とは別で表示(並べて見比べられる様な感じに)したいです。
askopenfilenameからcv2.imshowで元画像の表示までは出来たのですが、そこから先がうまく行きません。
元画像でaskopenfilenameでパスを取ってると思うので以降それを参照、cv2の処理をしたいのですがどこが駄目なのでしょうか。
エラーメッセージはダイアログから画像選択→元画像表示→ボタンを押した時に出ます
cray_scale(event)へ修正したのですが、またエラーメッセージが出てしましました。
###発生している問題・エラーメッセージ
Exception in Tkinter callback Traceback (most recent call last): File "C:\Python36\lib\tkinter\__init__.py", line 1699, in __call__ return self.func(*args) File "C:\Python36(略), line 29, in gray_scale img_gray = cv2.imread(filename, cv2.IMREAD_GRAYSCALE) NameError: name 'filename' is not defined
###該当のソースコード
from PIL import Image import tkinter.filedialog as tkfd import cv2, tkinter, numpy root = tkinter.Tk() root.title("選択画像") def imgselect(): filename = tkinter.filedialog.askopenfilename(filetypes=[("画像ファイル", (".gif", ".png", ".jpg" ))]) img = cv2.imread(filename) cv2.imshow("Image",img) menubar = tkinter.Menu(root) filemenu = tkinter.Menu(menubar,tearoff=0) menubar.add_cascade(label="ファイル", menu=filemenu) filemenu.add_command(label="新しい画像",command=imgselect) filemenu.add_separator() filemenu.add_command(label="閉じる",command=exit) root.config(menu=menubar) def gray_scale(event): img_gray = cv2.imread(filename, cv2.IMREAD_GRAYSCALE) cv2.imshow("Gray Scale",img_gray) button1 = tkinter.Button(root, text="グレースケール", width=20) button1.bind("<Button-1>", gray_scale) button1.grid(row=0,column=0) root.mainloop()
ボタンを押した際の動作の設定ができないのですか?だとしたら、何を使ってボタンを作成しているかを教えてください。それとも色の変換ができないんですか?または、別ウインドウで画像を表示することができないのですか?質問がどれか分かりません。
途中で投稿してしまった為質問文修正しました。よければお願いします。
ソースコードを全体文、現在のエラーメッセージ修正しました。メニューバーからダイアログで画像選択で表示までは動くのですが、その後ボタンでgray_scaleを動かそうとするとエラーメッセージの通りfilename(パス)が無いとなってます。imgselectが終わるとaskopenfilenameで取り出したパスは消えてしまうのでしょうか? パスを取っておいて他ボタンでの処理でも使う方法はありますか?(メニューバーのダイアログから元画像表示、その後はボタン押しただけでcv2.imreadでグレースケールや二値化の処理というのをやりたいです)