根据R、G、B的值实时修改图像的颜色
import cv2
import numpy as np
"""
滑动块调整图像灰度
1. 读取图片,并转为灰度图
2. 定义启动滑块和R、G、B滑块
3. 只有启动滑块的值为1时,拖动R、G、B滑块才生效
4. 根据R、G、B的值实时对修改图片的颜色操作
"""
enable = False
img = np.zeros((400, 400, 3), dtype='uint8')
# img = cv2.imread('img.png')
print(img)
def nothing(x): # 滑动条修改后会触发这个事件,我们这个程序不需要所以置空
pass
def enableButton(x): # 启动滑块触发事件
global enable
enable = bool(x)
cv2.namedWindow("image")
# 创建调色板滑动条
cv2.createTrackbar('Enable', 'image', 0, 1, enableButton) # 创建是否启用滑块,返回为0-1之间
cv2.createTrackbar('R', 'image', 0, 255, nothing) # 创建R滑块,范围在0-255之间
cv2.createTrackbar('G', 'image', 0, 255, nothing) # 创建G滑块,范围在0-255之间
cv2.createTrackbar('B', 'image', 0, 255, nothing) # 创建B滑块,范围在0-255之间
while 1:
cv2.imshow("image", img)
k = cv2.waitKey(1)
if k == ord('q'): # 如果输入q则退出程序
break
if enable: # 如果当前滑块状态是启动的话,则对图像进行二值化操作
# 获取当前滑块的值
r = cv2.getTrackbarPos("R", "image")
g = cv2.getTrackbarPos("G", "image")
b = cv2.getTrackbarPos("B", "image")
# 将当前的图片所有像素替换为对应的r、g、b值组成的颜色
img[:] = (b, g, r)
这段代码创建了一个窗口,其中包含一个启用/禁用滑块和分别用于调整红色(R)、绿色(G)和蓝色(B)通道的滑块。用户可以通过拖动滑块来实时调整图像的颜色。按下 'q' 键退出程序。
以下是代码的主要步骤:
-
初始化全局变量:
enable
用于标记是否启用颜色调整。 -
创建一个黑色图像:
img = np.zeros((400, 400, 3), dtype='uint8')
。 -
定义两个滑块触发函数:
nothing(x)
为空函数,enableButton(x)
设置enable
变量的值。 -
创建窗口和滑块:使用
cv2.namedWindow
创建窗口,使用cv2.createTrackbar
创建启用滑块和三个颜色通道滑块。 -
进入死循环,实时显示当前图像,并等待用户的键盘输入。
-
如果用户按下 'q' 键,则退出程序。
-
如果启用了颜色调整,获取当前滑块的值,然后将图像的所有像素替换为对应的 R、G、B 值组成的颜色。
这个程序演示了如何使用 OpenCV 创建一个图像窗口,并通过滑块实时调整图像的颜色。
注意:img = np.zeros((400, 400, 3), dtype='uint8') 的dtype选项必须为unit8,不然会cv.show因为类型报错。