图像颜色处理(一)----由LCD屏幕显示像素格式引出的思考(调色板,CLUT)

先给自己打个广告,本人的微信公众号正式上线了,搜索:张笑生的地盘,主要关注嵌入式软件开发,股票基金定投,足球等等,希望大家多多关注,有问题可以直接留言给我,一定尽心尽力回答大家的问题
图像颜色处理(一)----由LCD屏幕显示像素格式引出的思考(调色板,CLUT)_第1张图片

一 what

(1)显示原理
我们知道,芯片控制LCD显示的时候,芯片会将需要显示的每个像素送给LCD,显然芯片内部是按照一个一个像素来处理的。
但是一个像素并不等于一个Byte,这又是为什么呢?一般一个像素由RGB三个元素组成,如果一个Byte表示一个像素,那么这个Byte分配给R、G、B分量的位数就更少了,这样表示的颜色范围就会非常少?因此我们需要两个或者更多的Byte表示一个像素,比如RGB565就需要2个Byte来表示一个像素,RGB888需要3个Byte表示一个像素,甚至有些RGB888需要4个Byte表示一个像素(这个像素中多了一个A分量,实际上是RGBA8888)
图像颜色处理(一)----由LCD屏幕显示像素格式引出的思考(调色板,CLUT)_第2张图片
(2)调色板
如下图所示,假设一款ARM SoC驱动控制一个LCD屏幕显示,此过程中是如何工作的呢?我们主要看两个步骤

1. LCD controller从frame buffer中取出数据。有人会问这个数据是怎么产生的呢?这个就要看不同使用情况了,下面举了两个例子
	(a) 比如我想在LCD上画线,我肯定知道画线需要的数据,准备好这个数据即可
	(b) 如果想要在LCD上显示图片,那肯定有图片格式,把这个图片数据存在某个地方即可
2. LCD controller将取到的数据送到LCD控制线上,传到LCD上即可

图像颜色处理(一)----由LCD屏幕显示像素格式引出的思考(调色板,CLUT)_第3张图片
显然上面是一个简单的使用场景,但是考虑一个的问题

假设我的LCD的分辨率是1280x720,格式是16bpp的,也就是RGB565,一个16bit的数据,高5位表示R,中间6位表示G,低5位表示B。那么在这个简单的例子中,我们需要多大的存储空间?
1280x720x16=14745600bit=1843200Byte=1800KB≈1.75MB,显然这个存储空间已经不小了

那么针对上面的问题,有没有什么减小存储空间大小的办法呢?
既然我们想要减小存储空间frame buffer的大小,但是这个frame buffer是对应LCD每个像素上的值,所以frame buffer的个数是无法减小的,它还是只能等于分辨率(1280x720)。
我们只能减小它的位数,之前frame buffer中每个数组项的内容是一个16bit的数据,我们可否使用8bit来表示呢?这样frame buffer的大小空间就减小了一半。但是如果用8bit来表示实际的RGB颜色的话,也无法表示RGB565中的三个分量,这时我们就引入了调色板palette,它是如何工作的呢?

1. LCD controller从frame buffer中取出数据,注意此时的数据不代表像素数据有效值,只代表像素值的索引。注意这里有两个数值,假设我们把frame buffer看成一个数组,那么数组下标代表是哪个像素,数组元素代表这个像素所需要的真正的颜色数据,即为像素值。
2. 根据像素值索引,到调色板中找像素值。
3. 将取出的像素值送到LCD控制线上,传给LCD。

图像颜色处理(一)----由LCD屏幕显示像素格式引出的思考(调色板,CLUT)_第4张图片
这时,我们再来看看占用的实际内存空间大小

1. frame buffer大小 = 1280x720x8 = 7372800bit = 921600Byte = 900KB
2. 调色板palette大小 = 256x16 = 4096bit = 512Byte
3. 总大小 = frame buffer大小 + 调色板palette大小 = 921600Byte + 512Byte
显然比第一种case中占用的内存大小小了差不多一半

当然因为调色板中的像素值是一个16bit,这是因为LCD的型号决定的。如果不考虑LCD的型号,我们也可以设置32bit,24bit。这样我们只需要修改调色板中的像素值即可,也就是说调色板占用的内存大小是可以变化的,framebuffer的大小只需要保证和分辨率大小一致就可以了。
(3)颜色对照表CLUT

你可能感兴趣的:(图像处理)