伽马校正,最好的,最高效的方法是通过table来访问:
核心函数LUT(The Core Function)¶
这是最被推荐的用于实现批量图像元素查找和更该操作图像方法。在图像处理中,对于一个给定的值,将其替换成其他的值是一个很常见的操作,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; } }
创建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; table[i]=(uchar)val; } }
读table :
void LUT_Adj(const IplImage* src,IplImage* dst, uchar table[]) { dptr[x] = table[sptr[x]]; }
但是现在c++版的table 方法更高效的。我这个有点旧啦。。。
附上效果图: