Welcome

首页 / 软件开发 / C++ / OpenCV, color reduction method

OpenCV, color reduction method2015-05-15目标:

这次学习的目标是回答下面的几个问题:

1 图片像素是如何被扫描的?

2OpenCV 矩阵值如何被存储?

3如何衡量算法的性能?

4什么是查找表和为什么要用他们?

看完这篇,希望能够解决上面的这些问题。

正文:

首先我们考虑一下简单的色彩降低方法(color reduction method,翻译的不好请指正),如果使用的是c或c++无符号的char(八字节大小的空间),一个信道(channel)有256个不同的值(2^8=256),但是如果使用的是GRB方案,三个channel的话,颜色的数量就会变为256*256*256,大概是16个million这么多,这么多的颜色数量,对于计算机来说仍然是一个负担,所以可以想一些方法来降低这些色彩数量。

可以使用简单的方法来降低图像色彩空间,比如,将0-9的数字都统一用0来代替,10-19的数字都统一用10代替。这种转换方案可以用下面的公式表示

通过上面的公式,把所有像素点的值更新一下。但是,上面的公式中有除法,这里要表达一个是,计算量比较多的情况下,不用乘除,就不要用,最好把他们转换为加减。我们知道,在转换前像素点的值只有256个,所以我们可以用查找表的方式,我们事先把所有的计算结果都保存在一个数组里,每次要执行上面的公式计算的时候,结果直接从数组里取出来就ok了。比如32对应30,表table[32]=30是早计算出来的,直接访问table[32]就OK了。

图片矩阵如何在内存中存储的:

灰度图片的矩阵存储方式:

灰度图片的每一个像素点,只由一个值来表示,所以,就是一个普通的二维矩阵。

彩色图片的矩阵存储方式:

彩色图片的存储方式和灰度图片不一样,这里展示的是RGB格式的,可以看到,每一个像素,由三个值,代表蓝色,绿色,红色的三个数值表示,存储方式不是三维的,而是二维,不过列向量放大了三倍。从图片中可以清楚的看到。