【发布时间】:2020-12-29 19:42:07
【问题描述】:
使用 c++ 调整图像亮度/对比度,而不使用任何其他 3rd 方库或依赖项
【问题讨论】:
-
也许您可以编写一个软件来提醒您使用屏幕上的按钮?不确定它是否必须写成
C++。 -
家庭作业?添加标签。并告诉我们你到目前为止做了什么。
标签: c++ image-processing
使用 c++ 调整图像亮度/对比度,而不使用任何其他 3rd 方库或依赖项
【问题讨论】:
C++。
标签: c++ image-processing
图像亮度为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;
}
【讨论】:
使用库读取图像,就像Independent JPEG library。当您有原始数据时,您可以 convert it 从 RGB 到 HSL 或(最好)CIE Lab*。对比度和亮度基本上都只涉及对 L 通道的调整——要调整亮度,只需将所有 L 值向上或向下调整适当的量。要调整对比度,您基本上是调整特定值和中心值之间的差异。您通常希望以非线性方式执行此操作,因此对范围中间附近的值进行了相当多的调整,但接近末端或范围的值几乎不会受到太大影响(以及任何处于非常结束,根本没有改变)。
完成此操作后,您可以转换回 RGB,然后再转换回普通格式,例如 JPEG。
【讨论】: