YUV颜色空间介绍,低照度图像增强算法。

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

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值