这难道不是一头鹿嘛?
先看看一张经典老图吧:这难道不是一头鹿嘛?
但是正常人看到的是一头牛,为什么会有这样的差别呢?
不知道大家是否有和我一样的困扰,能看清辨别日常生活中的红橙黄绿蓝青紫,但是体检色盲检测图就是看不清或者看到的和别人看到的不一样,高中体检、大学体检、驾照体检,成绩和技术都过关了,就因为色盲检查卡关,心里可太难受了。
因为咱们色弱视觉上对颜色类型不那么敏感,反而对颜色暗亮敏感。上面这张图的鹿头是偏亮的红色、身体和前腿是偏亮的蓝色绿色、后腿是偏亮的红色,所以我们会觉得他是一头鹿,但却是不同颜色组成。
借助工具识别色盲检测图
一次驾照体检,我为了解决色盲检测这个老大难的问题,一开始想的办法就是:把所有的图都背下来,背了小半天实在记不住,就放弃了。
我又在网上搜到了有一些工具可以辅助,例如:色弱眼睛、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;
}
识别到的效果如下:
驾照体检时,如何通过逻辑推理识别图片
- 先识别图片的主题颜色,也就是背景色,图片中处于边缘地带颜色最多的就是背景色。
- 选择数字颜色,技巧:红色是主题色,黄绿色、绿色、青色、蓝色就是数字的颜色;绿色是主题色,红色、粉红、红褐色、紫色、橙色就是数字的颜色。
- 从左至右,找选定的数字颜色块,根据选定的颜色走向挨着识别,大胆猜测,排除法论证:例如:根据颜色线条,猜测一个数字是8,如果缺了左下角,就是9,缺了右上角是6,缺了中间是0,缺了左上右下就是2
例子1:
- 上边、下边、左边、右边有很多的绿色,还有一些黑绿色(黑绿色虽然无法第一时间看出来),且没有红色,那这张图就是绿色主题。
- 主题色是绿色,那数字的颜色就是红色、深红色、红褐色
- 从左至右查找,找到第一个数字有点像8,猜测是8,再按照顺序每块颜色笔画验证,如下图:
- 继续从左至右,找到第二个红色块,如下图。猜测可能得数字2、8、0。按照线条红色块挨个查找,不难笔画出来是2。
- 继续从左至右,找到第三个数字的红色块,如下图。猜测数字0、8、2。按照线条红色块挨个查找出来是0。
- 最终得到的结果就是 820
例子2:
- 上边、下边、左边、右边都是红、橙色,且没有绿色,这张图就是红色主题。
- 选定的数字颜色是:绿色、黄绿色、黄色
- 从左至右,挨个查找。如下图所示:
所有色盲检测图片以及识别结果资源下载
https://download.youkuaiyun.com/download/m0_37681914/89013169?spm=1001.2014.3001.5503
图片识别自研程序源码下载
https://download.youkuaiyun.com/download/m0_37681914/89013185?spm=1001.2014.3001.5503