现TK界面中选择输入单张图片进行基于基于连通区域的字符分割方法分割单张图片多个数字以及图像预处理,处理过程显示并保存的界面设计,以完整的Python代码实现
时间: 2023-07-14 19:12:51 浏览: 127
以下是一个基于Tkinter界面的数字字符分割和预处理工具的Python代码示例:
```python
import tkinter as tk
from tkinter import filedialog
from PIL import Image, ImageTk
import cv2
import numpy as np
class DigitSeparator:
def __init__(self):
self.root = tk.Tk()
self.root.title("数字字符分割与预处理工具")
self.root.geometry("800x600")
# Create UI elements
self.canvas = tk.Canvas(self.root, width=400, height=400)
self.canvas.place(relx=0.5, rely=0.2, anchor="center")
self.btn_load = tk.Button(self.root, text="加载图片", command=self.load_image)
self.btn_load.place(relx=0.5, rely=0.05, anchor="center")
self.btn_process = tk.Button(self.root, text="处理图片", command=self.process_image)
self.btn_process.place(relx=0.5, rely=0.9, anchor="center")
self.lbl_output = tk.Label(self.root, text="")
self.lbl_output.place(relx=0.5, rely=0.95, anchor="center")
self.image = None
self.img_cv = None
self.img_processed = None
self.root.mainloop()
def load_image(self):
filepath = filedialog.askopenfilename(title="选择一张图片", filetypes=[("Image files", "*.jpg *.jpeg *.png")])
if filepath:
self.image = Image.open(filepath)
self.img_cv = cv2.imread(filepath, cv2.IMREAD_GRAYSCALE)
# Display the image on canvas
img_tk = ImageTk.PhotoImage(self.image)
self.canvas.create_image(200, 200, image=img_tk)
self.canvas.image = img_tk
def process_image(self):
if self.img_cv is None:
self.lbl_output.config(text="请先加载图片!")
return
# Preprocess the image
img_blur = cv2.GaussianBlur(self.img_cv, (5, 5), 0)
img_thresh = cv2.threshold(img_blur, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]
# Find contours and extract digits
contours, hierarchy = cv2.findContours(img_thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
digits = []
for cnt in contours:
x, y, w, h = cv2.boundingRect(cnt)
if w > 10 and h > 30:
digit = self.img_cv[y:y+h, x:x+w]
digit = cv2.resize(digit, (28, 28))
digit = np.asarray(digit)
digit = digit.reshape((1, 28, 28, 1))
digits.append(digit)
# Display the processed image on canvas
self.img_processed = Image.fromarray(cv2.cvtColor(img_thresh, cv2.COLOR_GRAY2RGB))
img_tk = ImageTk.PhotoImage(self.img_processed)
self.canvas.create_image(200, 200, image=img_tk)
self.canvas.image = img_tk
# Save extracted digits
for i, digit in enumerate(digits):
filename = f"digit_{i}.png"
cv2.imwrite(filename, digit[0])
self.lbl_output.config(text=f"成功提取 {len(digits)} 个数字!")
if __name__ == "__main__":
DigitSeparator()
```
这个工具的界面非常简单,只包含一个画布用于显示图片,两个按钮用于加载和处理图片,以及一个标签用于显示输出信息。在加载图片时,用户可以选择任何一张支持的图片格式,该工具将自动在画布上显示该图像。在处理图片时,该工具将首先对图像进行高斯平滑和二值化处理,然后使用OpenCV的findContours函数查找图像中的连通区域,并提取其中的数字字符。提取的数字将被保存为单独的PNG图像文件,并在标签上显示提取的数字数量。最终处理后的图像也将在画布上显示出来。
这个工具可以作为数字字符识别系统的预处理步骤,它可以帮助我们从原始图像中提取出每个数字字符,供后续的OCR算法使用。
阅读全文