打印
[牛人杂谈]

伽马校正的算法

[复制链接]
349|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 zhuomuniao110 于 2024-9-8 18:24 编辑

伽马校正(Gamma Correction)是一种用于调整图像或显示设备上的亮度或色彩的非线性算法。其目的是将物理输出(如LED的亮度或显示屏的亮度)与人眼的感知亮度更好地匹配。人眼对亮度变化并不是线性敏感,而是更接近对数或幂函数关系,因此直接使用线性亮度变化会导致亮度感知不均匀。伽马校正通过非线性函数对输入值进行调整,使得视觉效果更加自然。

伽马校正的基本原理
伽马校正使用以下公式来调整亮度或颜色:



其中:
  • Vout 是经过伽马校正后的输出亮度值。
  • Vin是输入的亮度值(通常归一化为0到1的范围)。
  • γ 是伽马值,通常在2.0到2.4之间,用于调整亮度响应曲线。



使用特权

评论回复
沙发
zhuomuniao110|  楼主 | 2024-9-8 18:23 | 只看该作者
伽马校正的应用场景
显示器:显示器的亮度响应通常是非线性的,因此在显示图像时,伽马校正用于补偿这种非线性,使得图像亮度更符合人眼的感知。

LED亮度控制:用于调节LED亮度时,由于LED的亮度与电流的关系是线性的,而人眼对亮度的感知是非线性的,因此直接线性调节LED的PWM占空比会导致视觉上亮度变化不均匀。通过伽马校正,可以让LED的亮度变化看起来更加平滑。

图像处理:在图像存储和传输过程中,伽马校正可以用于调整色彩值,以确保图像在不同设备上显示时,亮度和对比度的感知一致。

使用特权

评论回复
板凳
zhuomuniao110|  楼主 | 2024-9-8 18:25 | 只看该作者
伽马校正的效果伽马值 γ>1\gamma > 1 会使图像整体变得更暗,因为输入值较小的区域(如暗部)被压缩,而较大的值(如亮部)被拉伸。
例如,γ=2.2\gamma = 2.2是常见的伽马校正值,常用于显示器或电视屏幕。
伽马值 γ<1\gamma < 1 则会使图像整体变亮。
实现伽马校正在实际应用中,伽马校正可以通过简单的查表(LUT,Look-Up Table)来实现。以下是伽马校正的一个简单示例,假设我们有一个8位的亮度值范围(0-255)


使用特权

评论回复
地板
zhuomuniao110|  楼主 | 2024-9-8 18:26 | 只看该作者
我们可以预先计算好经过伽马校正的值:
伽马校正算法的伪代码
#define GAMMA 2.2  // 伽马值,通常在2.0到2.4之间
#define MAX_BRIGHTNESS 255  // 亮度的最大值

byte gammaCorrectionTable[256];

void setup() {
  // 计算伽马校正表
  for (int i = 0; i < 256; i++) {
    float normalized = i / 255.0;  // 将亮度值归一化到 0 到 1 之间
    gammaCorrectionTable[i] = (byte)(pow(normalized, GAMMA) * 255.0);  // 应用伽马公式
  }
}

void loop() {
  // 使用gammaCorrectionTable进行亮度控制,例如在PWM输出时:
  int inputBrightness = analogRead(A0);  // 假设从一个输入读取亮度值
  int correctedBrightness = gammaCorrectionTable[inputBrightness];
  analogWrite(ledPin, correctedBrightness);  // 输出伽马校正后的亮度
}
使用伽马校正的优势
亮度均匀:通过匹配人眼的感知特性,伽马校正可以让亮度变化更加平滑,避免亮度突变。
图像质量提升:在显示设备和图像处理过程中,伽马校正能够确保图像在不同设备上显示一致,改善细节表现。
伽马校正的应用可以极大提升视觉体验,尤其在涉及LED亮度控制或图像显示的场景下。


使用特权

评论回复
5
zhuomuniao110|  楼主 | 2024-9-8 18:27 | 只看该作者
伽马值为 2.2 的查找表(数组示例)
byte gammaCorrectionTable[256] = {
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4,
  4, 5, 5, 6, 6, 7, 7, 8, 9, 9, 10, 10, 11, 12, 12, 13, 14, 15,
  16, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
  31, 33, 34, 35, 36, 37, 39, 40, 41, 43, 44, 45, 47, 48, 50, 51,
  53, 54, 56, 57, 59, 61, 62, 64, 66, 67, 69, 71, 73, 74, 76, 78,
  80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 109,
  111, 113, 115, 118, 120, 122, 125, 127, 129, 132, 134, 137, 139,
  142, 144, 147, 149, 152, 154, 157, 160, 162, 165, 168, 170, 173,
  176, 179, 181, 184, 187, 190, 193, 196, 199, 202, 205, 208, 211,
  214, 217, 220, 223, 226, 229, 233, 236, 239, 242, 245, 249, 252,
  255
};


说明:
  • 这个数组中的每个元素对应于原始亮度值经过伽马校正后的值,输入范围为 0-255。
  • 当伽马值为γ=2.2 时,亮度值经过伽马校正后,较低的值会保持更小,较大的值增加得更快,从而形成非线性的亮度感知。
  • 例如,输入亮度值 127(接近中间值),校正后的输出值为 102,这反映了人眼对亮度的非线性感知。
你可以使用类似的方法生成不同伽马值的查找表。如果伽马值变化,表中的数据也会随之改变。

使用特权

评论回复
6
chenjun89| | 2024-9-9 08:00 | 只看该作者
所以很多难题最终都是靠数学来实现的

使用特权

评论回复
7
gejigeji521| | 2024-9-9 21:51 | 只看该作者
查表法速度快一些。

使用特权

评论回复
8
AloneKaven| | 2024-9-11 21:31 | 只看该作者
查表法配置起来麻烦点

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

203

主题

3325

帖子

10

粉丝