代码拉取完成,页面将自动刷新
同步操作将从 mynameisi/RGB_mixer_homework 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
import tkinter as tk # 引入tkinter库,用于GUI界面设计
from PIL import Image, ImageTk # 引入PIL库中的Image和ImageTk模块,用于图像处理和Tkinter兼容
import numpy as np # 引入numpy库,用于处理数组操作
import cv2 # 引入OpenCV库,用于图像处理
# 读取图像,并将BGR转换为RGB格式
image = cv2.imread('rgb_ribbon.jpg')
image = cv2.cvtColor(image,cv2.COLOR_BGR2RGB)
# 将RGB图像分解为R、G、B三个通道
red_image = image[:,:,0]
green_image = image[:,:,1]
blue_image = image[:,:,2]
# 获取图像的高度和宽度
height, width = image.shape[:2]
# 创建一个空(全0)的RGB图像,用于显示调色后的RGB图像【注意是RGB,不是灰度图】
# 高度为图像的高度,宽度为三张图像并列显示的宽度,数据类型为 np.uint8
rgb_image = np.zeros((height,3*width,3),dtype = np.uint8)
# 初始化Tkinter窗口
root = tk.Tk()
root.title("RGB Image Mixer")
# 定义显示图像的最大宽度和高度
display_width = 1000
display_height = 800
# 创建一个标签用于显示图像
label_image = tk.Label(root)
label_image.pack()
# 创建一个变量用于存储显示模式(灰度或彩色)
display_mode = tk.IntVar()
def update_image(*args):
"""
更新图像函数,用于根据R、G、B通道的偏移量以及显示模式更新显示图像。
"""
# 获取R、G、B通道的偏移量
red_offset = scale_red.get()
green_offset = scale_green.get()
blue_offset = scale_blue.get()
# 创建一个空的显示图像
display_image = np.zeros_like(rgb_image)
# 根据偏移量将R、G、B通道的图像添加到显示图像中
display_image[:, red_offset:red_offset+width, 0] = red_image
display_image[:, green_offset:green_offset+width, 1] = green_image
display_image[:, blue_offset:blue_offset+width, 2] = blue_image
# 如果显示模式为灰度,将图像display_image转换为灰度图
if display_mode.get() == 0:
display_image = cv2.cvtColor(display_image,cv2.COLOR_RGB2GRAY)
# 将图像转换为PIL格式
pil_image = Image.fromarray(np.uint8(display_image))
# 计算图像宽高与显示宽高的比例
width_ratio = display_width / pil_image.width
height_ratio = display_height / pil_image.height
# 选择较小比例进行等比例缩放
ratio = min(width_ratio, height_ratio)
new_width = int(pil_image.width * ratio)
new_height = int(pil_image.height * ratio)
# 根据比例缩放图像
pil_image = pil_image.resize((new_width, new_height), Image.LANCZOS)
# 将缩放后的图像转换为Tkinter兼容的格式
tk_image = ImageTk.PhotoImage(pil_image)
# 更新标签中的图像
label_image.configure(image=tk_image)
label_image.image = tk_image
# 创建R、G、B通道偏移量的滑动条
max_offset = 2 * width
scale_red = tk.Scale(root, from_=0, to=max_offset, orient=tk.HORIZONTAL, command=update_image)
scale_red.pack(fill=tk.X)
scale_green = tk.Scale(root, from_=0, to=max_offset, orient=tk.HORIZONTAL, command=update_image)
scale_green.set(width)
scale_green.pack(fill=tk.X)
scale_blue = tk.Scale(root, from_=0, to=max_offset, orient=tk.HORIZONTAL, command=update_image)
scale_blue.set(2 * width)
scale_blue.pack(fill=tk.X)
# 创建显示模式的单选按钮(灰度和彩色)
rb_gray = tk.Radiobutton(root, text="Grayscale", variable=display_mode, value=0, command=update_image)
rb_gray.pack()
rb_color = tk.Radiobutton(root, text="Color", variable=display_mode, value=1, command=update_image)
rb_color.pack()
# 调用更新图像函数以显示初始图像
update_image()
# 启动Tkinter主循环
root.mainloop()
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。