OpenCV学习(四)——轨迹栏(调色板与不同通道图像)

轨迹栏

    • [4. OpenCV轨迹栏](#4. OpenCV轨迹栏)
      • [4.1 轨迹栏作为调色板](#4.1 轨迹栏作为调色板)
      • [4.2 轨迹栏显示不同通道图像](#4.2 轨迹栏显示不同通道图像)

4. OpenCV轨迹栏

会用到以下主要两个函数

cv2.createTrackbar(trackbarName, windowName, value, count, onChange)创建轨迹栏

主要参数:

  • trackbarName:轨迹栏名称
  • windowName:附加到的窗口名称
  • value:默认值
  • count:最大值
  • onChange:执行的回调函数每次跟踪栏值更改,下面例子函数什么都不做

getTrackbarPos(trackbarname, winname)获取轨迹栏的位置

  • trackbarname:轨迹栏名称
  • winname:附加到的窗口名称

4.1 轨迹栏作为调色板

创建一个黑色图像,通过轨迹栏改变BGR三通道值来显示不同颜色

python 复制代码
import numpy as np
import cv2


def nothing(x):
    pass


# 创建一个黑色的图像,一个窗口
img = np.zeros((512, 512, 3), np.uint8)
cv2.namedWindow('image')
# 创建颜色变化的轨迹栏
cv2.createTrackbar('R', 'image', 0, 255, nothing)
cv2.createTrackbar('G', 'image', 0, 255, nothing)
cv2.createTrackbar('B', 'image', 0, 255, nothing)
# 为 ON/OFF 功能创建开关
switch = '0 : OFF \n1 : ON'
cv2.createTrackbar(switch, 'image', 0, 1, nothing)
while (1):
    cv2.imshow('image', img)
    k = cv2.waitKey(1) & 0xFF
    if k == 27:
        break
    # 得到四条轨迹的当前位置
    r = cv2.getTrackbarPos('R', 'image')
    g = cv2.getTrackbarPos('G', 'image')
    b = cv2.getTrackbarPos('B', 'image')
    s = cv2.getTrackbarPos(switch, 'image')
    if s == 0:
        img[:] = 0
    else:
        img[:] = [b, g, r]
cv2.destroyAllWindows()

4.2 轨迹栏显示不同通道图像

OpenCV读取的是BGR形式,通过轨迹栏可以显示不同通道的图像,例如:只有R单通道的图像、将两通道合并的图像、将三通道合并为原图像。

  • split(): 通道分离,(b, g, r)形式
  • merge() :通道合并,输入1通道或者3通道
python 复制代码
import numpy as np
import cv2


def nothing(x):
    pass


# 将选择的通道设置为零矩阵,不显示
def zeros_channels(channel):
    zeros = np.zeros_like(channel)
    return zeros


img = cv2.imread('lena.jpg')
# 将3通道分离
b, g, r = cv2.split(img)
cv2.namedWindow('image')
# 创建三通道开关的轨迹栏
switch_r = 'R_channel'
cv2.createTrackbar(switch_r, 'image', 0, 1, nothing)
switch_g = 'G_channel'
cv2.createTrackbar(switch_g, 'image', 0, 1, nothing)
switch_b = 'B_channel'
cv2.createTrackbar(switch_b, 'image', 0, 1, nothing)

while (1):
    cv2.imshow('image', img)
    k = cv2.waitKey(1) & 0xFF
    if k == 27:
        break
    # 得到三条轨迹的当前位置
    s_r = cv2.getTrackbarPos(switch_r, 'image')
    s_g = cv2.getTrackbarPos(switch_g, 'image')
    s_b = cv2.getTrackbarPos(switch_b, 'image')

    if s_r == 1:
        if s_g == 1:
            if s_b == 1:
                img = cv2.merge([b, g, r])  # 对通道按照BGR的顺序合并生成图像bgr
            else:
                img = cv2.merge([zeros_channels(b), g, r]) # 不显示b通道
        else:
            if s_b == 1:
                img = cv2.merge([b, zeros_channels(g), r])  # 对通道按照BGR的顺序合并生成图像bgr
            else:
                img = cv2.merge([zeros_channels(b), zeros_channels(g), r]) # 不显示b, g通道
    else:
        if s_g == 1:
            if s_b == 1:
                img = cv2.merge([b, g, zeros_channels(r)])  # 对通道按照BGR的顺序合并生成图像bgr
            else:
                img = cv2.merge([zeros_channels(b), g, zeros_channels(r)]) # 不显示b, r通道
        else:
            if s_b == 1:
                img = cv2.merge([b, zeros_channels(g), zeros_channels(r)])  # 对通道按照BGR的顺序合并生成图像bgr
            else:
                img = cv2.merge([zeros_channels(b), zeros_channels(g), zeros_channels(r)]) # 不显示b, g, r通道


cv2.destroyAllWindows()
相关推荐
许白掰18 分钟前
Linux入门篇学习——借助 U 盘或 TF 卡拷贝程序到开发板上
linux·学习·借助 u 盘拷贝程序到开发板上·借助 tf卡拷贝程序到开发板上
倔强青铜三23 分钟前
苦练Python第23天:元组秘籍与妙用
人工智能·python·面试
AndrewHZ1 小时前
【图像处理基石】如何入门色彩评估?
图像处理·人工智能·深度学习·色彩科学·hvs·色彩评估·颜色工程
TomatoSCI1 小时前
聚类的可视化选择:PCA / t-SNE丨TomatoSCI分析日记
人工智能·机器学习
大咖分享课1 小时前
深度剖析:最新发布的ChatGPT Agent 技术架构与应用场景
人工智能·openai·智能助手·ai代理·chatgpt agent·自主任务执行
lucky_lyovo1 小时前
卷积神经网络--网络性能提升
人工智能·神经网络·cnn
liliangcsdn1 小时前
smolagents - 如何在mac用agents做简单算术题
人工智能·macos·prompt
nju_spy1 小时前
周志华《机器学习导论》第8章 集成学习 Ensemble Learning
人工智能·随机森林·机器学习·集成学习·boosting·bagging·南京大学
静心问道2 小时前
TrOCR: 基于Transformer的光学字符识别方法,使用预训练模型
人工智能·深度学习·transformer·多模态
说私域2 小时前
基于开源AI大模型、AI智能名片与S2B2C商城小程序源码的用户价值引导与核心用户沉淀策略研究
人工智能·开源