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

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

wxPython程序结构

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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(),你可以在以下代码相应的位置更换成你自己的图像处理程序,也可以更改按钮的数量、更改界面的布局等。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# -*- 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__()中定义了三个按钮,然后定义了用户点击这三个按钮对应的操作。以及上述代码中还有我自定义的方法,读者在实际中可以按需更改。