OpenCV系列(六)HSV颜色提取

HSV是一种在人们生活中甚至更常用的颜色系统,在电视遥控器上、在画画的调色板中、在你用爱某艺视频调整亮度时都很常见,因为它更符合人们描述颜色的方式——是什么颜色、颜色有多深、颜色有多亮。

- H—Hue即色相,就是我们平时所说的红、绿,如果你分的更细的话可能还会有洋红、草绿等等;在HSV模型中,用度数来描述色相,其中红色对应0度,绿色对应120度,蓝色对应240度。 
- S—Saturation即饱和度,色彩的深浅度(0-100%) ,对于一种颜色比如红色,我们可以用浅红——大红——深红——红得发紫等等语言来描述它(请原谅一个纯理科生的匮乏的颜色系统),对应在画水彩的时候即一种颜料加上不同分量的水形成不同的饱和度。 
- V—Value即色调,纯度,色彩的亮度(0-100%) ,这个在调整屏幕亮度的时候比较常见。 
相比我们之前接触过的RGB 颜色空间,它利用三个颜色分量的线性组合来表示颜色,任何颜色都与这三个分量有关,而且这三个分量是高度相关的,所以连续变换颜色时并不直观,想对图像的颜色进行调整需要更改这三个分量才行。
自然环境下获取的图像容易受自然光照、遮挡和阴影等情况的影响,即对亮度比较敏感。而 RGB 颜色空间的三个分量都与亮度密切相关,即只要亮度改变,三个分量都会随之相应地改变,而没有一种更直观的方式来表达。
与RGB颜色空间不同的是它比 RGB 更接近人们对彩色的感知经验。非常直观地表达颜色的色调、鲜艳程度和明暗程度,方便进行颜色的对比。
在 HSV 颜色空间下,比 BGR 更容易跟踪某种颜色的物体,常用于分割指定颜色的物体。
调色板
接下来,我们分别实现一个调色板和一个HSV颜色提取的程序。
import cv2import numpy as np# 创建一个 300*512*3 的图片img=np.zeros((300,512,3),np.uint8)cv2.namedWindow('image')# 滑动条回调函数def pr(x):print(x)# 创建3个滑动条 分别控制BGR三个颜色cv2.createTrackbar('B','image',0,255,pr)cv2.createTrackbar('G','image',0,255,pr)cv2.createTrackbar('R','image',0,255,pr)while True:cv2.imshow('image',img)k=cv2.waitKey(1)if k==ord('q'):break# 获取滑动条的值b=cv2.getTrackbarPos('B','image')g=cv2.getTrackbarPos('G','image')r=cv2.getTrackbarPos('R','image')# 将值填充进初始图片中img[:]=[b,g,r]cv2.destroyAllWindows()
程序的运行结果如下(可以拖动滑动条改变颜色):

函数解析:cv2.createTrackbar('B','image',0,255,pr)
作用:创建一个滑动条
| b | 滑动条名称 | 
| image | 滑动条被放置的窗口的名字 | 
| 0 | 滑动条默认值 | 
| 255 | 滑动条最大值 | 
| pr | 滑动条的回调函数 | 
颜色提取
接下来,我们以同样的方式定义进度条,分别代表hsv最低值 和hsv最高值,然后通过这个区间,取得我们需要的颜色。
import cv2import numpy as np# 滑动条回调函数def pr(x):print(x)cv2.namedWindow('hsv')cv2.createTrackbar('LH','hsv',0,255,pr)cv2.createTrackbar('LS','hsv',0,255,pr)cv2.createTrackbar('LV','hsv',0,255,pr)cv2.createTrackbar('UH','hsv',255,255,pr)cv2.createTrackbar('US','hsv',255,255,pr)cv2.createTrackbar('UV','hsv',255,255,pr)while True:image=cv2.imread('opencv_image/smarties.png')hsv=cv2.cvtColor(image,cv2.COLOR_BGR2HSV)lh=cv2.getTrackbarPos('LH','hsv')ls=cv2.getTrackbarPos('LS','hsv')lv=cv2.getTrackbarPos('LV','hsv')uh=cv2.getTrackbarPos('UH','hsv')us=cv2.getTrackbarPos('US','hsv')uv=cv2.getTrackbarPos('UV','hsv')l_b=np.array([lh,ls,lv])u_b=np.array([uh,us,uv])masks=cv2.inRange(hsv,l_b,u_b)res=cv2.bitwise_and(image,image,mask=masks)cv2.imshow('image',image)cv2.imshow('res',res)cv2.waitKey(1)cv2.destroyAllWindows()
程序运行的结果如下(滑动进度条,提取不同颜色的小球):

函数解析:maks=cv2.inRange(hsv,l_b,u_b)
作用:提取mask
| hsv | 转换成hsv颜色空间的图片 | 
| l_b | 低于这个值,图像值为0 | 
| u_b | 高于这个值 ,图像值为0 | 




扫二维码|关注我们
微信号|深度学习从入门到放弃
长按关注|永不迷路
