问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

色弱如何识别色盲检测图

创作时间:
2025-01-22 20:25:23
作者:
@小白创作中心

色弱如何识别色盲检测图

色盲检测是许多色弱人群在体检时面临的一大难题。本文将从色弱人群的视角出发,详细介绍如何识别色盲检测图,包括使用工具辅助识别、自研程序识别以及通过逻辑推理识别等方法。

这难道不是一头鹿嘛?

先看看一张经典老图吧:这难道不是一头鹿嘛?

但是正常人看到的是一头牛,为什么会有这样的差别呢?

不知道大家是否有和我一样的困扰,能看清辨别日常生活中的红橙黄绿蓝青紫,但是体检色盲检测图就是看不清或者看到的和别人看到的不一样,高中体检、大学体检、驾照体检,成绩和技术都过关了,就因为色盲检查卡关,心里可太难受了。

因为咱们色弱视觉上对颜色类型不那么敏感,反而对颜色暗亮敏感。上面这张图的鹿头是偏亮的红色、身体和前腿是偏亮的蓝色绿色、后腿是偏亮的红色,所以我们会觉得他是一头鹿,但却是不同颜色组成。

借助工具识别色盲检测图

一次驾照体检,我为了解决色盲检测这个老大难的问题,一开始想的办法就是:把所有的图都背下来,背了小半天实在记不住,就放弃了。

我又在网上搜到了有一些工具可以辅助,例如:色弱眼睛、windows系统的颜色滤镜。我体验了一下windows颜色滤镜,确实有效果。

现在再重新查看图片,我也能识别出来是一头牛了。

但是windows的颜色滤镜有很多识别不了的图,例如:

自研程序辅助识别

自己动手写一套识别程序吧。每一张图片都是由n*m个点组成,每个点都有自己的rgb颜色,根据这些信息定义自己识别到的颜色。

public enum MyColorEnum {
    //基础三色:红绿蓝
    RED(new Color(255, 0, 0), BaseColorType.RED),
    GREEN(new Color(0, 255, 0), BaseColorType.GREEN),
    BLUE(new Color(0, 0, 255), BaseColorType.BLUE),
    //混合三色: 黄、紫、青
    YELLOW(new Color(255, 255, 0), BaseColorType.GREEN),
    PURPLE(new Color(255, 0, 255), BaseColorType.RED),
    CYAN(new Color(0, 255, 255), BaseColorType.GREEN),
    //变种六色:橙(黄红)、粉红(紫红)、紫蓝、青蓝、青绿、黄绿
    ORANGE(new Color(255, 140, 0), BaseColorType.RED),
    PINK(new Color(255, 0, 140), BaseColorType.RED),
    PURPLE_BLUE(new Color(140, 0, 255), BaseColorType.RED),
    CYAN_BLUE(new Color(0, 140, 255), BaseColorType.BLUE),
    CYAN_GREEN(new Color(0, 255, 140), BaseColorType.GREEN),
    YELLOW_GREEN(new Color(140, 255, 0), BaseColorType.GREEN),
    //灰色
    GREY(new Color(140, 140, 140), BaseColorType.NONE),
    ;
    private final Color color;
    private final BaseColorType type;
}

颜色识别算法:

private MyColorEnum getMyColorEnum(Color color) {
    int red = color.getRed();
    int green = color.getGreen();
    int blue = color.getBlue();
    List<Integer> ns = Stream.of(red, green, blue).sorted().collect(Collectors.toList());
    int maxN = ns.get(2);
    int midN = ns.get(1);
    int minN = ns.get(0);
    //1. 是否是灰色: 三色较为接近,最大差值小于10,灰色
    int d3 = maxN - minN;
    if (d3 < 10) {
        return MyColorEnum.GREY;
    }
    //2. 红绿蓝:最大色-第二大色>第二色-第三色
    int d1 = maxN - midN;
    int d2 = midN - minN;
    if (d1 * brightnessColorFactor.getBaseFactor(red, green, blue) > d2) {
        return maxN == red ? MyColorEnum.RED : maxN == green ? MyColorEnum.GREEN : MyColorEnum.BLUE;
    }
    //3. 黄青紫:黄色缺蓝,青色缺红,紫色缺绿;第二色-第三色 > 系数 * (第一色-第二色)
    if (d2 > brightnessColorFactor.getMixFactor(red, green, blue) * d1) {
        return minN == red ? MyColorEnum.CYAN : minN == green ? MyColorEnum.PURPLE : MyColorEnum.YELLOW;
    }
    //4. 青绿、黄绿、橙色、紫红、紫蓝、青蓝:取前两色,红色+绿色=橙色,绿色+红色=黄绿,红色+蓝色=紫红,蓝色+红色=紫蓝,蓝色+绿色=绿蓝,绿色+蓝色=青绿
    if (maxN == red) {
        return midN == green ? MyColorEnum.ORANGE : MyColorEnum.PINK;
    }
    if (maxN == green) {
        return midN == red ? MyColorEnum.YELLOW_GREEN : MyColorEnum.CYAN_GREEN;
    }
    return midN == red ? MyColorEnum.PURPLE_BLUE : MyColorEnum.CYAN_BLUE;
}

识别到的效果如下:

驾照体检时,如何通过逻辑推理识别图片

  1. 先识别图片的主题颜色,也就是背景色,图片中处于边缘地带颜色最多的就是背景色。
  2. 选择数字颜色,技巧:红色是主题色,黄绿色、绿色、青色、蓝色就是数字的颜色;绿色是主题色,红色、粉红、红褐色、紫色、橙色就是数字的颜色。
  3. 从左至右,找选定的数字颜色块,根据选定的颜色走向挨着识别,大胆猜测,排除法论证:例如:根据颜色线条,猜测一个数字是8,如果缺了左下角,就是9,缺了右上角是6,缺了中间是0,缺了左上右下就是2

例子1:

  • 上边、下边、左边、右边有很多的绿色,还有一些黑绿色(黑绿色虽然无法第一时间看出来),且没有红色,那这张图就是绿色主题。
  • 主题色是绿色,那数字的颜色就是红色、深红色、红褐色
  • 从左至右查找,找到第一个数字有点像8,猜测是8,再按照顺序每块颜色笔画验证,如下图:
  • 继续从左至右,找到第二个红色块,如下图。猜测可能得数字2、8、0。按照线条红色块挨个查找,不难笔画出来是2。
  • 继续从左至右,找到第三个数字的红色块,如下图。猜测数字0、8、2。按照线条红色块挨个查找出来是0。
  • 最终得到的结果就是 820

例子2:

  • 上边、下边、左边、右边都是红、橙色,且没有绿色,这张图就是红色主题。
  • 选定的数字颜色是:绿色、黄绿色、黄色
  • 从左至右,挨个查找。如下图所示:

所有色盲检测图片以及识别结果资源下载

https://download.csdn.net/download/m0_37681914/89013169?spm=1001.2014.3001.5503

图片识别自研程序源码下载

https://download.csdn.net/download/m0_37681914/89013185?spm=1001.2014.3001.5503

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号