模拟色盲的算法?

14

有很多在线工具可以将图片转换成色盲人所看到的效果,但我找不到这些算法的描述。

是否有标准算法用于模拟色盲?我知道有许多类型的色盲(请参阅维基百科上的主题页面以获取更多详细信息),但我主要关注模拟二色性的算法。

3个回答

4

我也曾经遇到同样的烦恼,写了一篇文章比较开源色盲模拟器。简而言之,有四种主要算法:

  1. Coblis和“HCIRN Color Blind Simulation function”,你可以在许多地方找到它,以及一个由MaPePeR编写的JavaScript实现jsColorblindSimulator。完整的HCIRN模拟函数未经适当评估,但在实践中是合理的。然而,colorjack的"ColorMatrix"近似方法非常不准确,应完全避免(作者自己也说)。不幸的是,由于易于复制/粘贴,它仍然很普遍。

  2. Brettel、Viénot和Mollon(1997)的“计算机模拟二色性的颜色外观”是非常可靠的参考文献。适用于所有类型的二色性。我在libDaltonLens中编写了一个公共域C实现。

  3. Viénot、Brettel和Mollon(1999年)的“用于检查二色性显示器清晰度的数字视频颜色映射”,也是一个可靠的参考,将1997年的论文简化为protanopia和deuteranopia(三种色盲中的两种)。同样在libDaltonLens中。

  4. Machado等人(2009)的“基于生理学的模拟色觉缺陷模型”。他们网站上提供了预计算矩阵CVD_Simulation.html,这使得自己实现变得容易。你只需要添加从sRGB到linearRGB的转换。


0

首先,我们必须了解眼睛的工作原理:

  1. 一个正常/健康的眼睛有3种圆锥体和1种杆状细胞,它们在可见光谱上具有激活功能。

  2. 然后它们的激活通过某些函数产生信号传递到你的大脑。粗略地说,该函数将4个通道作为输入,并产生3个通道作为输出(即亮度、黄蓝和红绿)。

  3. 色盲者会有其中两个不同(据我所知通常/总是是第一项),因此例如这个人可能会缺少一种类型的圆锥体或圆锥体的激活会有所不同。

最好的做法是:

  1. 将所有像素从RGB空间转换为频率的组合(带有强度)。为此,首先计算健康人的三个锥体的激活,然后找到一个“自然”的解决方案,以便一组频率(+强度)会导致相同的激活。当然,一个解决方案只是原始的三个RGB频率及其强度,但原始图像实际上可能没有那样。例如,一个自然的解决方案可能是围绕某个频率(甚至只有一个频率)的正态分布。

  2. 然后,(对于每个像素)计算色盲人的锥体对您的频率组合的激活。

  3. 最后,找到一个RGB值,使得健康人具有与色盲人相同的激活。

请注意,如果这些激活的组合方式对于相关类型的色盲也不同,则您可能还需要在上述步骤中执行该操作。(因此,您正在匹配函数在激活上的结果,而不是匹配激活本身)。


1
基本上你是对的,但有一个大问题,我们可以从波长获取RGB(参见https://dev59.com/X3A75IYBdhLWcg3wOWVd#22681410),但反过来却不行。因此,这只适用于已知波长的图像(PBR渲染或具有检测图像上物体并推断光谱组成能力的图像,或多波段图像)。 - Spektre

0

看起来你的答案在你提供的维基百科条目中。

例如:

红绿色盲(男性1%):缺乏长波敏感的视网膜锥体,这种情况下的人无法区分光谱中绿-黄-红色部分的颜色。他们在绿色波长约为492nm处有一个中性点,也就是说,他们无法将该波长的光与白色区分开来。

因此,您需要将绿-黄-红色光谱中的任何颜色去饱和至白色。 图像颜色饱和度

另外两种色觉缺陷也可以采用类似的方法处理。


4
虽然我喜欢你的分析,但是这个答案留下了很多关键细节没有解决。你将如何确定哪些颜色与这种峰值颜色“接近”?考虑到与该颜色的“距离”,你将如何确定需要降低多少饱和度? - templatetypedef

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接