python
              复制代码
              
            
          
          import os
import tkinter
import cv2
from PIL import Image, ImageTk
from tkinter import filedialog, Frame
import numpy as np
class Application(Frame):
    def __init__(self, master=None):
        self.camera_height = 300
        self.camera_width = 500
        self.Source_Img_Label = None
        self.Source_Img = None
        self.py_path = os.path.abspath(os.path.dirname(__file__))
        Frame.__init__(self, master, bg='white')
        self.pack(expand=tkinter.YES, fill=tkinter.BOTH)
        self.window_init()
        self.String_var = tkinter.StringVar()
        self.createWidgets()
    def window_init(self):
        self.master.title('滤镜小程序')
        self.master.configure(bg='white')
        width, height = (self.camera_width, self.camera_height)
        self.master.geometry("{}x{}".format(width, height))
    def createWidgets(self):
        # 左侧面板:操作按钮
        self.fml = Frame(self, bg='white')
        self.fml_top = Frame(self.fml, bg='white')
        self.fml_buttons = Frame(self.fml, bg='white')
        # 文件路径输入框
        self.Img_Path_Text = tkinter.Entry(self.fml_top, textvariable=self.String_var, borderwidth=1, state=tkinter.DISABLED)
        self.Img_Path_Text.pack(side='left', fill=tkinter.X, expand=True)
        # 选择文件按钮
        self.Img_Path_Button = tkinter.Button(self.fml_top, text='选择', command=self.AskPicture)
        self.Img_Path_Button.pack(side='right', padx=5)
        # 功能按钮
        self.Outline_Button = tkinter.Button(self.fml_buttons, text='轮廓', command=self.outlinePicture)
        self.Outline_Button.pack(side='left', padx=5, expand=True)
        self.Sharpen_Button = tkinter.Button(self.fml_buttons, text='锐化', command=self.sharpenPicture)
        self.Sharpen_Button.pack(side='left', padx=5, expand=True)
        self.Emboss_Button = tkinter.Button(self.fml_buttons, text='浮雕', command=self.embossPicture)
        self.Emboss_Button.pack(side='left', padx=5, expand=True)
        self.fml_top.pack(side=tkinter.TOP, fill=tkinter.X)
        self.fml_buttons.pack(side=tkinter.TOP, fill=tkinter.X)
        self.fml.pack(side=tkinter.LEFT, fill=tkinter.Y)
        # 右侧面板:图像显示区域
        self.fm2 = Frame(self, bg='white')
        self.Source_Img_Label = tkinter.Label(self.fm2, bg='white', image=None, width=200, height=200)
        self.Source_Img_Label.image = None
        # 使用 pack 方法并设置 pady 参数以实现垂直居中
        self.Source_Img_Label.pack(side='top', pady=(self.camera_height - 200) // 2)
        self.fm2.pack(side=tkinter.LEFT, fill=tkinter.BOTH, expand=True)
    def CvtPIL(self, srcImg):
        Rgb_Img = cv2.cvtColor(srcImg, cv2.COLOR_BGR2RGB)  # 正确的颜色空间转换
        Rgb_Img = Image.fromarray(Rgb_Img)
        Rgb_Img = ImageTk.PhotoImage(Rgb_Img)
        self.Source_Img_Label.configure(image=Rgb_Img)
        self.Source_Img_Label.image = Rgb_Img
    def AskPicture(self):
        Picture_Path = filedialog.askopenfilename()
        if not Picture_Path:
            self.String_var.set('未选择文件')
            return
        self.String_var.set(Picture_Path)
        self.Source_Img = cv2.imread(Picture_Path)
        if self.Source_Img is None:
            self.String_var.set('文件读取错误')
            return
        self.CvtPIL(self.Source_Img)
    def outlinePicture(self):
        if self.Source_Img is None:
            self.String_var.set('文件选择错误')
            return
        kernel = np.array([[-1, -1, -1],
                           [-1, 8, -1],
                           [-1, -1, -1]], dtype="float32")
        dstimg = cv2.filter2D(self.Source_Img, -1, kernel)
        self.CvtPIL(dstimg)
    def embossPicture(self):
        if self.Source_Img is None:
            self.String_var.set('文件选择错误')
            return
        kernel = np.array([[-2, -1, 0],
                           [-1, 1, 1],
                           [0, 1, 2]], dtype="float32")
        dstimg = cv2.filter2D(self.Source_Img, -1, kernel)
        self.CvtPIL(dstimg)
    def sharpenPicture(self):
        if self.Source_Img is None:
            self.String_var.set('文件选择错误')
            return
        kernel = np.array([[-1, -1, -1],
                           [-1, 9, -1],
                           [-1, -1, -1]], dtype="float32")
        dstimg = cv2.filter2D(self.Source_Img, -1, kernel)
        self.CvtPIL(dstimg)
if __name__ == '__main__':
    app = Application()
    app.mainloop()