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()
运行效果如下:
合并图与原图是不是一样呢?