gui测试图像预处理:对比度、亮度、伽马值、中值滤波、降噪处理,可保存调整后参数及图片,非常适合算法调试用。

import cv2
import numpy as np
import tkinter as tk
from tkinter import filedialog
from PIL import Image, ImageTk

class ImagePreprocessorApp:
    def __init__(self, root):
        self.root = root
        self.root.title("图像预处理 GUI")

        self.original_image = None
        self.processed_image = None

        # GUI 变量
        self.denoise_mode = tk.StringVar(value="None")
        self.colorspace_mode = tk.StringVar(value="RGB")

        # 图像显示面板
        self.left_panel = tk.Label(root)
        self.left_panel.grid(row=0, column=0)
        self.right_panel = tk.Label(root)
        self.right_panel.grid(row=0, column=1)

        # 控制按钮
        tk.Button(root, text="载入图片", command=self.load_image).grid(row=1, column=0, sticky='ew')
        tk.Button(root, text="保存图像", command=self.save_image).grid(row=1, column=1, sticky='ew')
        tk.Button(root, text="保存参数", command=self.save_parameters).grid(row=1, column=2, sticky='ew')

        # 滑动条
        self.brightness = tk.Scale(root, label="亮度", from_=-100, to=100, orient='horizontal', command=self.update_image)
        self.brightness.set(0)
        self.brightness.grid(row=2, column=0, columnspan=3, sticky='ew')

        self.gamma = tk.Scale(root, label="伽马", from_=10, to=300, resolution=1, orient='horizontal', command=self.update_image)
        self.gamma.set(100)
        self.gamma.grid(row=3, column=0, columnspan=3, sticky='ew')

        self.contrast = tk.Scale(root, label="对比度", from_=50, to=300, resolution=1, orient='horizontal', command=self.update_image)
        self.contrast.set(100)
        self.contrast.grid(row=4, column=0, columnspan=3, sticky='ew')

        # 滤波方式选择
        tk.Label(root, text="降噪方式").grid(row=5, column=0, sticky='ew')
        self.denoise_selector = tk.OptionMenu(root, self.denoise_mode, "None", "Gaussian", "Median", command=self.update_image)
        self.denoise_selector.grid(row=5, column=1, columnspan=2, sticky='ew')

        self.filter_ksize = tk.Scale(root, label="滤波核大小", from_=3, to=21, resolution=2, orient='horizontal', command=self.update_image)
        self.filter_ksize.set(5)
        self.filter_ksize.grid(row=6, column=0, columnspan=3, sticky='ew')


        # 颜色空间选择
        tk.Label(root, text="颜色空间").grid(row=9, column=0, sticky='ew')
        self.colorspace_selector = tk.OptionMenu(root, self.colorspace_mode, "RGB", "HSV", "Lab", command=self.update_image)
        self.colorspace_selector.grid(row=9, column=1, columnspan=2, sticky='ew')

    def load_image(self):
        path = filedialog.askopenfilename()
        if path:
            self.original_image = cv2.imread(path)
            self.original_image = cv2.cvtColor(self.original_image, cv2.COLOR_BGR2RGB)
            self.update_image(None)

    def save_image(self):
        if self.processed_image is not None:
            path = filedialog.asksaveasfilename(defaultextension=".jpg")
            if path:
                save_img = cv2.cvtColor(self.processed_image, cv2.COLOR_RGB2BGR)
                cv2.imwrite(path, save_img)

    def save_parameters(self):
        path = filedialog.asksaveasfilename(defaultextension=".txt")
        if not path:
            return

        with open(path, 'w') as f:
            f.write("图像预处理参数配置:\n")
            f.write(f"亮度: {self.brightness.get()}\n")
            f.write(f"对比度: {self.contrast.get() / 100.0:.2f}\n")
            f.write(f"伽马: {self.gamma.get() / 100.0:.2f}\n")
            f.write(f"降噪方式: {self.denoise_mode.get()}\n")
            f.write(f"滤波核大小: {self.filter_ksize.get()}\n")

            f.write(f"颜色空间: {self.colorspace_mode.get()}\n")

    def apply_processing(self):
        img = self.original_image.astype(np.float32)

        # 1. 对比度 + 亮度
        contrast = self.contrast.get() / 100.0
        brightness = self.brightness.get()
        img = img * contrast + brightness
        img = np.clip(img, 0, 255).astype(np.uint8)

        # 2. Gamma校正
        gamma = self.gamma.get() / 100.0
        invGamma = 1.0 / gamma
        table = np.array([(i / 255.0) ** invGamma * 255 for i in np.arange(256)]).astype("uint8")
        img = cv2.LUT(img, table)

        # 3. 降噪处理
        img = self.apply_denoise_filter(img)

        # 4. 颜色空间转换(用于显示)
        img = self.apply_colorspace_transform(img)

        return img

    def apply_denoise_filter(self, image):
        mode = self.denoise_mode.get()
        ksize = self.filter_ksize.get() | 1  # 强制为奇数
        if mode == "Gaussian":
            return cv2.GaussianBlur(image, (ksize, ksize), 0)
        elif mode == "Median":
            return cv2.medianBlur(image, ksize)
      
        return image


    def apply_colorspace_transform(self, image):
        mode = self.colorspace_mode.get()
        if mode == "HSV":
            return cv2.cvtColor(image, cv2.COLOR_RGB2HSV)
        elif mode == "Lab":
            return cv2.cvtColor(image, cv2.COLOR_RGB2Lab)
        return image

    def update_image(self, _):
        if self.original_image is not None:
            self.processed_image = self.apply_processing()
            self.display_images()

    def display_images(self):
        def convert(img):
            return ImageTk.PhotoImage(Image.fromarray(cv2.resize(img, (300, 300))))
        orig = convert(self.original_image)
        proc = convert(self.processed_image)
        self.left_panel.configure(image=orig)
        self.left_panel.image = orig
        self.right_panel.configure(image=proc)
        self.right_panel.image = proc

if __name__ == "__main__":
    root = tk.Tk()
    app = ImagePreprocessorApp(root)
    root.mainloop()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值