使用Python自带Tkinter和PIL实现的数字图像处理GUI示例,支持打开、保存、灰度化、边缘检测和二值化功能。
import tkinter as tk
from tkinter import filedialog
from PIL import Image, ImageTk, ImageFilter
class ImageProcessorApp:
def __init__(self, root):
self.root = root
self.root.title("图像处理工具")
# 初始化变量
self.original_image = None
self.processed_image = None
self.filename = None
# 创建界面
self.create_widgets()
def create_widgets(self):
# 按钮框架
btn_frame = tk.Frame(self.root)
btn_frame.pack(pady=10)
# 功能按钮
tk.Button(btn_frame, text="打开", command=self.open_image).grid(row=0, column=0, padx=5)
tk.Button(btn_frame, text="保存", command=self.save_image).grid(row=0, column=1, padx=5)
tk.Button(btn_frame, text="灰度化", command=self.grayscale).grid(row=0, column=2, padx=5)
tk.Button(btn_frame, text="边缘检测", command=self.edge_detection).grid(row=0, column=3, padx=5)
tk.Button(btn_frame, text="二值化", command=self.binarize).grid(row=0, column=4, padx=5)
# 图像显示区域
self.original_label = tk.Label(self.root)
self.original_label.pack(side="left", padx=10, pady=10)
self.processed_label = tk.Label(self.root)
self.processed_label.pack(side="right", padx=10, pady=10)
def open_image(self):
self.filename = filedialog.askopenfilename()
if self.filename:
self.original_image = Image.open(self.filename)
self.show_image(self.original_image, self.original_label)
def show_image(self, image, label):
# 调整图像大小以适应显示
width, height = image.size
ratio = min(600/width, 400/height)
new_size = (int(width*ratio), int(height*ratio))
resized = image.resize(new_size, Image.Resampling.LANCZOS)
# 转换为Tkinter格式
tk_image = ImageTk.PhotoImage(resized)
# 更新显示
label.configure(image=tk_image)
label.image = tk_image # 保持引用
def save_image(self):
if self.processed_image:
save_path = filedialog.asksaveasfilename(defaultextension=".png")
if save_path:
self.processed_image.save(save_path)
def grayscale(self):
if self.original_image:
self.processed_image = self.original_image.convert("L")
self.show_image(self.processed_image, self.processed_label)
def edge_detection(self):
if self.original_image:
# 使用PIL内置边缘检测滤镜
edges = self.original_image.filter(ImageFilter.FIND_EDGES)
self.processed_image = edges
self.show_image(edges, self.processed_label)
def binarize(self, threshold=128):
if self.original_image:
# 先转为灰度图
gray = self.original_image.convert("L")
# 应用阈值
self.processed_image = gray.point(lambda p: 255 if p > threshold else 0)
self.show_image(self.processed_image, self.processed_label)
if __name__ == "__main__":
root = tk.Tk()
app = ImageProcessorApp(root)
root.mainloop()