将8位颜色扩展为24位颜色

时间:2012-10-12 15:41:52

标签: algorithm colors arduino

设置

我有几百个Sparkfun LED像素(类似于https://www.sparkfun.com/products/11020)连接到Arduino Uno,并希望使用Arduino的内置串行USB连接来控制PC上的像素。 / p>

像素可单独使用,每个像素有24位颜色(RGB)。由于我希望能够非常快速地改变每个像素的颜色,因此从PC到Arduino的数据传输必须非常高效(从Arduino到像素的数据的进一步传输已经非常快)。

问题

我尝试直接将所需的RGB值直接发送到Arduino,但是当我想要同时打开所有LED时,这会导致可见的延迟。我最大限度地减少数据量的想法是将可用颜色从24位减少到8位,这对我的应用来说已经足够了。

如果我这样做,我必须将8位值从PC扩展到Arduino上的24位值,以设置像素上的实际颜色。这里显而易见的解决方案是一个调色板,它包含所有可用的8位值和相应的24位颜色。我想有一个没有调色板的解决方案,主要是出于内存空间的原因。

问题

将8位颜色扩展为24位颜色的有效方法是什么,最好是准确保留颜色信息的颜色?是否有此任务的标准算法?

可能的解决方案

我正在考虑一种格式,每个R和B为2位,G为3位。这些值将打包成一个字节,然后传输到Arduino,然后使用位移来解压缩并使用map()函数(http://arduino.cc/en/Reference/Map)。

对该解决方案的任何想法?什么是更好的方法呢?

4 个答案:

答案 0 :(得分:1)

R2B2G3会给你很少的颜色(实际上还剩下一点)。我不知道你的申请是否足够。您可以使用dithering technique使8位图像看起来更好一些。

或者,如果您有任何一组首选颜色,则可以在设备上存储已知的调色板,而不是通过电线发送。您还可以为不同的情况存储多个调色板,并指定使用小整数索引的调色板。

最重要的是,可以实现一些简单的压缩算法,如RLELZW,并在接收后解压缩。

还有一些非常快速的压缩库,占用空间小,可以使用:SnappyminiLZO

答案 1 :(得分:1)

关于你的问题“什么是更好的方法呢?”,首先要做的事情之一(如果还没有完成)是提高串行数据速率。 Arduino Forum建议使用115200 bps作为标准费率,并尝试230400 bps。按照这些速率,您需要编写接收软件,以便快速将数据从相对较小的接收缓冲区传输到更大的缓冲区,而不是尝试从小接收缓冲区中处理数据。

第二种可能性是将激活时间放入数据包中。假设F1,F2,F3 ......是您将在LED阵列上显示的一系列帧。提前从PC发送这些帧,或在空闲或等待时间,并让Arduino缓冲它们直到它们被安排出现。当激活时间到达给定帧时,让Arduino将其打开。如果事先知道帧而不是激活时间,请发送并缓冲帧并在适当的时间发送激活码。

第三,您可以拥有多个可随时更改的调色板和动态调色板,并且可以使用像素地址或像素列表以及像素贴图。也就是说,您可能会在不同时间使用不同的协议。协议3可以下载整个调色板,4可以改变调色板的元素,5可以发送24位值v,时间t,计数n,以及在时间t设置为v的n个像素的列表, 6可能会发送像素设置的位图,依此类推。位图可以是指示开或关的简单的每像素1位映射,或者可以是每像素k位映射,其中k位条目可以指定调色板编号或像素的帧编号。这有点模糊,因为有很多可能性;但简而言之,定义适用于您正在显示的任何内容的协议。

第四,考虑到ATmega328P的小型(2KB)RAM但更大(32KB)的闪存,考虑将多个调色板,帧和宏硬编码到程序中。通过宏,我的意思是生成图形元素的例程,如弧形,直线,开放或填充矩形。预先知道的任何显示元素都是闪存而不是RAM存储的候选。

答案 2 :(得分:0)

你的(2,3,2)位想法是“在野外”使用的。尝试它应该非常简单。质量会很低,但要试一试,看看它是否符合您的需求。

如果查找表随时间保持不变,那么与256色查找表相比,任何其他解决方案似乎都不可能节省大量内存。我认为任何成功都必须利用你发送到像素的图像中的模式。

答案 3 :(得分:0)

你看它的任何方式,你真正想要的是图像压缩。因此,我建议您查看PNG和JPG压缩等内容,看看它们是否足够快,适合您的应用程序。

如果没有,那么你可以考虑自己动手。到目前为止,你可以使用每像素压缩;在规模方面,你的(2,3,2)想法与你期望得到的一样好。您可以尝试使用四叉树型格式:取4像素块的平均值,传输差异的压缩(有损)表示,然后将相同的操作应用于平均值的半分辨率图像...

正如其他人指出的那样,抖动会使你的图像在(2,3,2)看起来更好。对于您的应用来说,最简单的抖动方法可能是为每个像素的每种颜色选择不同的(随机或准随机)固定量化阈值偏移。 PC和Arduino都有这个阈值表的副本;阈值的分布可以防止分色,Arduino端表有助于保持准确性。