把我的对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指令集能实现非常高效的媒体转换,还没有去研究过。
{
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指令集能实现非常高效的媒体转换,还没有去研究过。
相关文章推荐
- 把我的对YUV数据修改亮度,对比度,灰度的函数共享。色度研究当中。
- python 通过函数无返回的修改数据结构,在函数外部,数据结构也可被修改
- c#中用windows api函数修改内存数据
- c#中用windows api函数修改内存数据
- 怎样调整图像的亮度、色度、饱和度和对比度?我要代码或者可用的DLL
- 用friend函数修改类的private数据
- CoreImage 可以用滤镜来处理图片,比如修改饱和度,亮度,对比度等
- 关于亮度,对比度以及色度调节
- 灰度图像亮度对比度调整的简单代码
- unity 修改亮度,对比度,饱和度的处理
- 怎样处理请求数据的函数修改为同步执行的函数
- 使用文件映射的方式进行共享数据中CreateFileMapping、MapViewOfFile函数参数说明
- Oracle数据库(Oracle存储结构、Oracle运行机制、日期相关的函数、序列、大对象数据类型、表的修改与约束、事务)
- yii2.0之-模型中attributeLabels()函数的作用 和修改数据表中的字段后如何更新model中的字段
- 程序运行 栈帧分析 以及 修改栈帧中数据以及函数地址
- C++程序 证明类的数据成员的内存分配是独立的 ,成员函数是共享的
- 【Java】多线程系列(一)之共享数据修改
- java线程当中 sleep() join() yield()方法的简单比较以及如何保护共享数据介绍
- 数据科学(大数据处理)领域的大牛和研究机构 总结(第二次修改)
- 修改USB数据共享