【问题标题】:manipulating luma in YUV color space在 YUV 颜色空间中操作亮度
【发布时间】:2012-05-21 11:19:14
【问题描述】:

我不会在 byte[] 格式的图像上设置对比度/亮度。 图像在 YCbCr_420 颜色空间(安卓相机)中。 我以这种方式获得亮度值:

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);

感谢任何帮助。

【问题讨论】:

    标签: android image-processing yuv


    【解决方案1】:

    我从这个 API 知道的一点是 3 个通道的值被连接在一个字节数组中。所以,同样在使用 RGB 的 Windows 中,我想你在这里有相同的,我的意思是,每 3 个字节代表一个像素。所以我猜,你可以每跳 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
    

    在将最终像素结果分配给图像之前,您必须小心上溢和下溢。

    【讨论】:

    • 感谢安德烈斯提供明亮/对比度信息。获取 y 值的方法运行良好,是否正确设置 y(需要掩码?):yuv420sp[yp] = (byte) ((0xff & y) +16);
    • 嗨,所以这部分代码: yuv420sp[yp] = (byte) ((0xff & y) +16) 是错误的(图像只是绿色),请任何人建议如何在 YUV 中正确设置值?
    • 为了对比,乘以像你的 1.10 这样的因子会使一切变得更亮,而你需要的是让明亮的东西更亮,让黑暗的东西更暗。相反,我会远离中心值:如果值为 0 到 255,请使用 luma[y] = (luma[y]-128)*1.10+128
    【解决方案2】:

    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;

    【讨论】: