实现TK界面中选择输入单张图片进行基于基于连通区域的字符分割方法分割单张图片多个数字以及图像预处理,处理过程显示并保存的界面设计,以完整的Python代码实现
时间: 2023-06-25 15:07:14 浏览: 42
以下是一个基于Tkinter实现的图像处理界面,可以选择一张图片进行字符分割和预处理,并将结果保存到本地。该程序使用了基于连通区域的字符分割方法。
```python
import tkinter as tk
from tkinter import filedialog
from PIL import Image, ImageTk
import cv2
import numpy as np
class Application():
def __init__(self, master):
self.master = master
self.master.title("字符分割与预处理")
self.master.geometry("800x600")
# 初始化变量
self.image_path = ""
self.result_path = ""
self.image = None
self.result = None
# 加载界面组件
self.load_widgets()
def load_widgets(self):
# 创建菜单栏
menubar = tk.Menu(self.master)
# 文件菜单
filemenu = tk.Menu(menubar, tearoff=0)
filemenu.add_command(label="打开", command=self.open_image)
filemenu.add_command(label="保存", command=self.save_result)
filemenu.add_separator()
filemenu.add_command(label="退出", command=self.master.quit)
menubar.add_cascade(label="文件", menu=filemenu)
# 帮助菜单
helpmenu = tk.Menu(menubar, tearoff=0)
helpmenu.add_command(label="关于", command=self.show_about)
menubar.add_cascade(label="帮助", menu=helpmenu)
self.master.config(menu=menubar)
# 创建界面组件
self.canvas = tk.Canvas(self.master, width=400, height=400)
self.canvas.pack(side=tk.LEFT, padx=10, pady=10)
self.result_canvas = tk.Canvas(self.master, width=400, height=400)
self.result_canvas.pack(side=tk.RIGHT, padx=10, pady=10)
self.process_button = tk.Button(self.master, text="处理", command=self.process_image)
self.process_button.pack(side=tk.BOTTOM, padx=10, pady=10)
def open_image(self):
# 打开文件对话框
self.image_path = filedialog.askopenfilename()
# 加载图像到画布
self.image = cv2.imread(self.image_path)
self.image = cv2.cvtColor(self.image, cv2.COLOR_BGR2RGB)
self.image = Image.fromarray(self.image)
self.image = ImageTk.PhotoImage(self.image)
self.canvas.create_image(0, 0, anchor=tk.NW, image=self.image)
def process_image(self):
# 图像预处理
gray = cv2.cvtColor(self.image_path, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))
opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=1)
# 字符分割
cnts = cv2.findContours(opening, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
x,y,w,h = cv2.boundingRect(c)
ROI = self.image[y:y+h, x:x+w]
cv2.rectangle(self.image, (x, y), (x + w, y + h), (36,255,12), 2)
# 加载结果到画布
self.result = Image.fromarray(self.image)
self.result = ImageTk.PhotoImage(self.result)
self.result_canvas.create_image(0, 0, anchor=tk.NW, image=self.result)
def save_result(self):
# 保存结果到本地文件
if self.result is not None:
self.result_path = filedialog.asksaveasfilename(defaultextension=".png")
self.result.save(self.result_path)
def show_about(self):
# 显示关于信息
about_window = tk.Toplevel(self.master)
about_window.title("关于")
about_label = tk.Label(about_window, text="字符分割与预处理 v1.0")
about_label.pack()
if __name__ == "__main__":
root = tk.Tk()
app = Application(root)
root.mainloop()
```
需要注意的是,上述代码只实现了基本的图像预处理和字符分割功能,可能需要根据实际需求进行调整。