OpenCV(基础补充)颜色空间HSV && *args与**args(滑动条传参问题)
Posted _睿智_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenCV(基础补充)颜色空间HSV && *args与**args(滑动条传参问题)相关的知识,希望对你有一定的参考价值。
目录
一、基础理论
HSV:HSV是一种为了加快调色效率,且易于理解的概念。
Hue:色相(具体的颜色)
Saturation:饱和度、色彩纯净度
Value:明度
1、Hue(色相)
Hue:色相(具体的颜色)
2、Value(明度)
明度:色彩的明亮程度,单通道亮度(并不等同于整体发光量)。
(明度越高越白,越低越黑,一般提高明度会同时提高R、G、B三通道的数值)
3、Saturation(饱和度)
Saturation:饱和度、色彩纯度。(越低越灰,越高越纯)
(一般调高饱和度会降低RGB中相对较低的数值,凸显主要颜色的纯度。 )
B站视频讲解:
短动画慢语速1分钟讲清影视调色中色彩形成原理基础——RGB与HSV
二、hsv三通道及单通道效果
三、*args && **args
*args:
*args:传入参数未知,且不需要知道参数名称。
**args:
**args:传入参数未知,但需要知道参数名称。
四、滚动条控制h、s、v(min && max)
1、创建滚动条
API
CV_EXPORTS int createTrackbar(const string& trackbarname, const string& winname, int* value, int count, TrackbarCallback onChange = 0, void* userdata = 0);
形式参数一、trackbarname:滑动空间的名称;
形式参数二、winname:滑动空间用于依附的图像窗口的名称;
形式参数三、value:初始化阈值;
形式参数四、count:滑动控件的刻度范围;
形式参数五、TrackbarCallback:是回调函数,其定义如下:
typedef void (CV_CDECL *TrackbarCallback)(int pos, void* userdata);
# 3、创建h、s、v滚动条
cv2.createTrackbar('hmin', 'h', 12, 179, Renew)
cv2.createTrackbar('hmax', 'h', 37, 179, Renew)
cv2.createTrackbar('smin', 's', 12, 179, Renew)
cv2.createTrackbar('smax', 's', 37, 179, Renew)
cv2.createTrackbar('vmin', 'v', 12, 179, Renew)
cv2.createTrackbar('vmax', 'v', 37, 179, Renew)
2、回调函数 -- 阈值设置
API
inRange()
主要是将在两个阈值内的像素值设置为白色(255),而不在阈值区间内的像素值设置为黑色(0),该功能类似于之间所讲的双阈值化操作。
void inRange(InputArray src, InputArray lowerb, InputArray upperb, OutputArray dst);
- 参数1:输入要处理的图像,可以为单通道或多通道。
- 参数2:包含下边界的数组或标量。
- 参数3:包含上边界数组或标量。
- 参数4:输出图像,与输入图像src 尺寸相同且为CV_8U 类型。
(注:dst输出二值化之后的图像)
# 1、获取滑动条反馈值
hmin = cv2.getTrackbarPos('hmin', 'h')
hmax = cv2.getTrackbarPos('hmax', 'h')
smin = cv2.getTrackbarPos('smin', 's')
smax = cv2.getTrackbarPos('smax', 's')
vmin = cv2.getTrackbarPos('vmin', 'v')
vmax = cv2.getTrackbarPos('vmax', 'v')
# 2、设置阈值(inRange:在阈值(min,max)之内,设置为白色;在阈值之外,设置为黑色)
h_thresh = cv2.inRange(np.array(h), np.array(hmin), np.array(hmax))
s_thresh = cv2.inRange(np.array(s), np.array(smin), np.array(smax))
v_thresh = cv2.inRange(np.array(v), np.array(vmin), np.array(vmax))
3、回调函数 -- 感兴趣值
API
bitwise_and()
图像的与运算主要用于获取某个图像中感兴趣的部分,是针对两个图像矩阵数组或一个数组与标量的按位与。
# 3、获取感兴趣二值(与运算)
interest = cv2.bitwise_and(h_thresh, cv2.bitwise_and(s_thresh, v_thresh))
总代码
# HSV颜色空间与滑动条(*args && **args)
import cv2
import numpy as np
# 回调函数
# *args:传入参数未知,且不需要知道参数名称
# **args:传入参数未知,但需要知道参数名称
def HSV_CallBack(*args):
# 1、获取滑动条反馈值
hmin = cv2.getTrackbarPos('hmin', 'h_binary')
hmax = cv2.getTrackbarPos('hmax', 'h_binary')
smin = cv2.getTrackbarPos('smin', 's_binary')
smax = cv2.getTrackbarPos('smax', 's_binary')
vmin = cv2.getTrackbarPos('vmin', 'v_binary')
vmax = cv2.getTrackbarPos('vmax', 'v_binary')
# 2、设置阈值(inRange:在阈值(min,max)之内,设置为白色;在阈值之外,设置为黑色)
h_binary = cv2.inRange(np.array(h), np.array(hmin), np.array(hmax))
s_binary = cv2.inRange(np.array(s), np.array(smin), np.array(smax))
v_binary = cv2.inRange(np.array(v), np.array(vmin), np.array(vmax))
# 3、获取感兴趣二值(与运算)
binary = cv2.bitwise_and(h_binary, cv2.bitwise_and(s_binary, v_binary))
# 4、显示
cv2.imshow('h_binary', h_binary)
cv2.imshow('s_binary', s_binary)
cv2.imshow('v_binary', v_binary)
cv2.imshow('binary', binary)
def Show_HSV():
global hsv, h, s, v
# 0、创建窗口
cv2.namedWindow('h_binary')
cv2.namedWindow('s_binary')
cv2.namedWindow('v_binary')
# 1、获取hsv图片
hsv = cv2.cvtColor(img, cv2.COLOR_RGB2HSV)
cv2.imshow('hsv', hsv)
# 2、获取h、s、v三通道图片
h, s, v = cv2.split(hsv)
# 3、创建h、s、v滚动条
cv2.createTrackbar('hmin', 'h_binary', 12, 179, HSV_CallBack)
cv2.createTrackbar('hmax', 'h_binary', 37, 179, HSV_CallBack)
cv2.createTrackbar('smin', 's_binary', 12, 179, HSV_CallBack)
cv2.createTrackbar('smax', 's_binary', 37, 179, HSV_CallBack)
cv2.createTrackbar('vmin', 'v_binary', 12, 179, HSV_CallBack)
cv2.createTrackbar('vmax', 'v_binary', 37, 179, HSV_CallBack)
HSV_CallBack()
if __name__ == '__main__':
global img
img = cv2.imread('Resource/test.jpg')
cv2.imshow('img', img)
# 显示h、s、v
Show_HSV()
cv2.waitKey(0)
参考资料
短动画慢语速1分钟讲清影视调色中色彩形成原理基础——RGB与HSV_哔哩哔哩_bilibili
Python中*args、**args到底是什么、有啥区别、怎么用_qq_1170407931的博客-CSDN博客_argscreateTrackbar使用方法及步骤_mysee1989的专栏-CSDN博客
以上是关于OpenCV(基础补充)颜色空间HSV && *args与**args(滑动条传参问题)的主要内容,如果未能解决你的问题,请参考以下文章
OpenCV 例程200篇209. HSV 颜色空间的图像分割