新着情報
1-2-(a) プロトタイプGUI画像処理システム(protoGUIsystem.py)
(2a) プロトタイプGUI画像処理システム(protoGUIsystem.py)について説明する。
基本的にはGUI画像表示プログラムの拡張である。
importするpythonのライブラリモジュールは今後の使用も考慮して余分に定義している。
self.master.minsize(1000,400) : Window窓枠のサイズの横幅を2つのFrame枠が水平方向に配置できる様に大きく広げる。
左のFrame Widgetに配置するLabel widgetをlaとし、右のFrame Widgetに配置するLabel widgetをla2と定義している。
メニューバーとしてはファイル(F)と編集(E)の2つを考慮し、ファイルには’開く(F)’, ‘保存’, ‘終了’のメニュー項目を付加し、
編集には’2値化’,’エッジ検出’,’モノクロ’,’色相反転’のメニュー項目を付加している。各メニュー項目が選択されると対応する
イベント関数が実行されることになる。
Windowには5つのButton widgetをself.button_1, self.button_2, …, self.button_5として配置し、それぞれ’2値化’,’エッジ検出’,
‘モノクロ’,’色相反転’,’終了’のtextを貼り付けている。各ボタン項目が選択されると対応するイペント関数が実行される。
イベント関数 def open(self)では
filename = filedialog.askopenfilename()により、対話的に選択するためのディレクトリ・ダイアログが提示されて対象画像ファイルの選択が可能となる。
また、イベント関数 def save(self)では
currentdir=os.path.dirname(__file__) により、実行されているプログラムのあるカレントディレクトリが検出でき、
filename = filedialog.asksaveasfilename(initialdir = currentdir,title = ‘Name for save file’,
filetypes = ((‘jpeg files’,’*.jpg’),(‘all files’,’*.*’)))
により、対話的に保存ファイル名を入力するためのディレクトリ・ダイアログが提示される。
このプロトタイプGUIプログラムでは5個のボタン・ウィジットをWindow画面に配置している。
ボタン・ウィジットの数を増やし、画像処理項目の充実を図ることにより、プロトタイプGUIシステムの改良は可能である。
#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Created on Tue Mar 12 10:44:33 2019 @author: PBK-**** """ from tkinter import * from tkinter import filedialog from tkinter import messagebox from matplotlib import pyplot as plt import sys import os import os.path import numpy as np import cv2 from PIL import Image, ImageTk import time class Window(Frame): def __init__(self,master=None): #フレーム Frame.__init__(self, master) self.master.title('画像処理システム') self.master.minsize(1000,400) # self.filename=None #メニューバー self.menu_bar = Menu(self.master,tearoff = False) self.master.config(menu=self.menu_bar) self.menu_file = Menu(self.menu_bar,tearoff = False) self.menu_edit = Menu(self.menu_bar,tearoff = False) self.menu_bar.add_cascade(label='ファイル(F)', menu=self.menu_file, underline=5) self.menu_file.add_command(label='開く', command=self.open, underline=3, accelerator = 'Ctrl-O') self.menu_file.add_command(label='保存', command=self.save, underline=5, accelerator = 'Ctrl-N') self.menu_file.add_separator() self.menu_file.add_command(label='終了', command=self.quit, underline=5, accelerator = 'Ctrl-N') self.menu_bar.add_cascade(label='編集(E)', menu=self.menu_edit, underline=5) self.menu_edit.add_command(label='二値化', command=self.nichi) self.menu_edit.add_command(label='エッジ検出', command=self.edge) self.menu_edit.add_command(label='モノクロ', command=self.monokuro) self.menu_edit.add_command(label='色調反転', command=self.hanten) self.image1 = PhotoImage() self.image2 = PhotoImage() #ラベル1 self.la = Label(self,image=self.image1,bg='#44aaaa', width=400, height=400) self.la.pack(side=LEFT,padx=50, pady=90) #ラベル2 self.la2 = Label(self,image=self.image2, bg='#44aaaa', width=400, height=400) self.la2.pack(side=LEFT,padx=10, pady=90) #ボタン self.button_1 = Button(self,text='二値化',command=self.nichi,width=10).pack(side=TOP,padx=50, pady=15,anchor=W) self.button_2 = Button(self,text='エッジ検出',command=self.edge,width=10).pack(side=TOP,padx=50, pady=15,anchor=W) self.button_3 = Button(self,text='モノクロ',command=self.monokuro,width=10).pack(side=TOP,padx=50, pady=15,anchor=W) self.button_4 = Button(self,text='色調反転',command=self.hanten,width=10).pack(side=TOP,padx=50, pady=15,anchor=W) self.button_5 = Button(self,text='終了',command=self.quit,width=10).pack(side=TOP,padx=50, pady=15,anchor=W) #終了 def quit(self): if messagebox.askokcancel('Confirm Close', 'Are you sure you want to close?'): self.master.destroy() #開く def open(self): global filename global filename2 global size size=400,400 filename = filedialog.askopenfilename() if filename != "": im = Image.open(filename) im.thumbnail(size, Image.ANTIALIAS) if im.mode == '1': # 1 bitmap image self.image1 = ImageTk.BitmapImage(im, foreground="white") else: # color photo image self.image1 = ImageTk.PhotoImage(im) self.la.config(image=self.image1,text='Original Image', width=self.image1.width(), height=self.image1.height(),compound=TOP) #保存 def save(self): global filename global filename2 currentdir=os.path.dirname(__file__) filename = filedialog.asksaveasfilename(initialdir = currentdir,title = 'Name for save file', filetypes = (('jpeg files','*.jpg'),('all files','*.*'))) cv2.imwrite(filename,filename2) # cv2.imwrite('result.jpg',filename2) #二値化 def nichi(self): global filename global filename2 global size filename2 = cv2.imread(filename,0); filename2 = cv2.adaptiveThreshold(filename2,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,11,2) cv2.imwrite('nichika.jpg',filename2) im2 = Image.open('nichika.jpg') im2.thumbnail(size,Image.ANTIALIAS) self.image2 = ImageTk.PhotoImage(im2) self.la2.config(text="binary image",image=self.image2, width=self.image2.width(), height=self.image2.height(),compound=TOP) #モノクロ処理 def monokuro(self): global filename global filename2 global size filename2 = cv2.imread(filename,0) cv2.imwrite('gray.jpg',filename2) im2 = Image.open('gray.jpg') im2.thumbnail(size,Image.ANTIALIAS) self.image2 = ImageTk.PhotoImage(im2) self.la2.config(image=self.image2, width=self.image2.width(), height=self.image2.height()) #エッジ検出 def edge(self): global filename global filename2 gray = cv2.imread(filename,0) # cannyアリゴリズムによるエッジ検出 filename2 = cv2.Canny(gray,100,200) cv2.imwrite('edgebyCanny.jpg',filename2) im2 = Image.open('edgebycanny.jpg') im2.thumbnail(size,Image.ANTIALIAS) self.image2 = ImageTk.PhotoImage(im2) self.la2.config(image=self.image2, width=self.image2.width(), height=self.image2.height()) #色調反転 def hanten(self): global filename global filename2 im = cv2.imread(filename) filename2 = 255 - im cv2.imwrite('colorreverse.jpg',filename2) im2 = Image.open('colorreverse.jpg') im2.thumbnail(size,Image.ANTIALIAS) self.image2 = ImageTk.PhotoImage(im2) self.la2.config(image=self.image2, width=self.image2.width(), height=self.image2.height()) if __name__ == '__main__': root = Window() root.pack() root.mainloop()