目标:
这次学习的目标是回答下面的几个问题:
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格式的,可以看到,每一个像素,由三个值,代表蓝色,绿色,红色的三个数值表示,存储方式不是三维的,而是二维,不过列向量放大了三倍。从图片中可以清楚的看到。
返回栏目页:http://www.bianceng.cn/Programming/cplus/
效率:
比较像素数量降低方式效率的代码,在本文的最后面,代码看上去很多,其实结构比较简单,看一会儿就明白了。附上一张结果图:
最快的OpenCV内的LUT函数。关于LUT,看这里
可以粗略的看一下代码,代码不难,很容易懂:
#include
#include
#include
#include
using namespace std;
using namespace cv;
static void help()
{
//这里提示输入有三个参数,第一个是图像的名字,第二个是参数是公式中的降低颜色数的数字,这里是10,第三个参数,如果是[G]代表是灰度图片,否则不是。
cout
> divideWith;
if (!s || !divideWith)
{
cout it, end;
for( it = I.begin(), end = I.end(); it != end; ++it)
{
(*it)[0] = table[(*it)[0]];
(*it)[1] = table[(*it)[1]];
(*it)[2] = table[(*it)[2]];
}
}
}
return I;
}
Mat& ScanImageAndReduceRandomAccess(Mat& I, const uchar* const table)
{
// accept only char type matrices
CV_Assert(I.depth() != sizeof(uchar));
const int channels = I.channels();
switch(channels)
{
case 1:
{
for( int i = 0; i _I = I;
for( int i = 0; i
作者:csdn博客 钟桓