现TK界面中选择输入单张图片进行基于基于连通区域的字符分割方法分割单张图片多个数字以及图像预处理,处理过程显示并保存的界面设计,以完整的Python代码实现
时间: 2023-07-14 16:12:43 浏览: 154
图像字符分割
以下是一个基于Tkinter的图像处理界面,可以选择一张图片进行字符分割和预处理,并将处理过程显示出来并保存为图像文件。
```python
import tkinter as tk
from tkinter import filedialog
from PIL import Image, ImageTk
import cv2
import numpy as np
class Application(tk.Frame):
def __init__(self, master=None):
super().__init__(master)
self.master = master
self.pack()
self.create_widgets()
def create_widgets(self):
self.img_path = tk.StringVar()
self.img_path.set("")
self.choose_btn = tk.Button(self, text="选择图片", command=self.choose_image)
self.choose_btn.pack()
self.img_label = tk.Label(self)
self.img_label.pack()
self.process_btn = tk.Button(self, text="处理图片", command=self.process_image)
self.process_btn.pack()
self.result_label = tk.Label(self)
self.result_label.pack()
self.save_btn = tk.Button(self, text="保存结果", command=self.save_result)
self.save_btn.pack()
def choose_image(self):
self.img_path.set(filedialog.askopenfilename())
img = Image.open(self.img_path.get())
img = img.resize((500, 500))
img_tk = ImageTk.PhotoImage(img)
self.img_label.configure(image=img_tk)
self.img_label.image = img_tk
def process_image(self):
if self.img_path.get() == "":
return
img = cv2.imread(self.img_path.get(), cv2.IMREAD_GRAYSCALE)
img = self.preprocess(img)
contours, _ = cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for i, contour in enumerate(contours):
(x, y, w, h) = cv2.boundingRect(contour)
cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
img = cv2.cvtColor(img, cv2.COLOR_GRAY2RGB)
img = Image.fromarray(img)
img_tk = ImageTk.PhotoImage(img)
self.result_label.configure(image=img_tk)
self.result_label.image = img_tk
def preprocess(self, img):
img = cv2.GaussianBlur(img, (5, 5), 0)
_, img = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
kernel = np.ones((3, 3), np.uint8)
img = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
return img
def save_result(self):
if self.result_label.image != "":
file_path = filedialog.asksaveasfilename(defaultextension=".jpg")
img = self.result_label.image
img.save(file_path)
root = tk.Tk()
app = Application(master=root)
app.mainloop()
```
这个界面有以下几个功能:
1. 点击“选择图片”按钮可以选择一张图片进行处理;
2. 处理过程会显示在界面中间的一个Label中;
3. 点击“保存结果”按钮可以将处理结果保存为图像文件。
在处理图片时,我们使用了基于连通区域的字符分割方法,即通过寻找二值化图像中的连通区域来定位每个数字的位置。在这个例子中,我们使用了OpenCV的`cv2.findContours`函数来寻找连通区域,并使用矩形框将其框起来,最后显示在结果界面中。
在处理图片之前,我们对图像进行了一些预处理,包括高斯模糊、二值化、闭运算等操作,以便更好地定位数字。
阅读全文