伽马校正,最好的,最高效的方法是通过查找表Table来访问。
核心函数LUT(Look UP Table):
这是最被推荐的用于实现批量图像元素查找和更该操作图像方法。在图像处理中,对于一个给定的值,将其替换成其他的值是一个很常见的操作,OpenCV 提供里一个函数直接实现该操作,并不需要你自己扫描图像,就是:operationsOnArrays:LUT() <lut> ,一个包含于core module的函数. 首先我们建立一个mat型用于查表:
Mat lookUpTable(1, 256, CV_8U);
uchar* p = lookUpTable.data;
for( int i = 0; i < 256; ++i)
p[i] = table[i];
然后我们调用函数 (I 是输入 J 是输出):
LUT(I, lookUpTable, J);
int main()
{
IplImage* src = cvLoadImage("e:\\kankan\\fish.jpg", 0 );
IplImage* dst = cvCreateImage(cvGetSize(src), 8, 1);
uchar table[256];
CreatTable_Gamma( table, 0.5 );
LUT_Adj(src,dst,table);
}
void CreatTable_Gamma(uchar table[], float nPercent )
{
float val;
for(int i=0;i<256;i++)
{
val= pow( (float)i/255.0f , nPercent)*255.0f;
if(val>255)
val=255;
if(val<0)
val=0;
table[i]=(uchar)val;
}
}
或
void CreatTable_Gamma(uchar table[], float nPercent )
{
float val;
for(int i=0;i<256;i++)
{
val= pow( (float)i/255.0f , nPercent)*255.0f;
table[i]=(uchar)val;
}
}
void LUT_Adj(const IplImage* src,IplImage* dst, uchar table[])
{
dptr[x] = table[sptr[x]];
}