Gamma校正及其OpenCV实现

参考:[1]http://www.cambridgeincolour.com/tutorials/gamma-correction.htm

[2]http://en.wikipedia.org/wiki/Gamma_correction

一、什么是Gamma校正?

Gamma校正是对输入图像灰度值进行的非线性操作,使输出图像灰度值与输入图像灰度值呈指数关系:

[2]

这个指数即为Gamma.

经过Gamma校正后的输入和输出图像灰度值关系如图1所示:横坐标是输入灰度值,纵坐标是输出灰度值,蓝色曲线是gamma值小于1时的输入输出关系,红色曲线是gamma值大于1时的输入输出关系。可以观察到,当gamma值小于1时(蓝色曲线),图像的整体亮度值得到提升,同时低灰度处的对比度得到增加,更利于分辩低灰度值时的图像细节。

                                                                                图1 Gamma校正.

二、为什么进行Gamma校正?

1. 人眼对外界光源的感光值与输入光强不是呈线性关系的,而是呈指数型关系的。在低照度下,人眼更容易分辨出亮度的变化,随着照度的增加,人眼不易分辨出亮度的变化。而摄像机感光与输入光强呈线性关系。如图2所示:

图2 人眼和摄像机的感光与实际输入光强的关系[1]。

为方便人眼辨识图像,需要将摄像机采集的图像进行gamma校正。

2. 为能更有效的保存图像亮度信息,需进行Gamma校正。

未经gamma校正和经过gamma校正保存图像信息如图3所示:

图3 未经gamma校正和经过gamma校正保存图像信息.

可以观察到,未经gamma校正的情况下,低灰度时,有较大范围的灰度值被保存成同一个值,造成信息丢失;同时高灰度值时,很多比较接近的灰度值却被保存成不同的值,造成空间浪费。经过gamma校正后,改善了存储的有效性和效率。

三、利用OpenCV实现的Gamma校正


  
  
  1. void MyGammaCorrection(Mat& src, Mat& dst, float fGamma)
  2. {
  3. CV_Assert(src.data);
  4. // accept only char type matrices
  5. CV_Assert(src.depth() != sizeof(uchar));
  6. // build look up table
  7. unsigned char lut[ 256];
  8. for( int i = 0; i < 256; i++ )
  9. {
  10. lut[i] = saturate_cast<uchar>( pow(( float)(i/ 255.0), fGamma) * 255.0f);
  11. }
  12. dst = src.clone();
  13. const int channels = dst.channels();
  14. switch(channels)
  15. {
  16. case 1:
  17. {
  18. MatIterator_<uchar> it, end;
  19. for( it = dst.begin<uchar>(), end = dst.end<uchar>(); it != end; it++ )
  20. //*it = pow((float)(((*it))/255.0), fGamma) * 255.0;
  21. *it = lut[(*it)];
  22. break;
  23. }
  24. case 3:
  25. {
  26. MatIterator_<Vec3b> it, end;
  27. for( it = dst.begin<Vec3b>(), end = dst.end<Vec3b>(); it != end; it++ )
  28. {
  29. //(*it)[0] = pow((float)(((*it)[0])/255.0), fGamma) * 255.0;
  30. //(*it)[1] = pow((float)(((*it)[1])/255.0), fGamma) * 255.0;
  31. //(*it)[2] = pow((float)(((*it)[2])/255.0), fGamma) * 255.0;
  32. (*it)[ 0] = lut[((*it)[ 0])];
  33. (*it)[ 1] = lut[((*it)[ 1])];
  34. (*it)[ 2] = lut[((*it)[ 2])];
  35. }
  36. break;
  37. }
  38. }
  39. }

  
  
 
 
 
 
 
 
 
 
 

猜你喜欢

转载自blog.csdn.net/guo1988kui/article/details/85065602
今日推荐