问题标签 [gamma]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
2381 浏览

java - 如何从 PNG 中删除 Gamma 信息

我正在尝试生成没有伽玛信息的图像,以便 IE8 可以正确显示它们。使用了以下代码,但结果是一个扭曲的图像,看起来与原始图像完全不同。

这是原始图像和由上面的代码产生的失真图像。

谢谢!

0 投票
1 回答
388 浏览

curve - 色调曲线 - Lightroom

有人知道 Lightroom 3.4 中的色调曲线工具是否获得专利?我想在图像处理软件中实现类似的功能。

0 投票
3 回答
10713 浏览

opengl - 色彩空间、伽玛和图像增强

色彩空间。好了,大家都知道RGB了:在[0.0,1.0]范围内归一化的三个值,分别代表颜色分量Red Green Blue的强度;这种强度是线性的,不是吗?

伽玛。据我所知,伽玛是将RGB颜色分量映射到另一个值的函数。谷歌搜索,我看到了线性函数和非线性函数......线性函数似乎可以缩放 RGB 分量,所以它似乎可以调整图像亮度;非线性函数似乎可以“解压缩”较暗/较亮的组件。

现在,我开始实现一个图像查看器,它将不同的图像格式显示为纹理。我想修改这些图像的伽玛,所以我应该建立一个片段着色器并在纹理四边形上运行。很好,但我如何确定正确的伽马校正?

OpenGL 使用线性 RGB 颜色空间,使用浮点组件。实际上,我可以从这些值开始计算伽马校正值(具有特殊的浮点精度),因此它们在钳位伽马校正值后显示。

首先,我将确定伽马斜坡。我怎么能确定呢?(分析或使用查找表)

然后,我开始研究 OpenGL 扩展 EXT_framebuffer_sRGB,这似乎与扩展EXT_texture_sRGB非常相关。

EXT_texture_sRGB 引入了一种新的纹理格式,用于将文本值线性化到 RGB 线性空间中。(脚注1)通过这种方式,我知道sRGB色彩空间并将其用作线性RGB色彩空间。

相反,EXT_framebuffer_sRGB 扩展允许我将线性 RGB 值编码到 sRGB 帧缓冲区,而不用担心它。

...

等等,所有这些信息是为了什么?如果我可以使用 sRGB 帧缓冲区并加载 sRGB 纹理,则无需 sRGB 转换即可处理该纹理……我为什么要更正伽玛?

也许即使在 sRGB 缓冲区上,我也可以同样校正伽玛?或者我最好不要?以及亮度和对比度:它们应该在伽马校正之前还是之后应用?

信息量很大,我现在很困惑。希望你们中的某个人能更多地向我解释所有这些概念!谢谢你。

...

还有一个问题。如果设备伽玛不同于“标准”2.2,我如何“累积”不同的伽玛校正?我不知道是否清楚:如果图像 RGB 值已经针对伽马值为 2.2 的显示器进行了校正,但显示器的伽马值为 2.8,我该如何校正伽马?


(1) 这里有一些摘录来强调我的意思:

sRGB 色彩空间基于昏暗办公室中预期的典型(非线性)显示器特性。它已被国际电工委员会 (IEC) 标准化为 IEC 61966-2-1。sRGB 颜色空间大致对应于 2.2 伽马校正。


此扩展是否提供任何类型的 sRGB 帧缓冲区格式或保证使用 sRGB 纹理渲染的图像在输出到支持 sRGB 颜色空间的设备时“看起来不错”?

0 投票
1 回答
161 浏览

c - 在 dcraw 的 gamma_curve 中实现的算法的名称是什么?

Dcraw 包含以下算法来处理图像颜色:https ://gist.github.com/1047302 。
它是一种正式的(命名的)图像处理算法吗?

如果不是,我应该阅读什么来理解其背后的推理?

0 投票
1 回答
1066 浏览

directx - (DirectX9) 混合后的 sRGB 转换

我最近看到了这篇博客文章又一篇关于伽马校正的文章,它教会了我D3DPMISCCAPS_POSTBLENDSRGBCONVERT功能标志的可用性。

这应该允许在 DirectX9 上混合后进行正确的 sRGB 转换。

我不明白如何处理它?我可以查询我的设备 Direct3D 9Ex 设备以获取此功能,但如果支持,我该如何启用它?我可以在混合转换前和混合后选择吗?如果是,如何?

谢谢你的帮助!

0 投票
2 回答
2257 浏览

directx - (DirectX9) Gamma correction applied implicitely

UPDATE:

Thank you all very much for your answers. As Jesse Hall suggested, it looks like it is a driver (or hardware) problem. I tried the same app on other configurations and it worked as expected.

I tested the app on other computers which share the same GPU (ATI 4800 HD) but different versions of the driver and they all showed the same erroneous behavior (what seems to be a double gamma correction on write). On these computers, if have to set D3DRS_SRGBWRITEENABLE to false to fix the display. Anyone knows if this is a known bug on this hardware?

Even more strange is that I get the same end results with these two configurations:

  • D3DRS_SRGBWRITEENABLE = FALSE and D3DSAMP_SRGBTEXTURE to TRUE
  • D3DRS_SRGBWRITEENABLE = FALSE and D3DSAMP_SRGBTEXTURE to FALSE

In the pixel debugger, I see that linearization is applied properly in case 1 but (automatic) correction on write gives the same output as case 2 (which performs no conversion at all)...

// -- END OF UPDATE

I'm having some trouble fixing the gamma correction of a DirectX9 application.

When I enable texture linearization in the samplers (D3DSAMP_SRGBTEXTURE) and sRGB write for output (D3DRS_SRGBWRITEENABLE), it looks like gamma correction is applied twice.

Here is my setup. I used the following texture (from here) to draw a fullscreen quad: enter image description here

The results were visually too bright on the right side of the picture. I used PIX to debug one of those grey pixels and, if everything was set up properly, I would have expected an output value of 0.73 (=0.5^(1.0/2.2)). Unfortunately, the output of the pixel shader was 0.871 (which looks like it could be a gamma correction applied twice ?). I stepped inside the pixel shader with the debugger and the texture fetch returned a value of (0.491, 0.491, 0.491), which should mean linearization on read worked properly.

enter image description here

When I disable D3DRS_SRGBWRITEENABLE, the output of the pixel shader is 0.729 which looks much more correct to me.

enter image description here enter image description here

Any idea where does this conversion come from (in the debugger the pixel shader output was 0.491)? What other flags/render states should I check?

Thank you very much for your help!

0 投票
1 回答
833 浏览

objective-c - 将 1.8 的 Gamma 应用于 NSImage

我正在尝试将 NSImage 转换为 1.8 的伽玛值,但我运气不佳。我找到了一些代码,但没有任何工作。我有一个返回 NSImage 类别的 NSBitmapImageRep 的方法。

首先,我尝试使用我在网上找到的 CGColorSpaceCreateCalibratedRGB 函数更改色彩空间,但这没有效果:

接下来我尝试在位图图像属性上设置伽玛:

这设置了属性,但对输出图像没有影响。

有没有办法做到这一点?

0 投票
1 回答
1426 浏览

android - 伽玛曲线实验——将 2.2 转换为 1.8 的反面?

摩托罗拉 Photon 因展示其他人所谓的“黑色迷恋”而臭名昭著——在查看图片时,图像暗部的大部分细节都被压平为黑色。到目前为止,几乎每个人都将其归咎于 Pentile 显示器。然而,当我第一次看到这种效果时,我想到了一个不同的想法......“哇,这看起来和为 Windows 编码的图片在 Linux 和 Macintosh 上使用 1.8 的 gamma 时看起来一样(糟糕)的方式而不是 Windows 的 2.2" 标准。我的理论是,在某个地方,摩托罗拉使用一个旧库构建了 Photon 的 Android,当时摩托罗拉是 iPhone 之前的 Apple 合作伙伴(或者可能抓住了假设 1.8 gamma 而不是 2.2 的旧开源代码)。

为什么我这么肯定?几天前,我使用旧的 Epic 4G(三星 Galaxy S)和新的 Photon 对同一网页进行了屏幕截图。出乎意料的是,Epic 的屏幕截图 .png 看起来很正常,但 Photon 的屏幕截图 .png 在我的 PC 上查看时与在 Photon 屏幕上查看时的外观完全相同。看到它的那一刻,我想起了我之前关于可能存在 gamma-mapping 1.8-vs-2.2 错误的想法,并决定尝试编写一个演示应用程序向摩托罗拉展示并说服他们这是一个可以修复的真正错误。

我想做的一个实验是拍摄一张在明亮和黑暗区域都具有高动态范围和细节的 JPEG 图像,并将其重新编码为非标准伽马,该伽马基本上是 1.8 和 2.2 之间差异的两倍。这个想法是,如果我故意将它错误编码到相反的极端(2.6?),然后躺在元数据中并说它是 2.2,在光子上查看时它看起来很正常(因为相同的错误将 2.2 压低到 1.8将 2.6 压低到适当的 2.2)。

所以,两个问题:

  1. 如果将 2.2 伽马图像解码为 1.8,则与您得到的错误相反,伽马值是多少?2.6?

  2. 是否有任何简单的方法(免费的 Photoshop/gimp 插件、JPEG 编码库等)故意将源图像错误编码为该非标准伽玛?

0 投票
2 回答
6024 浏览

winapi - 正确使用 SetDeviceGammaRamp

我想添加在应用程序启动时调整屏幕伽玛并在退出时重置它的功能。虽然是否应该篡改 gamma 是有争议的(我个人认为它无用且有害),但是嘿,有些人希望能够做那种事情。

这也只是一个简单的 API 调用,所以一切都很简单,对吧?

MSDN 说:“伽马斜坡在 256 个 WORD 元素的三个数组中指定,每个 [...] 值必须存储在每个 WORD 的最高有效位中,以增加 DAC 的独立性。” . 这意味着,在我的理解中,类似于word_value = byte_value<<8,这听起来很奇怪,但这是我阅读它的方式。

Doom3 源代码包含一个函数,该函数接受三个char值数组并将它们转换为一个在上半部和下半部uint16_t具有相同字节值的值数组。换句话说,类似word_value = (byte_value<<8)|byte_value. 这同样很奇怪,但更糟糕的是它与上面的不一样

互联网上的各种业余程序员网站上也存在一些代码片段(显然一个是从另一个窃取的,因为它们与字母相同),它们做了一些模糊的数学运算,将线性索引乘以一个值,偏置为 128,并夹紧到 65535。我不太确定这是怎么回事,但对我来说这完全是胡说八道,而且它与上述两者都不相同。

是什么赋予了?它必须是明确定义的——无需猜测——您提供的数据必须是什么样子?最后,要做的是读取原始值并让用户无论如何调整一些滑块(并可选择使用用户的配置将该 blob 保存到磁盘),但仍然......为了修改这些值,需要知道它们是什么以及期望什么。

有没有人做过(并测试过!)这个并且知道哪个是正确的?

0 投票
1 回答
934 浏览

image-processing - Y'CbCr 空间中的伽马校正

我需要对 Y'CbCr 空间中的图像进行 gamma 校正,以便在图像中的饱和和饥饿区域显示细节,我想知道是否需要调整色度子通道?

我知道如果我饿死亮度通道像素,如果我不调整它,色度就会溢出。进行伽马校正时是否需要考虑相同的因素?调整色度通道是否值得?