本文使用python实现。
色彩空间常用的就如下几种:RGB 、HSV 、HSI 、YCrCb(YUV)
RGB色彩就是常说的光学三原色,R代表Red(红色),G代表Green(绿色),B代表Blue(蓝色)。自然界中肉眼所能看到的任何色彩都可以由这三种色彩混合叠加而成。
HSV(Hue, Saturation, Value)是根据颜色的直观特性由A. R. Smith在1978年创建的一种颜色空间, 也称六角锥体模型。
HSI〔Hue-Saturation-Intensity(Lightness),HSI或HSL〕颜色模型用H、S、I三参数描述颜色特性,其中H定义颜色的频率,称为色调;S表示颜色的深浅程度,称为饱和度,I表示强度或亮度。在HSI颜色模型的双六棱锥表示,I是强度轴,色调H的角度范围为[0,2π],其中,纯红色的角度为0,纯绿色的角度为2π/3,纯蓝色的角度为4π/3。
YCrCb即YUV,主要用于优化彩色视频信号的传输,使其向后相容老式黑白电视。与RGB视频信号传输相比,它最大的优点在于只需占用极少的频宽(RGB要求三个独立的视频信号同时传输)。其中“Y”表示明亮度(Luminance或Luma),也就是灰阶值;而“U”和“V” 表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。“亮度”是透过RGB输入信号来建立的,方法是将RGB信号的特定部分叠加到一起。“色度”则定义了颜色的两个方面─色调与饱和度,分别用Cr和CB来表示。其中,Cr反映了RGB输入信号红色部分与RGB信号亮度值之间的差异。而CB反映的是RGB输入信号蓝色部分与RGB信号亮度值之间的差异。
色彩空间转换
import cv2 as cv
def color_space_demo(image):
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY) # RGB转灰度
cv.imshow("gray", gray)
hsv = cv.cvtColor(image, cv.COLOR_BGR2HSV) # RGB转hsv
cv.imshow("hsv", hsv)
yuv = cv.cvtColor(image, cv.COLOR_RGB2YUV) # RGB转yuv
cv.imshow("yuv", yuv)
Ycrcb = cv.cvtColor(image, cv.COLOR_RGB2YCrCb) # RGB转ycrcb
cv.imshow("ycrcb", Ycrcb)
src = cv.imread("C:/Users/admin/Desktop/14.jpg") # 打开一张图片
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE) # 设置图片尺寸,自动
cv.imshow("input image", src) # 显示图像
color_space_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()
运行效果如下:
图片百度找的,如有侵权,删除免究。
通道分离与合并
# 视频过滤指定颜色
def extrace_object_demo():
capture = cv.VideoCapture("C:/Users/admin/Desktop/23.mp4") # 打开视频文件
while True:
ret, frame = capture.read() # 读取视频
if ret is False:
break
hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV) # 将RGB转成HSV
lower_hsv = np.array([156, 43, 46]) # 要过滤的颜色低值(红色)
upper_hsv = np.array([180, 255, 255]) # 要过滤的颜色高值(红色)
mask = cv.inRange(hsv, lowerb=lower_hsv, upperb=upper_hsv) # 二值图像
cv.imshow("video", frame) # 显示原视频
cv.imshow("mask", mask) # 显示处理后的视频
c = cv.waitKey(40)
if c == 27:
break
该函数使用效果
图片的通道分离和通道合并
src = cv.imread("C:/Users/admin/Desktop/14.png") # 打开一张图片
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE) # 设置图片尺寸,自动
cv.imshow("input image", src) # 显示分离前的图像
b, g, r = cv.split(src) # 分离通道
cv.imshow("blue", b) # 显示蓝色通道
cv.imshow("green", g) # 显示绿色通道
cv.imshow("red", r) # 显示红色通道
src = cv.merge([b, g, r]) # 通道合并
cv.imshow("changed image", src) # 显示合并后的图像
cv.waitKey(0)
cv.destroyAllWindows()
分离后的效果
合并后的效果