5.9 识别颜色和光亮度

人类眼睛对事物的形状、位置、颜色等视觉反应,这些反应必须借助于外接光的辅助,以及大脑对眼睛所能获取的信息和经验进行综合分析。 光、事物、 眼睛和大脑是产生视觉反应的四要素。本节内容中不考虑事物的形状、位置,只考虑颜色。准确地说,我们需要了解人是如何区分颜色, 然后我们才能让机器像人一样地识别颜色。

5.9.1 颜色和光

在一个阳光明媚的海滩上,你看到某人穿着红色的衣服,这是因为他穿的衣服吸收了阳光中大多数成分,将大量红色成分反射到你的眼睛里, 加上你大脑对衣服颜色的综合结果。夜间光线较暗时,当你又遇到此人时,他仍穿着同一件衣服,或许你认为他的衣服颜色是黑色的, 这是因为很少光线能够反射到你的眼睛里。

在科学的范畴里,光代表整个电磁波谱。我们通常所说的光,仅仅指的是可见光,可见光的波长范围380~760nm。 我们看不见电视遥控器发出的红外光线,红外光不在可见光范围。波长,我们常用于区分光谱(电磁波谱)中不同光成分的单位。 仅基于中学物理的基础,我们就能够明白:任何事物都具有对光谱成分有选择性地吸收、透射和反射特性。借助于这一特性, 人类设计出特定用途的滤光片、反光片等光学装置。

总之,人眼对事物颜色的视觉反应取决于环境光,以及事物对光谱成分有选择性地吸收、透射和反射特性。 模拟人眼的机器视觉传感器都遵循这一科学原理。当我们需要了解一种特定的视觉传感器时,首先要了解其最敏感的波长范围。 使用视觉传感器时需要根据自己的特定目的为传感器配置滤光片等光学装置来优化设计。

BlueFi的集成光学传感器具有可见光敏感组件,可以用来识别颜色。由于颜色和环境光照的光线强度具有强相关性, BlueFi的集成光学传感器也能测量环境光亮度。BlueFi的集成光学传感器能够给出4个通道的可见光数据: R、G、B和C,前三个通道的数据分别是三基色分量,C则是光亮度分量。

5.9.2 颜色识别

我们首先需要了解BlueFi的集成光学传感器输出的4通道数据。为此目的,我们使用多行文本的形式将4通道数据分别显示在BlueFi的LCD屏幕上, 便于观察输出数据和颜色直接关系。示例代码如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import time
from hiibot_bluefi.basedio import Button, PWMLED
from hiibot_bluefi.sensors import Sensors
from hiibot_bluefi.screen import Screen
screen = Screen()
sensors = Sensors()
rgbc = sensors.color
button = Button()
led = PWMLED()
led.white = 0
ledon = False

def ledControl():
    global ledon
    button.Update()
    if button.B_wasPressed:
        if not ledon:
            led.white=20000
            ledon = True
        else:
            led.white=0
            ledon = False

show_data = screen.simple_text_display(title="BlueFi Color sensor", title_scale=1, text_scale=2)
while True:
    ledControl()
    rgbc = sensors.color
    show_data[2].text = "R: {}".format(rgbc[0])
    show_data[2].color = screen.RED
    show_data[3].text = "G: {}".format(rgbc[1])
    show_data[3].color = screen.GREEN
    show_data[4].text = "B: {}".format(rgbc[2])
    show_data[4].color = screen.BLUE
    show_data[5].text = "C: {}".format(rgbc[3])
    show_data[5].color = screen.WHITE
    show_data.show()
    time.sleep(0.1)

将本示例程序保存到BlueFi的/CIRCUITPY/code.py文件中,当BlueFi执行程序期间,你可以使用B按钮开关白光灯(亮度固定为最大亮度的1/3), 开启白光灯的目的是避免被识别的事物会遮挡住环境光线造成被反射到传感器的光量过小, 你可以根据自己的环境光情况确定是否开启白光灯作为传感器的辅助光源。

你可以准备几张彩色卡纸放在光学传感器上,观察其返回的4个通道的数值,是否与卡纸的颜色相符呢?

通过实际的测试,相信你已经发现:即使人眼看起来纯单色的纸片,传感器的4个通道值并不能明显给出单色的结论。事实上, 纯单色的事物几乎不存在,根据颜色、光、纸片反射特性等因素之间关系,传感器给出的4个通道值与人眼、 大脑所综合分析出来的颜色之间存在较大差别是正常的,但是仍存在明显的相关性。

从试验所记录的数据中分析颜色与4个通道数值之间的相关性,我们可以确定一个较为合理的颜色识别算法。