YUV、RGB、HSV
YUV:亮度信息 即灰度值。UV:色彩信息 定义了颜色的两个方面-色调与饱和度,分别用Cr和CB来表示。其中,Cr反映了RGB输入信号红色部分与RGB信号亮度值之间的差异。而CB反映的是RGB输入信号蓝色部分与RGB信号亮度值之同的差异。通过运算,YUV三分量可以还原出R(红),G(绿),B(蓝)。
HSV: 色调(H),饱和度(S),明度(V)
相互转换
ARGB -> RGB
1 2 3 4 5 6 7 8
| //unsigned char *data 存的是ARGB的裸数据; cv::Mat argbImg; cv::Mat rgbImg(cy, cx,CV_8UC3); yuvImg.create(cy, cx, CV_8UC4); memcpy(argbImg.data, data, len); cv::cvtColor(argbImg, rgbImg, CV_RGBA2RGB); flip(rgbImg, rgbImg, 0); //垂直翻转
|
YUV -> RGB
1 2 3 4 5 6 7
| //unsigned char *data 存的是YUYV的裸数据; cv::Mat yuvImg; cv::Mat rgbImg(cy, cx,CV_8UC3); yuvImg.create(cy , cx, CV_8UC2); memcpy(yuvImg.data, data, len); cv::cvtColor(yuvImg, rgbImg, CV_YUV2BGR_YUYV);
|
I420 -> RGB
1 2 3 4 5 6 7
| //unsigned char *data 存的是I420的裸数据; cv::Mat yuvImg; cv::Mat rgbImg(cy, cx,CV_8UC3); yuvImg.create(cy * 3/2, cx, CV_8UC1); memcpy(yuvImg.data, data, len); cv::cvtColor(yuvImg, rgbImg, CV_YUV2BGR_I420);
|
OpenCV提供的转换函数实现YUV到RGB的转换:
1 2 3 4 5 6 7 8 9
| bool YV12ToBGR24_OpenCV(unsigned char* pYUV,unsigned char* pBGR24,int width,int height) { if (width < 1 || height < 1 || pYUV == NULL || pBGR24 == NULL) return false; Mat dst(height,width,CV_8UC3,pBGR24); Mat src(height + height/2,width,CV_8UC1,pYUV); cvtColor(src,dst,CV_YUV2BGR_YV12); return true; }
|
RGB -> HSV
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| # -*- coding:utf-8 -*-
import cv2
""" 功能:读取一张图片,显示出来,并转化为HSV色彩空间 """ image = cv2.imread('images/my_wife2.jpg') # 根据路径读取一张图片 cv2.imshow("BGR", image) # 显示图片
# 转化图片到HSV色彩空间 dst = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) cv2.imshow("HSV", dst) # 显示图片 cv2.waitKey(0) # 等待键盘触发事件,释放窗口
|
White Balance
概念
相机的白平衡控制,是为了让实际环境中白色的物体在你拍摄的画面中也呈现出“真正”的白色。不同性质的光源会在画面中产生不同的色彩倾向,比如说,蜡烛的光线会使画面偏橘黄色,而黄昏过后的光线则会为景物披上一层蓝色的冷调。而我们的视觉系统会自动对不同的光线作出补偿,所以无论在暖调还是冷调的光线环境下,我们看一张白纸永远还是白色的。但相机则不然,它只会直接记录呈现在它面前的色彩,这就会导致画面色彩偏暖或偏冷。
实现
开暖光灯:YUV -> RGB -> SV ,全图SV值S需在0~0.1之间,V需在90~255之间。