opencv学习笔记-入门(24) gamma变换,矫正,压缩篇收藏

法一:

创建GAMMA查找表

void gammaLUT(double sigma)
{
double f;
for (int i = 0; i < 256; ++i)
{
f = (i+0.5)/256;
f = pow(f,sigma);
glut[i] = UINT8(f*256-0.5);
}
}

利用查找表进行矫正

void gammaCorrect(Mat& image)
{
assert(!image.empty());
gammaimg.create(image.size(),CV_64FC(image.channels()));


uchar *pd = image.ptr(0);
double *qd = gammaimg.ptr<double>(0);
for (int i = 0; i < image.rows * image.cols * image.channels(); i++)
{
*qd++ = (double)(glut[*pd++]);
}
}

法二:

直接构建查找表

// gamma compress LUT
static uchar* getGammaLUT()
{
static uchar gmLUT[256] = {0,1,1,2,2,2,2,3,3,3,3,3,3,4,4,4,4,4,4,4,4,5,
5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,7,7,7,7,
7,7,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
9,9,9,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,
11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,
12,12,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,
13,13,13,13,13,13,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,
14,14,14,14,14,14,14,14,14,14,14,14,15,15,15,15,15,15,15,15,15,15,
15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,16,16,
16,16,16,16,16,16,16,16,16,16,16,16,16};
return gmLUT;
}

利用查找表进行数据的处理

void gammaCompress(Mat& image)
{
static uchar *pglut = getGammaLUT();

uchar *pd = image.ptr(0);
for (int i = 0; i < image.rows * image.cols * image.channels(); i++)
{
pd[i] = pglut[pd[i]];
}

}

你可能感兴趣的:(image)