色彩的复现:计算机图像处理与数值计算
2021-03-24于方军于倩倩
于方军 于倩倩
随着技术的进化,人们发现通过RGB三原色混合可以得到各种颜色。而彩色显示器就是利用这一点显示彩色图片的。对于计算机来说,构成彩色图像的像素点颜色信息是由R(红色)、G(绿色)、B(蓝色)三基色的值构成,不同的RGB值可以混合出各种颜色,我们可以用一个四脚共阴极的三色LED灯,通过控制这三个值,模拟显示不同颜色。对于图像处理的操作,如模糊处理、色度处理、对比度调节等就是对这组数据进行复杂的数学运算。本文利用开源库OpenCV,通过卷积运算来实现图像处理,让学生看到图像处理操作背后的数值计算才是图像处理的本质。
现代的显示屏对色彩的还原度已经达到了以假乱真的程度,而显示器从单色到彩色的过程并不是一个简单的过程。本实验过程首先读取某点的像素值,即获取该点的RGB值,并通过开源硬件Arduino控制四脚共阴极的三色LED灯,并用像素点的RGB值控制对应的LED引脚,在另一种类型的计算机上复现该颜色,已实现对RGB显示色彩这一概念的深刻理解。
读取图片的像素值
如上页图1所示为用Jupyter Notebook打开源程序,分步执行后,读取一张标准的RGB混色示意图片并显示,接下来用img.shape显示彩色图片的长、宽、通道数,用img显示组成图片的各个点的像素值。
图1所示的图像,是一个80行、80列的像素点的组合,每个像素点由三个颜色信息构成。对于彩色图像来说,每一个像素点的值由RGB三个通道值构成,每个通道值用0~255中间值代表不同强度,这些不同强度的RGB值可以组合出各种颜色,通过研究控制图片的像素值来控制显示颜色,可以帮助学生深入理解计算机中彩色图片的构成和显示原理。
2.改变像素值观察区域图像颜色变化
用px=img[20,40]读取图片中纵坐标都为20、横坐标为40的像素点的像素值,该点为蓝色所以读取值为[0 0 254]。可以通过改变该点的像素值,觀察颜色的变化,如改为[255 0 0],则该点变为红色;也可以通过img[30:40,20:30]=[0,0,255]改变某个区域的像素值为蓝色,用同样的方法,可以在图中添加绿色块和红色块(如图2)。
接下来,可以改变颜色块的像素值为其他值,看看色块颜色应该怎样变化,如果把三个值都设置为255,得到的是白色,都设置为0得到的就是黑色;如果设置为相同的三个中间值如[100 100 100],就会得到一个灰度块,同时改变这个值可以得到亮度不同的灰度块。了解了图像矩阵色彩信息的原理之后,便可以在Arduino平台上复现图片上任意一点的色彩信息。
3.对像素点颜色的模拟显示
Pinpong库是一套控制开源硬件主控板的Python库,通过在Python程序中加载PinPong库即可连接硬件,通过Arduino板D8、D7、D6控制红绿蓝三色全彩LED灯三个对应引脚,把读取的某点像素值通过pw0.write_analog()赋值给这些引脚,实现模拟显示该点颜色的功能。
(1)读取像素点的值
用px=img[40,30]获得纵坐标40,横坐标30的像素点色值为[255 4 253],该点呈现粉色。这三个值对应列表px中的px[0]、px[1]、px[2],接下来要用这三个值控制共阴极的RGB三色LED的三个对应脚。幸运的是,色彩的RGB显示范围和Arduino中的模拟引脚的输入范围相当,这省去了换算的麻烦,可以直接使用px当中的分量数值(如下页图3、图4)。
(2)模拟显示读取像素点颜色
把读取计算机图片上某个点的色彩数值用pinpong库中的pw0.write_analog(pw[0])加载到Arduino的对应脚上,以显示计算机色彩在单片机上的还原,运行程序得到的实验装置上显示粉色的效果如图5所示。
这样,用Arduino复现彩色图片中像素点的色彩信息,就完成了彩色显示器中从0到1的突破。显示器可以看作许多极小的彩色LED点的组合,通过这种简单的代码级别的对像素点的操作,点动成线,线动成面,利用这样的原理,是否会有更加丰富的显示效果,留给大家者进一步思考。而技术突破背后的数学知识、计算思维和实践智慧,则是信息科技学科的育人价值所在。