网上有许多工具可以拍摄图像并模拟该图像对于色盲患者的样子。但是,我找不到这些算法的任何描述。
是否有用于模拟色盲的标准算法?我知道有许多类型的色盲(有关更多详细信息,请参阅有关该主题的 Wikipedia 页面),但我主要对模拟二色性的算法感兴趣。
网上有许多工具可以拍摄图像并模拟该图像对于色盲患者的样子。但是,我找不到这些算法的任何描述。
是否有用于模拟色盲的标准算法?我知道有许多类型的色盲(有关更多详细信息,请参阅有关该主题的 Wikipedia 页面),但我主要对模拟二色性的算法感兴趣。
我也有同样的挫败感,并写了一篇比较开源色盲模拟的文章。简而言之,主要有四种算法:
Coblis 和“HCIRN 色盲模拟功能”。您会在很多地方找到这个,以及MaPePeR的 Javascript 实现。完整的 HCIRN 模拟功能没有得到适当的评估,但在实践中是合理的。然而,colorjack 的“ColorMatrix”近似值非常不准确,应该完全避免(作者本人说过)。不幸的是,它仍然很普遍,因为它很容易复制/粘贴。
Brettel、Viénot 和 Mollon(1997 年)的“二色光颜色外观的计算机模拟”。一个非常可靠的参考。适用于各种二色性。我在libDaltonLens中编写了一个公共领域的 C 实现。
Viénot、Brettel 和 Mollon(1999 年)的“用于检查二色光显示器易读性的数字视频颜色图”。也是一个可靠的参考,简化了 1997 年关于红眼和红眼(3 种色盲中的 2 种)的论文。也在 libDaltonLens 中。
Machado 等人的“基于生理学的色觉缺陷模拟模型”。(2009 年)。预先计算的矩阵可以在他们的网站上找到,这样可以很容易地自己实现。您只需添加从 sRGB 到 linearRGB 的转换。
看起来您的答案在您链接的维基百科条目中。
例如:
红眼病(1% 的男性):缺乏对长波长敏感的视网膜视锥细胞,患有这种疾病的人无法区分光谱中绿色-黄色-红色部分的颜色。它们在 492 nm 附近的绿色波长处有一个中性点——也就是说,它们无法区分该波长的光和白色光。
因此,您需要将绿-黄-红光谱中的任何颜色去饱和为白色。 图像色彩饱和度
其他 2 种类型的二色性可以类似地处理。
首先,我们必须了解眼睛是如何工作的:
正常/健康的眼睛有 3 种视锥细胞和 1 种视杆细胞,它们在可见光谱范围内具有激活功能。
然后它们的激活会通过某些功能来产生进入大脑的信号。粗略地说,该函数以 4 个通道作为输入,产生 3 个通道作为输出(即亮度、黄蓝和红绿)。
一个色盲的人会有这两种东西中的一种是不同的(afaik 通常/总是 1.),所以例如这个人会缺少一种类型的锥体,或者锥体的激活会不同。
最好的办法是:
将 RGB 空间中的所有像素转换为频率组合(具有强度)。为此,首先计算(健康人的)三个锥体中的每一个的激活,然后为会导致相同激活的一组频率(+强度)找到一个“自然”解决方案。当然,一种解决方案是原始的三个 RGB 频率及其强度,但原始图像实际上不太可能具有这种情况。例如,一个自然的解决方案是围绕某个频率(或什至只是一个频率)的正态分布。
然后,(再次针对每个像素)计算色盲人的视锥细胞对您的频率组合的激活。
最后,找到一个 RGB 值,使健康人与色盲人具有相同的激活。
请注意,如果这些激活的组合方式对于相关类型的色盲也不同,您可能希望在上述步骤中也执行此操作。(所以不是匹配激活,而是在激活上匹配函数的结果)。