伽马校正,最好的,最高效的方法是通过table来访问:

核心函数LUT(The Core Function)

这是最被推荐的用于实现批量图像元素查找和更该操作图像方法。在图像处理中,对于一个给定的值,将其替换成其他的值是一个很常见的操作,OpenCV 提供里一个函数直接实现该操作,并不需要你自己扫描图像,就是:operationsOnArrays:LUT() <lut>


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);


好了该我上代码了:


    1. int
    2. {    
    3. "e:\\kankan\\fish.jpg", 0 );  
    4. IplImage* dst = cvCreateImage(cvGetSize(src), 8, 1);  
    5.    uchar table[256];  
    6.   
    7.     CreatTable_Gamma( table, 0.5 );  
    8.     LUT_Adj(src,dst,table);  
    9.   
    10.              }

    1. void CreatTable_Gamma(uchar table[], float
    2. {  
    3. float
    4. for(int
    5.     {  
    6. float)i/255.0f , nPercent)*255.0f;    
    7. if(val>255)    
    8.                 val=255;    
    9. if(val<0)  
    10.                 val=0;  
    11.         table[i]=(uchar)val;  
    12.     }  
    13. }


    创建table:



      1. void CreatTable_Gamma(uchar table[], float
      2. {  
      3. float
      4. for(int
      5.     {  
      6. float)i/255.0f , nPercent)*255.0f;    
      7.         table[i]=(uchar)val;  
      8.     }  
      9. }


      读table :

      1. void LUT_Adj(const
      2. {  
      3.     dptr[x] = table[sptr[x]];        
      4.   
      5.               
      6. }


      但是现在c++版的table 方法更高效的。我这个有点旧啦。。。

      附上效果图:

      gamma 变换 lut python opencv opencv gama校正_i++


      Refer from

      来自维基百科:伽马校正(Gamma correction) 又叫伽马非线性化(gamma nonlinearity)、伽马编码(gamma encoding) 或是就只单纯叫伽马(gamma)。是用来针对影片或是影像系统里对于光线的辉度(luminance)或是三色刺激值(tristimulus values)所进行非线性的运算或反运算。最简单的例子里伽马校正是由下列幂定律公式所定义的。

      γ < 1的情况有时被称作编码伽马值(encoding gamma),而执行这个编码运算所使用上述幂定律的过程也叫做伽马压缩(gamma compression);相对地,伽马值γ > 1的情况有时也被称作解码伽马值(decoding gamma),而执行这个解码运算所使用上述幂定律的过程也叫做“伽马展开(gamma expansion)”。



      转自:

      在计算机系统中,由于显卡或者显示器的原因会出现实际输出的图像在亮度上有偏差,而Gamma曲线矫正就是通过一定的方法来矫正图像的这种偏差的方法。一般情况下,当用于Gamma矫正的值大于1时,图像的高光部分被压缩而暗调部分被扩展,当Gamma矫正的值小于1时,图像的高光部分被扩展而暗调部分被压缩,Gamma矫正一般用于平滑的扩展暗调的细节。

      公式如下:

      I' = I^gamma:表示对图像I取指数值gamma,即I'(x,y)=I(x,y)^gamma。


      在matlab代码如下:

      gamma 变换 lut python opencv opencv gama校正_图像处理_02


      结果如下:

      gamma 变换 lut python opencv opencv gama校正_图像处理_03


      Gamma校正源自显示器的校正,一些论文中引用“研究表示,Gamma值取0.4或0.45是最接近人类视觉系统的”,这个待考究,Gamma校正能否提高识别结果,也需要看官自己尝试。