前天我收到了一个快递,迫不及待的拆开,是我的 全志F113 芯片开发板,它长这样:
拿到开发板后,我开始着手搭建开发环境,下载编译器,内核源码和各种资料,折腾了半天,还没整明白,赶紧休息一下。
有时候我也会想,这些玩意为什么非要整的这么复杂,直接一个小巧可爱的编辑器,通过简短的命令行,或者IDE直接交叉编译不好吗?
又或者启动的流程,就好像裸机程序那样简单,同时又能很方便的调用各种外设不好吗?为什么要一个跳一个的入口,把调用链弄得如此复杂,并在这个过程中形成一个又一个的黑盒?
这当然是有原因的,就好像我们看到一个颜色值的时候,也可能一脸懵逼一样。
【BC2364】这是个什么颜色?看了一下,思索了一下,我大概知道他应该是个红色,如果颜色的顺序是RGB的话。
【798412】这又是什么颜色?分析了半天,红绿为黄,他应该是一种不那么纯净的黄色吧?
【RGB(160, 100, 40)】这又是什么颜色呢?抱歉,我一时间还真算不出来,于是我只能把数值输入到调色盘里,发现这是大便色,此刻我的心情仿佛闻到了大便。
RGB 颜色就是这么让人恶心,一眼望去,你很难形容这是个什么颜色,必须在大脑里,把三种颜色混合一下,然后模拟出一个结果,有时候也模拟不出结果,毕竟大脑对RGB颜色的计算是出于某种本能,而非拥有一套完整的理论。
就好像我上面提到的开发板一样,之所以你无法用它像VB或易语言一样简单的开发出程序来,因为他并不属于你正在使用的一套成熟的体系。
既然一个颜色是由三个范围相等的数字组成,那我们很容易把它具象化,就是一个三维的正方体呀,如上图。
人类的眼睛虽然是基于RGB三原色的,但人的大脑不是,人的大脑对颜色的识别更加感性。
屎黄色、亮黄色、橘黄色,他们都属于黄色,只不过黄的不太一样,对于我们来说,亮黄色可能会显得更干净一些。
白色、黑色、灰色,他们都属于中性色,但无论如何,这三种颜色的亮度肯定是不一样的。
不是吗?当一个颜色出现在你大脑里的时候,你考虑的从来都不是RGB,而是关于这个颜色的另外三个属性:
它是个什么色:红色、橙色、黄色、绿色、青色、蓝色、紫色……
这个颜色是干净还是混浊:黄色也分明黄屎黄牛黄……
这个颜色亮不亮:越能照亮四周的颜色,亮度就越高,黑色代表没有亮度,白色代表完全亮了……
科学不会困住人类,但理解能力会。
人类只能在可以理解的范围内思考,电脑便是这样一个产物,电脑的颜色,是基于人眼可以识别的三原色做的,而图像,则是基于大脑对颜色的直接设计的。
为什么人能够识别一幅图像的边界?秘密显然不会藏在RGB里面,所以当你试图用RGB去获取一张复杂图片的轮廓时,总是很难成功。
因为秘密藏在你的大脑里,这也就是为什么,我把前置标题取名为【大道至简】,当你能够从细微中区分出实物的差距时,知识对你而言,就只是量的区别,不再有质存在,反之,你可能吸收了不同质量的知识,这些知识混杂在一起,无法演化为你的道,因而读过再多的书,知识也始终有限。
爱因斯坦说过:如果你不能用简单的话把它描述出来,说明你没有真正的理解它。
事物的本质,大抵是如此的。
废话不再说,RGB是基于人眼光学的颜色模型,那有没有基于人脑的颜色模型呢?有的,HSV是也!
刚才我们总结到,大脑对颜色的识别,是基于一个已经存在的颜色值 + 这个颜色的纯净度 + 这个颜色亮不亮 来实现的。
我们可以把颜色想象成一个圆形的调色盘,红黄绿青蓝紫都在这个调色盘里,这样当我们看到这个颜色位于调色盘的位置时,立刻就能知道他是个什么颜色了,因此颜色是一个角度数值。
红色在调色盘的0度上,绿色是120度,蓝色是240度,转一圈又回到了红色,是360度,这是三原色。黄色在60度,青色在180度,品红在300度,这是三间色。
然后呢,我们把同一个颜色,分割成不同纯净度的颜色,这样圆盘就被分割成了一个又一个的格子,同一个角度的颜色,越靠近外面的颜色就越纯净,因此纯净度应该是一个百分比数值。
最后,我们再设置一个Y轴,不同的亮度在Y轴上体现为越靠近下方,就越暗淡,这个亮度同样是一个百分比数值,现在颜色模型建立好了,它是一个圆锥形:
而关于HSV三个数据维度的术语,Hue为颜色的色调,Saturation为饱和度,Value为亮度(Lightness,HSL模型里的亮度,两个模型差不多,理解了一个就能理解另一个)
一个很有趣的思考,为什么脚本无法封堵?我们能不能使用一种手段让脚本无法识别我们的图像、颜色呢?
答案是不可能的,因为软件也好,游戏也好,它都是要给人用的,给人用的东西,它的界面图像怎么可能不符合人眼和人脑的处理逻辑,难道它是给外星人用的?
想明白这一点,你就能想明白,为什么理解颜色如此重要,不能机械的只会找图或者找色,偶尔一些难题,当你明白了颜色之后,解决起来也就不那么难了,比如拼图验证码。
无非就是个明暗的识别问题,so easy!
小技巧:
判断颜色是否在红色范围内的时候,因为红色有 360 和 0 度两个范围,有时候很头疼,得多判断一次。
解决起来很简单其实,如果颜色小于180,则颜色 + 360,再去判断范围就行了(因为颜色是个圈,角度转一圈回去了还是那个位置)