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()
gui测试图像预处理:对比度、亮度、伽马值、中值滤波、降噪处理,可保存调整后参数及图片,非常适合算法调试用。
于 2025-05-13 14:14:27 首次发布