用 Python 制作可视化 GUI 界面,一键实现证件照背景颜色的替换("Python 制作可视化 GUI:一键替换证件照背景颜色")

原创
ithorizon 6个月前 (10-21) 阅读数 45 #后端开发

Python 制作可视化 GUI:一键替换证件照背景颜色

一、引言

在日常生活中,我们常常需要替换证件照的背景颜色,以适应不同的场合。本文将介绍怎样使用 Python 制作一个可视化 GUI 界面,实现一键替换证件照背景颜色的功能。我们将使用 Python 的 Tkinter 库来创建 GUI 界面,以及 OpenCV 库来进行图像处理。

二、环境准备

在开端之前,请确保您的计算机已安装以下库:

  • Python 3.x
  • Tkinter(Python 内置库)
  • OpenCV(可通过 pip 安装:pip install opencv-python)

三、设计 GUI 界面

首先,我们需要设计一个简洁的 GUI 界面,包括以下元素:

  • 选择图片按钮
  • 选择背景颜色按钮
  • 替换背景颜色按钮
  • 显示原图和替换后的图片

import tkinter as tk

from tkinter import filedialog, colorchooser

# 创建主窗口

root = tk.Tk()

root.title("证件照背景颜色替换工具")

# 设置窗口大小和位置

root.geometry("800x600")

root.resizable(False, False)

# 创建变量

original_img_path = tk.StringVar()

new_img_path = tk.StringVar()

background_color = tk.StringVar()

# 创建选择图片按钮

def select_original_img():

file_path = filedialog.askopenfilename()

if file_path:

original_img_path.set(file_path)

select_img_button = tk.Button(root, text="选择图片", command=select_original_img)

select_img_button.pack(pady=10)

# 创建选择背景颜色按钮

def select_background_color():

color_code = colorchooser.askcolor(title="选择背景颜色")[1]

if color_code:

background_color.set(color_code)

select_color_button = tk.Button(root, text="选择背景颜色", command=select_background_color)

select_color_button.pack(pady=10)

# 创建替换背景颜色按钮

def replace_background_color():

if original_img_path.get() and background_color.get():

# 调用图像处理函数(将在下一节介绍)

new_img_path.set(replace_color(original_img_path.get(), background_color.get()))

replace_color_button = tk.Button(root, text="替换背景颜色", command=replace_background_color)

replace_color_button.pack(pady=10)

# 创建显示图片的画布

original_img_label = tk.Label(root)

original_img_label.pack(side=tk.LEFT, padx=10)

new_img_label = tk.Label(root)

new_img_label.pack(side=tk.RIGHT, padx=10)

# 初始化窗口

root.mainloop()

四、图像处理

接下来,我们需要实现一个函数来替换证件照的背景颜色。这里我们使用 OpenCV 库进行图像处理。以下是函数的实现代码:

import cv2

import numpy as np

def replace_color(image_path, color_code):

# 读取图片

image = cv2.imread(image_path)

# 将颜色代码演化为 RGB 格式

color = tuple(int(color_code[i:i+2], 16) for i in (1, 3, 5))

# 演化为 HSV 格式

hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)

# 获取背景颜色的上下界

lower_color = np.array([color[0] - 30, color[1] - 30, color[2] - 30])

upper_color = np.array([color[0] + 30, color[1] + 30, color[2] + 30])

# 创建掩模

mask = cv2.inRange(hsv_image, lower_color, upper_color)

# 反转掩模

mask_inv = cv2.bitwise_not(mask)

# 提取前景和背景

background = cv2.bitwise_and(image, image, mask=mask)

foreground = cv2.bitwise_and(image, image, mask=mask_inv)

# 创建新的背景

new_background = np.zeros(image.shape, dtype=np.uint8)

new_background[:, :] = color

# 将前景和新的背景合并

result = cv2.bitwise_or(background, new_background, mask=mask)

result = cv2.bitwise_or(result, foreground, mask=mask_inv)

# 保存因此

new_image_path = "new_" + image_path

cv2.imwrite(new_image_path, result)

return new_image_path

五、完整代码

将以上两部分的代码合并,即可得到完整的程序。以下是完整代码:

import tkinter as tk

from tkinter import filedialog, colorchooser

import cv2

import numpy as np

# 创建主窗口

root = tk.Tk()

root.title("证件照背景颜色替换工具")

# 设置窗口大小和位置

root.geometry("800x600")

root.resizable(False, False)

# 创建变量

original_img_path = tk.StringVar()

new_img_path = tk.StringVar()

background_color = tk.StringVar()

# 创建选择图片按钮

def select_original_img():

file_path = filedialog.askopenfilename()

if file_path:

original_img_path.set(file_path)

select_img_button = tk.Button(root, text="选择图片", command=select_original_img)

select_img_button.pack(pady=10)

# 创建选择背景颜色按钮

def select_background_color():

color_code = colorchooser.askcolor(title="选择背景颜色")[1]

if color_code:

background_color.set(color_code)

select_color_button = tk.Button(root, text="选择背景颜色", command=select_background_color)

select_color_button.pack(pady=10)

# 创建替换背景颜色按钮

def replace_background_color():

if original_img_path.get() and background_color.get():

new_img_path.set(replace_color(original_img_path.get(), background_color.get()))

replace_color_button = tk.Button(root, text="替换背景颜色", command=replace_background_color)

replace_color_button.pack(pady=10)

# 创建显示图片的画布

original_img_label = tk.Label(root)

original_img_label.pack(side=tk.LEFT, padx=10)

new_img_label = tk.Label(root)

new_img_label.pack(side=tk.RIGHT, padx=10)

# 图像处理函数

def replace_color(image_path, color_code):

image = cv2.imread(image_path)

color = tuple(int(color_code[i:i+2], 16) for i in (1, 3, 5))

hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)

lower_color = np.array([color[0] - 30, color[1] - 30, color[2] - 30])

upper_color = np.array([color[0] + 30, color[1] + 30, color[2] + 30])

mask = cv2.inRange(hsv_image, lower_color, upper_color)

mask_inv = cv2.bitwise_not(mask)

background = cv2.bitwise_and(image, image, mask=mask)

foreground = cv2.bitwise_and(image, image, mask=mask_inv)

new_background = np.zeros(image.shape, dtype=np.uint8)

new_background[:, :] = color

result = cv2.bitwise_or(background, new_background, mask=mask)

result = cv2.bitwise_or(result, foreground, mask=mask_inv)

new_image_path = "new_" + image_path

cv2.imwrite(new_image_path, result)

return new_image_path

# 初始化窗口

root.mainloop()

六、总结

本文介绍了怎样使用 Python 的 Tkinter 库和 OpenCV 库制作一个可视化 GUI 界面,实现一键替换证件照背景颜色的功能。通过简洁的操作,用户可以轻松地选择图片和背景颜色,然后一键替换背景颜色。这个工具在日常生活中非常实用,可以帮助我们迅速处理证件照背景颜色。


本文由IT视界版权所有,禁止未经同意的情况下转发

文章标签: 后端开发


热门