新着情報

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()

コメント投稿フォーム

メールアドレスが公開されることはありません。 が付いている欄は必須項目です