Graphics 一种较好的灰度算法

Graphics 一种较好的灰度算法,graphics,colors,Graphics,Colors,我试图为每一行创建一个灰度值恒定的光谱图像。我编写了一些速度非常慢的代码,基本上尝试了给定色调的1000种不同的黑白变化,它找到了灰度值最接近目标值的一种,产生了下图: 在我的笔记本电脑屏幕(HP)上,在蓝色峰值附近有一个非常明显的“下降”,图像底部附近的蓝色像素比相邻的紫色和青色像素亮得多。在我的第二个屏幕上(Acer,它的彩色显示效果要好得多),倾角更小,但仍然存在 我使用以下函数计算颜色的灰度近似值: Math.Abs(targetGrey - (0.2989 * R + 0.5870

我试图为每一行创建一个灰度值恒定的光谱图像。我编写了一些速度非常慢的代码,基本上尝试了给定色调的1000种不同的黑白变化,它找到了灰度值最接近目标值的一种,产生了下图:

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

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

Math.Abs(targetGrey - (0.2989 * R + 0.5870 * G + 0.1140 * B))
当我使用Paint.NET将图像转换为灰度时,我得到了一个完美的黑白渐变,因此部分代码至少可以正常工作

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



编辑:问题似乎主要是监视器校准。我重复一遍,代码没有问题

我想知道这是否更多的是因为我们的眼睛解读颜色的方式,而不是屏幕上的瑕疵


也就是说。。。我使用的是一个非常高质量的屏幕(戴尔Ultrasharp,IPS),具有难以置信的色彩再现能力,我不知道你所说的蓝色峰值的“下倾”是什么意思。因此,要么我没有注意到,要么我的屏幕没有显示相同的图片,颜色更精确。

考虑到您使用的灰度转换(我认为这是sRGB颜色空间的标准转换),输出看起来是正确的

然而,在色彩模型中有很多折衷,其中之一就是你可以得到视觉上不完全符合你要求的结果。在您的例子中,蓝色权重非常低这一事实意味着需要更多的蓝色才能获得任何给定的灰度值,因此蓝色似乎开始变低,至少就人眼的感知而言


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

超级聪明——在我看来它也不是线性的,但我认为这是非线性生物学的结果。没有颜色校准显示,您无法判断生成的图像是否正常。我几乎看不到我的显示器有任何下降。@Codo,谢谢。我担心如果没有颜色校准设备,根本就没有解决方案。我会看看是否可以校准Acer显示器,如果问题消失,我知道不是我:)很明显,我使用的灰度函数已经基于人类的颜色视觉系数。但不知何故,我怀疑像这样简单的功能是否能够真正复制人类的彩色视觉,并具有足够的准确性,以满足我的需要。我校准了显示器,现在光谱图像看起来好多了。仍然有一些小的不规则,但我认为,用专业的校准方法,甚至这些都会消失。