在YUV颜色空间中操纵亮度

时间:2012-05-21 11:19:15

标签: android image-processing yuv

我不会在图像上设置对比度/亮度,其形式为字节[]。 图像位于YCbCr_420色彩空间(Android相机)中。 我这样对待亮度值:

for (int j = 0, yp = 0; j < height; j++) {
for (int i = 0; i < width; i++, yp++) {
    int y = (0xff & (yuv420sp[yp])) - 16;
    }
}

如何操纵y值来设置更多光线? 我也不确定这是否是回归价值的直接方式:

yuv420sp[yp] = (byte) ((0xff & y) +16);

Thanx寻求帮助。

2 个答案:

答案 0 :(得分:2)

我从这个API中得到的一点是,3个通道的值是以字节数组连接的。因此,同样在使用RGB的Windows中,我猜你在这里也有相同的意思,每3个字节代表一个像素。所以我GUESS,您可以访问它,每3个位置只能访问一个单独的通道(在您的情况下为Luma)。我只是不知道亮度是由第一个,第二个还是第三个字节表示。

其次,如果我理解你只想改变亮度/对比度(增加/减少)是正确的吗? 因为如果是这样,对比度只是乘法,亮度就是增加。

例如 - 假设您正在使用8位通道的伪代码:

luma[y] = luma[y] * 1.10; //Increases contrast

或者您可以使用更通用的形式:

luma[y] = luma[y] + (luma[y] * contrast); //where contrast ranges from -1.0 to 1.0

同样,你可以对亮度做同样的事情:

luma[y] = luma[y] + bright; //Where bright can range from -255 to 255

在这两种情况下,在将最终像素结果分配给图像之前,必须注意溢出和下溢。

答案 1 :(得分:0)

YUV处理最好在此示例应用程序的APLEAGLView.m文件中进行演示:

https://developer.apple.com/library/ios/samplecode/AVBasicVideoOutput/Listings/AVBasicVideoOutput_APLEAGLView_m.html#//apple_ref/doc/uid/DTS40013109-AVBasicVideoOutput_APLEAGLView_m-DontLinkElementID_6

在Shader.fsh文件中显示了对亮度和对比度的正确调整,以便它们保持彼此成比例的关系:

https://developer.apple.com/library/ios/samplecode/AVBasicVideoOutput/Listings/AVBasicVideoOutput_Shaders_Shader_fsh.html#//apple_ref/doc/uid/DTS40013109-AVBasicVideoOutput_Shaders_Shader_fsh-DontLinkElementID_9

如果您需要帮助处理代码,我可以提供帮助。但是,现在,使用用户指定的亮度阈值,亮度调整的Y平面计算如下:

Y'=(Y - (16/255))* lumaThreshold;