使用c ++调整位图图像亮度/对比度

时间:2010-06-04 17:07:21

标签: c++ image-processing

使用c ++调整图像亮度/对比度,而不使用任何其他第三方库或依赖

2 个答案:

答案 0 :(得分:4)

使用库读取图像,就像Independent JPEG library一样。当您有原始数据时,您可以convert it从RGB到HSL或(最好)CIE L a b *。对比度和亮度基本上只涉及调整L通道 - 调整亮度,只需将所有L值向上或向下调整适当的量。要调整对比度,您基本上可以调整特定值和中心值之间的差异。您通常希望非线性地执行此操作,因此接近范围中间的值会进行相当大的调整,但接近结束或范围的值几乎不会受到影响(并且任何情况都会受到影响)结束,根本没有改变。)

完成后,您可以转换回RGB,然后返回普通格式,如JPEG。

答案 1 :(得分:3)

图像亮度 here (死链接) - 使用RGB值的平均值并移动它们。

对比度 here (死链接)以及其他语言解决方案。


编辑链接已死:

Jerry Coffin在下面给出的答案涵盖了相同的主题,并且链接仍然存在。

但是,要调整亮度,可以为图像的R,G,B字段添加一个常量值。确保使用饱和数学 - 不允许值低于0或高于位深度允许的最大值(24位颜色为8位)

RGB_struct color = GetPixelColor(x, y);
size_t newRed   = truncate(color.red   + brightAdjust);
size_t newGreen = truncate(color.green + brightAdjust);
size_t newBlue  = truncate(color.blue  + brightAdjust);

相比之下,我已经从this website采取并略微修改了代码:

float factor = (259.0 * (contrast + 255.0)) / (255.0 * (259.0 - contrast));
RGB_struct color = GetPixelColor(x, y);
size_t newRed   = truncate((size_t)(factor * (color.red   - 128) + 128));
size_t newGreen = truncate((size_t)(factor * (color.green - 128) + 128));
size_t newBlue  = truncate((size_t)(factor * (color.blue  - 128) + 128));

truncate(int value)确保8位颜色的值保持在0到255之间。请注意,许多CPU具有内部功能,可以在一个周期内完成此操作。

size_t truncate(size_t value)
{
    if(value < 0) return 0;
    if(value > 255) return 255;

    return value;
}