OpenCV教程——滚动条、键盘相应操作;自带颜色表操作;通道分离与合并

387 阅读3分钟

滚动条操作

滚动条(Trackbar)在 OpenCV 中是非常方便的交互工具,它依附于特定的窗口而存在。通过调节滚动条能够设置、获取指定范围内的特定值。

基本语法

OpenCV 中,函数 cv2.createTrackbar()用来定义滚动条,其语法格式为:

cv2.createTrackbar(trackbarname, winname, value, count, onChange)

其中:

  • trackbarname 为滚动条的名称。
  • winname 为滚动条所依附窗口的名称。
  • value 为初始值,该值决定滚动条中滑块的位置。
  • count 为滚动条的最大值。通常情况下, 其最小值是 0。
  • onChange 为回调函数。一般情况下,将滚动条改变后要实现的操作写在回调函数内。

函数 cv2.createTrackbar()用于生成一个滚动条。拖动滚动条,就可以设置滚动条的值,并让滚动条返回对应的值。

滚动条的值可以通过函数 cv2.getTrackbarPos()获取,其语法格式为:

retval=getTrackbarPos( trackbarname,winname )
  • retval 为返回值,获取函数 cv2.createTrackbar()生成的滚动条的值。
  • trackbarname 为滚动条的名称。
  • winname 为滚动条所依附的窗口的名称。

代码示例:

def trackbar_callback(pos):
    print(pos)


def trackbar_Demo():
    image = cv2.imread('test.jpg')
    cv2.namedWindow('trackbar_demo', cv2.WINDOW_NORMAL)
    cv2.createTrackbar('lightness', 'trackbar_demo', 0, 200, trackbar_callback)
    cv2.imshow('trackbar_demo', image)
    while True:
        pos = cv2.getTrackbarPos('lightness', 'trackbar_demo')
        image2 = np.zeros_like(image)
        image2[:, :] = (np.uint8(pos), np.uint8(pos), np.uint8(pos))
        result = cv2.add(image, image2)
        cv2.imshow('trackbar_demo', result)
        c = cv2.waitKey(1)  # Esc退出
        if c == 27:
            break
    cv2.waitKey(0)
    cv2.destroyAllWindows()

image.png

键盘响应

def keyboard_demo():
    image = cv2.imread('test.jpg')
    cv2.namedWindow('keyboard_demo', cv2.WINDOW_NORMAL)
    cv2.imshow('keyboard_demo', image)
    while True:
        c = cv2.waitKey(10)
        # ESC
        if c == 27:
            break
        # 1
        elif c == 49:
            hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
            cv2.imshow('keyboard_demo', hsv)
        # 2
        elif c == 50:
            ycrb = cv2.cvtColor(image, cv2.COLOR_BGR2YCrCb)
            cv2.imshow('keyboard_demo', ycrb)
        # 3
        elif c == 51:
            rgb=cv2.cvtColor(image,cv2.COLOR_BGR2RGB)
            cv2.imshow('keyboard_demo',rgb)
        cv2.waitKey(0)
        cv2.destroyAllWindows()

颜色查找表

函数使用

cv.LUT(src, lut, dst)

复制

参数说明

参数说明
src表示原始图像。
lut表示查找表的地址,对于多通道图像的查找,它可以有一个通道,也可以与原始图像有相同的通道。
dst表示输出图像。

查找表的使用和优点

  1. 构建查找表;
  2. 查找表应用;

查找表优势,预计算,空间换时间,避免重复计算,节约计算时间。

cv.applyColorMap() 函数说明

函数使用

cv.applyColorMap(src, colormap[,dst])

复制

3.2 参数说明

参数说明
src表示输入图像。
colormap表示颜色表。
dst表示输出图像。

系统查找表 colormap 说明

colormap为颜色图模式,可以传入整数0~21对应各种不同的颜色图,或者用cv2.COLORMAP_AUTUMN(等价于0)、cv2.COLORMAP_BONE(等价于1)等方式传入,OpenCV源码头文件中定义的22种模式如下:

ColormapTypes = (
  'COLORMAP_AUTUMN', # 0
  'COLORMAP_BONE', # 1
  'COLORMAP_JET', # 2
  'COLORMAP_WINTER', # 3
  'COLORMAP_RAINBOW', # 4
  'COLORMAP_OCEAN', # 5
  'COLORMAP_SUMMER', # 6
  'COLORMAP_SPRING', # 7
  'COLORMAP_COOL', # 8
  'COLORMAP_HSV', # 9
  'COLORMAP_PINK', # 10
  'COLORMAP_HOT', # 11
  'COLORMAP_PARULA', # 12
  'COLORMAP_MAGMA', # 13
  'COLORMAP_INFERNO', # 14
  'COLORMAP_PLASMA', # 15
  'COLORMAP_VIRIDIS', # 16
  'COLORMAP_CIVIDIS', # 17
  'COLORMAP_TWILIGHT', # 18
  'COLORMAP_TWILIGHT_SHIFTED', # 19
  'COLORMAP_TURBO', # 20
  'COLORMAP_DEEPGREEN' # 21
)

复制

各种ColormapTypes对应的色彩是下图这样的,有各种春夏秋冬四季风格、冷热风格等等:

系统查找表实例

  1. 使用系统查找表实现图片的幻灯片切换;
  2. 间隔时间1s切换一次。 示例代码:
ColormapTypes = (
    'COLORMAP_AUTUMN',  # 0
    'COLORMAP_BONE',  # 1
    'COLORMAP_JET',  # 2
    'COLORMAP_WINTER',  # 3
    'COLORMAP_RAINBOW',  # 4
    'COLORMAP_OCEAN',  # 5
    'COLORMAP_SUMMER',  # 6
    'COLORMAP_SPRING',  # 7
    'COLORMAP_COOL',  # 8
    'COLORMAP_HSV',  # 9
    'COLORMAP_PINK',  # 10
    'COLORMAP_HOT',  # 11
    'COLORMAP_PARULA',  # 12
    'COLORMAP_MAGMA',  # 13
    'COLORMAP_INFERNO',  # 14
    'COLORMAP_PLASMA',  # 15
    'COLORMAP_VIRIDIS',  # 16
    'COLORMAP_CIVIDIS',  # 17
    'COLORMAP_TWILIGHT',  # 18
    'COLORMAP_TWILIGHT_SHIFTED',  # 19
    'COLORMAP_TURBO',  # 20
    'COLORMAP_DEEPGREEN'  # 21
)


def use_system_lut_demo():
    img = cv.imread('test.jpg')
    index = 0

    while True:
        if index >= len(ColormapTypes):
            break

        dst = cv.applyColorMap(img, index)
        cv.imshow('system_lut_window', dst)
        cv.waitKey(1000)
        index = index + 1

    cv.destroyAllWindows()

通道分离与合并

彩色图的BGR三个通道是可以分开单独访问的,也可以将单独的三个通道合并成一副图像。cv2.split() 图像可以分离图像 将原图像分离出单独的 R、G、B通道图像,分离完后,会是三张灰度图,这是因为现在图像已经变成单通道,其灰度值就代表它之前在其所在通道的比重。cv2.merge() 可以将单独的 R、G、B通道图像合成原始的原图像

def channel_split():
    image = cv2.imread('test.jpg')
    cv2.imshow('input', image)
    cv2.namedWindow('gamma', cv2.WINDOW_AUTOSIZE)
    mv = cv2.split(image)
    dst = np.zeros_like(image)
    # BGR2RGB
    cv2.mixChannels([image], [dst], fromTo=[0, 2, 1, 1, 2, 0])  # 输入 输出 fromTo通道顺序改变
    cv2.imshow('mix_channel', dst)
    mask = cv2.inRange(image, (43, 45, 100), (128, 200, 200))
    cv2.imshow('inRang', mask)
    cv2.waitKey(0)
    cv2.destroyAllWindows()