法一:
创建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]];
}
}