一个更好的灰度算法

时间:2011-02-06 12:09:00

标签: graphics colors

我正在尝试为每一行创建一个具有恒定灰度值的光谱图像。我已经编写了一些非常慢的代码,基本上在给定色调的黑色和白色之间尝试了1000种不同的变化,它找到了灰度值最接近目标值的那个,得到如下图像:

FarbenKugel

在我的笔记本电脑屏幕(HP)上,蓝色峰附近有一个非常明显的“倾角”,图像底部附近的蓝色像素看起来比相邻的紫色和青色像素亮得多。在我的第二个屏幕(Acer,它具有更好的彩色显示屏)上,倾角较小,但仍然存在。

我使用以下函数计算颜色的灰度近似值:

Math.Abs(targetGrey - (0.2989 * R + 0.5870 * G + 0.1140 * B))

当我使用Paint.NET将图像转换为灰度时,我得到了一个完美的黑白渐变,因此部分代码至少可以工作。

所以,问题:这纯粹是我的屏幕显示质量的人工制品吗?或者可以改进上述灰度算法以获得视觉上更一致的结果?


编辑:问题似乎主要是监视器校准。不,我再说一遍,代码的问题。

2 个答案:

答案 0 :(得分:1)

我想知道它是否与我们的眼睛解释颜色的方式有关,而不是屏幕伪影。

那就是说......我正在使用非常高质量的屏幕(Dell Ultrasharp,IPS),它具有令人难以置信的色彩再现,我不确定你在蓝色峰值中“倾斜”是什么意思。所以要么我只是没有注意到它,要么我的屏幕没有显示相同的图片,而且颜色更准确。

答案 1 :(得分:1)

鉴于您使用的灰度转换(我认为是sRGB色彩空间的标准转换),输出看起来是正确的。

然而 - 颜色模型中存在许多权衡,其中之一就是您可以获得视觉效果不理想的结果。在你的情况下,蓝色权重非常低的事实意味着需要更多的蓝色来获得任何给定的灰度值,因此蓝色似乎开始更低,至少就人眼如何感知它而言。

如果你的目标是获得一个视觉上吸引人的光谱图像,那么我建议改变你的功能,使R,G,B权重更加平等,看看你是否喜欢你得到的。