wxPython入门笔记(一)——一个图像处理demo带你轻松上手

github博客同步发布

wxPython是用python实现界面的东西,本文由简单图像处理demo带你快速上手,代码来自我的基于深度学习的漫画自动上色程序。模型训练参考他人成果,在此注明链接:deepcolor。当然,本文不涉及深度学习模块,只有wxPython demo。

wxPython程序结构

不唯一,以下只是我采用的写法:

import wx

class MyFrame(wx.Frame):
	def __init__(self):
		# 界面窗口初始化,包含界面名字和尺寸
        wx.Frame.__init__(self, None, title='这个程序的名字', size=(,))
        ...
        
	def ...
	
	...

if __name__ == '__main__':
	app = wx.App()
	frm = MyFrame()
	frm.Show()
	app.MainLoop()

main里面的四行中,用户只需要关心MyFrame(),其内容决定着这个界面的布局和功能,刚入门的用户也只需要专注于编写class MyFrame的省略号部分。

一个简单图像demo,只需关注MyFrame类的编写

结合注释理解代码,代码取自漫画自动上色程序,需要两个选择图片的按钮来选择一张线图和一张颜色图,还需要一个上色按钮,点击按钮,完成上色。其中上色功能有coloring(),你可以在以下代码相应的位置更换成你自己的图像处理程序,也可以更改按钮的数量、更改界面的布局等。

# -*- coding: utf-8 -*-

import wx
from useModel import *	# useModel中定义了我需要的图像上色方法,此部分你可以自行编写

# 选图按钮中使用到这个,这个是过滤器,只能选择过滤器指定格式的文件
# 由于是初学,所以我设定这个为可选择所有文件
filesFilter = "All files (*.*)|*.*"

class MyFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, title='coloring', size=(808, 400))
		
		# 定义一个选择图片的按钮,按钮名称、按钮左上角的位置和按钮的大小都需要自己设置
        b1 = wx.Button(self, -1, u"选择线图", pos=(98, 286), size=(80, 30))
        # 使用了预定义的事件绑定器对象wx.EVT_BUTTON来将按钮b1的单击事件
        # 与方法self.OnButton1相关联起来,下同。
        # 也就是说,用户点击按钮b1,将会转去运行OnButton1这个方法(在后面定义)
        self.Bind(wx.EVT_BUTTON, self.OnButton1, b1)

        b2 = wx.Button(self, -1, u"选择颜色", pos=(364,286), size=(80, 30))
        self.Bind(wx.EVT_BUTTON, self.OnButton2, b2)

        b3 = wx.Button(self, -1, u"开始上色", pos=(630, 286), size=(80, 30))
        self.Bind(wx.EVT_BUTTON, self.OnButton3, b3)

    # 点击按钮b1,获得线图的名字,并把线图显示在界面上
    def OnButton1(self, event):
    	# 定义按钮的名称和功能,wx.FD_OPEN代表这个按钮用于选择、打开文件
        dlg = wx.FileDialog(self, message ="选择线图", wildcard=filesFilter, style = wx.FD_OPEN)
        # 这个if的意思暂时不必深究,总之其下定义的就是用户点击按钮之后,会进行的操作
        if dlg.ShowModal() == wx.ID_OK:
            self.line_image_name = dlg.GetPath();   # 获得图片的路径
            self.line_image = cv2.imread(self.line_image_name)	# 利用cv2读图
            # 定义一个显示图片的控件
            self.PicShow1 = wx.StaticBitmap(self, -1, wx.NullBitmap, pos=(10, 20), size=(256, 256))
            # 定义图片,并在图中显示图片
            img = wx.Image(self.line_image_name, wx.BITMAP_TYPE_ANY).Scale(256, 256)
            self.PicShow1.SetBitmap(wx.Bitmap(img))

        dlg.Destroy()

    # 点击按钮b2,获得颜色图的名字,并把颜色图显示在界面上
    def OnButton2(self, event):
        dlg = wx.FileDialog(self, message=u"选择颜色", wildcard=filesFilter, style=wx.FD_OPEN)
        if dlg.ShowModal() == wx.ID_OK:
            self.color_image_name = dlg.GetPath();
            self.color_image = cv2.imread(self.color_image_name)
            self.PicShow2 = wx.StaticBitmap(self, -1, wx.NullBitmap, pos=(276, 20), size=(256, 256))
            img = wx.Image(self.color_image_name, wx.BITMAP_TYPE_ANY).Scale(256, 256)
            self.PicShow2.SetBitmap(wx.Bitmap(img))

    # 点击按钮b3,完成上色操作,并把结果图显示在界面上
    def OnButton3(self, event):
        self.generated_image = self.coloring(line_image_name=self.line_image_name,
                                             color_image_name=self.color_image_name)

        # 显示上好色的图片,目前只能做到现保存图片,再将图片读入并显示
        cv2.imwrite("result/result.png", self.generated_image)
        self.PicShow = wx.StaticBitmap(self, -1, wx.NullBitmap, pos=(542, 20), size=(256, 256))
        img = wx.Image('result/result.png', wx.BITMAP_TYPE_ANY).Scale(256, 256)
        self.PicShow.SetBitmap(wx.BitmapFromImage(img))

	# 调用useModel中的useModel方法,此部分你可以更换成你自己需要的
    def coloring(self, line_image_name, color_image_name):
        u = useModel(line_image_name, color_image_name)
        return u.get_generated_image()

if __name__ == '__main__':
    app = wx.App()
    frm = MyFrame()
    frm.Show()
    app.MainLoop()

小结一下,我是在__init__()中定义了三个按钮,然后定义了用户点击这三个按钮对应的操作。以及上述代码中还有我自定义的方法,读者在实际中可以按需更改。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章