EmguCV 颜色空间缩减

图像处理过程中经常会针对图像的颜色进行计算,一个使用byte类型的数组存储的3通道图像,其可以表示的颜色一共有16,777,216种,要对这么多种颜色进行计算,其消耗是非常大的,所以通常会将颜色空间进行缩减。
可以定义:
0~9范围的像素值为0;
10~19范围的像素值为10;
20~29范围的像素值为20;
这样0~255的值就可以用26个数值进行表示了,在对颜色空间进行计算的时候,计算量将大大减少。
示例代码:

int divideWith = 10;
byte[] table = new byte[256];
for (int i = 0; i < 256; i++)
{
    table[i] = (byte)(divideWith * (i / divideWith));
}
Mat mat = (Mat)this.imageBox1.Image;

_Stopwatch.Reset();
int rows = mat.Rows;
int cols = mat.Cols;
byte[,,] data = mat.ToImage<Bgr, byte>().Data;
byte[,,] resData = new byte[rows, cols, 3];

//此处使用并行计算
Parallel.For(0, rows, i =>
{
    for (int j = 0; j < cols; j++)
    {
        resData[i, j, 0] = table[data[i, j, 0]];
        resData[i, j, 1] = table[data[i, j, 1]];
        resData[i, j, 2] = table[data[i, j, 2]];
    }
});
Image<Bgr, byte> resImg = new Image<Bgr, byte>(resData);

计算机在计算乘法和除法时特别耗时,所以应该尽量将乘除法运算转变成加减法和赋值运算,所以上述代码中定义了一个byte型的数组table,用于存放原像素和缩减后像素的对应关系,这样比较耗时的乘除法运算只需要计算一次,以后使用时直接做赋值操作就可以了。

Opencv还提供了一个LUT函数,可以直接实现颜色空间的缩减。

CvInvoke.LUT(mat, matTable, resMat2);

CvInvoke.LUT参数说明:
第一个参数:输入图像
第二个参数:颜色缩减对应的关系表(即原像素缩减后对应的像素值)
第三个参数:输出图像

完整代码下载:http://download.csdn.net/download/xingao0114/10141151
运行结果截图
原图
效果图

猜你喜欢

转载自blog.csdn.net/xingao0114/article/details/78689597