Python数字图像处理GUI程序简易版

使用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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值