1.YUV颜色空间介绍
YUV是编译true-color颜色空间(color space)的种类,Y’UV, YUV, YCbCr,YPbPr等专有名词都可以称为YUV,彼此有重叠。
其中,“Y”表示明亮度(Luminance或Luma),也就是灰阶值,“U”和“V”表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。
在最近十年中,视频工程师发现人眼对色度的敏感程度要低于对亮度的敏感程度。在生理学中,有一条规律,那就是人类视网膜上的视网膜杆细胞要多于视网膜锥细胞,说得通俗一些,视网膜杆细胞的作用就是识别亮度,而视网膜锥细胞的作用就是识别色度。所以,你的眼睛对于亮和暗的分辨要比对颜色的分辨精细一些。基于此原理, 在使用YUV的时候, 保证Y分量的前提下, 可以舍弃一部分UV分量,来减少对带宽的需求。却也并不会太影响图像的质量。
YUV颜色空间是彩色电视兴起后, 对黑白电视兼容的产物。因为RGB颜色空间中, 每一个像素都需要三个分量的叠加, 就需要三通道的信号,即便是表示黑白像素。 但是在YUV颜色空间中,Y就表示了灰度信息, 也就是黑白图像。所以YUV像素编码, 成功的兼容了黑白电视信号。
2.基于YUV的亮度值转换算法
该算法的特点是将亮度和色度分离开,从而适合于图像处理领域。
YUV 和RGB 的转化算法遵循以下公式:
Y’= 0.299R’ + 0.587G’ + 0.114*B’
U’= -0.147R’ - 0.289G’ + 0.436B’ = 0.492(B’- Y’)
V’= 0.615R’ - 0.515G’ - 0.100B’ = 0.877(R’- Y’)
R’ = Y’ + 1.140*V’
G’ = Y’ - 0.394U’ - 0.581V’
B’ = Y’ + 2.032*U’
根据YUV的定义,可以将RGB转换为亮度值,其公式为:
L = 0.299R + 0.587G + 0.114*B
其中L表示亮度,R,G,B表示RGB颜色空间的分量。
3.该算法的作用
通过亮度值的转换,可以将RGB图像直接转换成为单通道的亮度值矩阵。以满足部分算法的需求。
例如 Stockham[1] 使用如下公式作为低照度图像增强的方法:
其中,Ld为输出的亮度值,Lw为输入的亮度值,Lmax为最大的亮度值。
根据该公式,能够得到比log增强默认参数更好的效果:
Mat Enhance::LogLow2Hight(Mat src)
{
float Lmax = 0;
IplImage tmp = (IplImage)(src);;
CvArr* arr = (CvArr*)&tmp;
//get Lmax
CvScalar scalar;
for (int i = 0; i <= src.rows - 1; ++i) {
for (int j = 0; j <= src.cols - 1; ++j) {
scalar = cvGet2D(arr, i, j);
float Lw = 0.299f * scalar.val[2] + 0.587f * scalar.val[1] + 0.114f * scalar.val[0];
if (Lw > Lmax)
{
Lmax = Lw;
}
}
}
Mat newImage;
newImage.create(src.size(), src.type());
IplImage tmpNew = (IplImage)(newImage);
CvArr* arrNew = (CvArr*)&tmpNew;
vector<Mat> channels;
for (int i = 0; i <= src.rows - 1; ++i)
{
for (int j = 0; j <= src.cols - 1; ++j)
{
scalar = cvGet2D(arr, i, j);
//get YUV-Y
float Lw = 0.299f * scalar.val[2] + 0.587f * scalar.val[1] + 0.114f * scalar.val[0];
float Ld = log(Lw+1)/log(Lmax+1);
float U = 0.492*(scalar.val[0] - Ld);
float V = 0.877*(scalar.val[2] - Ld);
scalar.val[0] = Ld + 2.032*U;//B
scalar.val[1] = Ld - 0.394*U - 0.581*V;//G
scalar.val[2] = Ld + 1.140*V;//R
cvSet2D(arrNew,i,j, scalar);
}
}
Mat img = cv::cvarrToMat(arrNew);
resize(img,img,Size(0,0),0.5,0.5);
imshow("Log低照度图像增强", img);
waitKey(0);
return img;
}
除此之外,也可以根据该公式做亮度值控制的算法,比较简单且意义不大,此处不做代码实现。其他应用场景需等待思考验证。
参考文献
1.T.G. Stockham. Image Processing in the Context of aVisual Model,Proceedings of the IEEE,60:828–842