OpenCV中有数百种关于在不同色彩空间之间的转换的方法。当前,计算机视觉中有三种常用的色彩空间:灰度、BGR以及HSV(Hue,Saturation,Value)。
- 灰度色彩空间是通过去除彩色信息来将其转换成灰阶,灰度色彩空间对中间处理特别有效,比如人脸检测。
- BGR,即蓝-绿-红色彩空间,每一个像素点都由一个三元数组来表示,分别代表蓝、绿、红三种颜色。另一个与之相似的颜色空间:RGB,它们只是在颜色的顺序上不同。
- HSV, H(Hue)是色调,S(Saturation)是饱和度,V(Value)表示黑暗的程度(或光谱的另一端的明亮程度)
下面看一下OpenCV色彩空间代码实现以及展示的效果图:
#!/usr/bin/env python
# _*_ coding:utf-8 _*_
import cv2 as cv
def color_space(image):
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY) #灰度图
cv.imshow("gray", gray)
hsv = cv.cvtColor(image, cv.COLOR_BGR2HSV) #HSV
cv.imshow("hsv", hsv)
yuv = cv.cvtColor(image, cv.COLOR_BGR2YUV) #YUV
cv.imshow("yuv", yuv)
ycrcb = cv.cvtColor(image, cv.COLOR_BGR2YCrCb) #YCrCb
cv.imshow("ycrcb", ycrcb)
img = cv.imread("F:\\flower.jpg")
cv.namedWindow("image window", cv.WINDOW_AUTOSIZE)
cv.imshow("image window", img)
color_space(img)
cv.waitKey(0)
cv.destroyAllWindows()
原图:
灰度图:
HSV效果图:
YUV效果图:
YCrCb效果图:
接下来我们介绍色彩空间方面从视频文件中过滤某种颜色。
颜色范围表
#!/usr/bin/env python
# _*_ coding:utf-8 _*_
import cv2 as cv
import numpy as np
def extract_obj():
capture = cv.VideoCapture("D:\\02Jumping.wmv") #读取视频文件
while(True): #判断是否读取成功
ret, frame = capture.read()
if ret == False:
break
#把视频中的某种颜色过滤出来
hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV) # 转换成HSV色彩空间
lower_hsv = np.array([0, 43, 46]) # 色彩低值(红色)
upper_hsv = np.array([180, 255, 255]) # 色彩高值
# lower_hsv = np.array([35, 43, 46]) # 色彩低值(绿色)
# upper_hsv = np.array([77, 255, 255]) # 色彩高值
mask =cv.inRange(hsv, lowerb=lower_hsv, upperb=upper_hsv)#inRange之后得到的是二值图像
cv.imshow("video", frame) #显示视频文件
cv.imshow("mask", mask)
c = cv.waitKey(30)
if c == 27:
break
extract_obj()
cv.waitKey(0)
cv.destroyAllWindows()
运行显示的视频效果如下图:左边是原视频,右边是处理红色色彩空间之后的视频效果
最后介绍通道的分离与合并部分。
#!/usr/bin/env python
# _*_ coding:utf-8 _*_
import cv2 as cv
import numpy as np
#通道的分离
img = cv.imread("F:\\flower.jpg")
cv.namedWindow("image window", cv.WINDOW_AUTOSIZE)
cv.imshow("image window", img)
b, g, r = cv.split(img)
cv.imshow("blue", b)
cv.imshow("green", g)
cv.imshow("red", r)
#通道的合并
src = cv.merge([b, g, r])
src[:, :, 0] = 0
cv.imshow("merger image", img)
cv.waitKey(0)
cv.destroyAllWindows()
运行效果如下:
合并图与原图是不是一样呢?