计算机视觉

用opencv制作调色板

2018-11-23  本文已影响17人  有苦向瓜诉说

在自然界中的颜色都是由外来的光刺激作用于人的视觉器官而产生的主观感觉,而自然界中的色彩千变万化,要准确的表示一个颜色就要用到颜色模型。

我们日常生活中使用最多的模型便是RGB三原色模型,所谓RGB指的就是红(red),蓝(blue),绿(green)这三种色光原色。当RGB三者的值都为零时,则为黑色;当三者的值都为1时则为白色;如果以不同的值混合在一起,就可以产生更多的颜色。


image.png

既然色彩是由三种原始颜色组成的,那我们可以就可以创建一个小程序来制作一个调色板,来用这三种颜色来调制其他的颜色。Opencv为我们提供了创建轨迹条的函数,我们只需要滑动轨迹条,改变三原色的数值,那就可以改变最终混合成的颜色。

首先介绍一下如何使用轨迹条。

def createTrackbar(trackbarName, windowName, value, count, onChange)

上面这个函数可以创建一个轨迹条(或者叫做滑动条),我们可以指定滑动条的初始数值和范围,通常初始值value设置为零,范围count则设置为0-255,而在这里回调函数不需要做任何事,所以onChange则设置为nothing。

retval  =   cv.getTrackbarPos(  trackbarname, winname   )

这个函数能够返回指定轨迹条的当前数值。

接下来便展示一下如何完成一个调色板。

import cv2
import numpy as np
def nothing(x):
    pass

img = np.zeros((512,512,3),np.uint8)
cv2.namedWindow('image')

上面这几行是为了完成程序的准备工作,首先导入opencv库和numpy库,这两个库是操作图像所必须的。然后定义了一个nothing函数,前面我们说过,回调函数不需要做任何事情,所以这里我们简单的定义为一个空函数体即可。紧接着是创建一个图像,这个图像的大小是512*512,包括三个通道,分别表示的是RGB通道,另外图像的数据类型为np.uint8表示。最后在创建一个窗口,准备容纳这个调色板。

cv2.createTrackbar('R','image',0,225,nothing)
cv2.createTrackbar('G','image',0,225,nothing)
cv2.createTrackbar('B','image',0,225,nothing)
switch = '0:OFF \t 1:ON:'
cv2.createTrackbar(switch,'image', 0,1,nothing)

这几行则是为了创建一个轨迹条,包括红绿蓝和一个开关,开关的值为0或者1。

while(True) :
    cv2.imshow('image',img)
    k = cv2.waitKey(1)&0xff
    if k == ord('q'):
        break
    
    r = cv2.getTrackbarPos("R",'image')
    g = cv2.getTrackbarPos('G','image')
    b = cv2.getTrackbarPos('B','image')
    s = cv2.getTrackbarPos(switch,'image')
    
    if s == 0:
        color = 0
    elif s == 1:
        color = [b,g,r]

这段代码便实现了调色板的最终功能,首先确保输入‘q’后程序能够退出,然后得到各个轨迹条的数值,如果开关为0,则色板为关闭状态,表现一直为黑色;如果开关为1,则色板打开,可以进行调色。

cv2.destroyAllWindows()

最后在程序运行完毕后关闭窗口退出。

最终的实现效果如下所示,可以滑动轨迹条来改变下面色板的颜色。


image.png

此外我们也可以在这里增加功能,使得调色板的功能更丰富。例如,我在这增加了一个鼠标事件。

def draw_circle(event,x,y,flags,param):
    if event == cv2.EVENT_LBUTTONDBLCLK:
        cv2.circle(img,(x,y),20,color,5,cv2.LINE_AA)
cv2.setMouseCallback('image',draw_circle)

这里只要鼠标左键双击,便会在鼠标的位置出现一个小圆圈,小圆圈的颜色由调色板控制。效果截图如下所示


image.png

我们还可以利用更多的知识来制作更多有趣的东西,比如用调色板来为一幅画来改变颜色,或者画一幅由各种色彩组成的图画。

欢迎大家关注我的公众号


计算机视觉和图像处理
上一篇下一篇

猜你喜欢

热点阅读