您的位置:首页 > 其它

把我的对YUV数据修改亮度,对比度,灰度的函数共享。色度研究当中。

2008-04-14 09:05 781 查看
HRESULT CPlay_Image::YUV420ConvertImage(UCHAR *pYUV,LONG lYUVWidth,LONG lYUVHeight,LONG lBrightness,LONG lColorfulness,LONG lContrast)
{
UCHAR *pY = pYUV;
UCHAR *pU = pYUV + lYUVWidth * lYUVHeight;
UCHAR *pV = pYUV + lYUVWidth * lYUVHeight * 5 / 4;

LONG width = ((lYUVWidth * 3 + 3) / 4) * 4;

LONG uvHeight = lYUVHeight / 2;
LONG uvWidth = lYUVWidth / 2;
for (LONG i=0; i<lYUVHeight; i++)
{
LONG yi = lYUVHeight - 1 - i;
LONG uvi = yi / 2;
for (LONG j=0; j<lYUVWidth; j++)
{
LONG uvj = j / 2;

UCHAR iY = *(pY + yi * lYUVWidth + j);
UCHAR iU = *(pU + uvi * uvWidth + uvj);
UCHAR iV = *(pV + uvi * uvWidth + uvj);

//YUV转换为RGB
DOUBLE dR = (iY+0) + 1.402*(iV-128);
DOUBLE dG = (iY+0) - 0.344*(iU-128) - 0.714*(iV-128);
DOUBLE dB = (iY+0) + 1.772*(iU-128);

dR = min(max(0, dR), 255);
dG = min(max(0, dG), 255);
dB = min(max(0, dB), 255);

/************************************************************************/
/* 以下代码对亮度进行修改,修改完成重新计算YUV值 */
/************************************************************************/
if(dR + lBrightness > 255)
{
dR = 255;
}
else if(dR + lBrightness < 0)
{
dR = 0;
}
else
{
dR += lBrightness;
}

if(dG + lBrightness > 255)
{
dG = 255;
}
else if(dG + lBrightness < 0)
{
dG = 0;
}
else
{
dG += lBrightness;
}

if(dB + lBrightness > 255)
{
dB = 255;
}
else if(dB + lBrightness < 0)
{
dB = 0;
}
else
{
dB += lBrightness;
}

//以下三行是自己换算的公式,画面效果相差较大
// UCHAR lY = UCHAR(iY - 0.108 * iV + lBrightness + 13.75744) + 1;
// UCHAR lU = UCHAR(iU + 0.061 * iV -7.683) - 1;
// UCHAR lV = UCHAR(1.076 * iV -9.761) - 1;

/************************************************************************/
/* 以下代码对对比度进行修改 */
/************************************************************************/
FLOAT fContrast = (FLOAT)lContrast;
fContrast = 1.0;

dR = (dR - 127) * fContrast + 127;
if(dR > 255)
{
dR = 255;
}

dG = (dG - 127) * fContrast + 127;
if(dG > 255)
{
dG = 255;
}

dB = (dB - 127) * fContrast + 127;
if(dB > 255)
{
dB= 255;
}

/************************************************************************/
/* 以下代码把图像转换为灰色图像,不过数据量不变的情况下,似乎没什么意义*/
/*
iY = UCHAR(0.299 * dR + 0.587 * dG + 0.114 * dB);
dR = iY;
dG = iY;
dB = iY;
*/
/************************************************************************/

//RGB转换为YUV
iY = UCHAR(0.299 * dR + 0.587 * dG + 0.114 * dB);
iU = UCHAR(0.564 * (dB - iY) + 128);
iV = UCHAR(0.713 * (dR - iY) + 128);

*(pY + yi * lYUVWidth + j) = iY;
*(pU + uvi * uvWidth + uvj) = iU;
*(pV + uvi * uvWidth + uvj) = iV;
}
}
return 0;
}

此函数是用来同时修改亮度,色度,对比度的。上边那个直接修改YUV的公式,是通过把YUV转换为RGB,RGB转换为YUV的公式换算出来的。算了两遍感觉出入还是很大。难道我取值不够精确?

这个函数的效率不高,我办公用的电脑CPU为 双核 E2140,CPU使用率在不调用此函数时播放单路图像为3%,使用此函数后播放单路图像猛增到30%。
要提高效率,其中一点应该把亮度和对比度放在一起计算,另一点是如果把亮度和对比度放在一起计算的话,把重复计算的东西抽出来。还有就是能够不转换成RGB值而至今对YUV数据进行修改,但至今我还没有找到这个公式,我自己的计算也有问题。

据说使用MMX,SSE2指令集能实现非常高效的媒体转换,还没有去研究过。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐