前端开发入门到精通的在线学习网站

网站首页 > 资源文章 正文

OpenCV对数字图像进行伽马校正(opencv 图像校正)

qiguaw 2024-09-26 16:38:47 资源文章 16 ℃ 0 评论

伽马校正也称为伽马变换,或幂次变换。伽马校正主要用于图像的校正,将漂白的图像或者是过黑的图像进行修正。伽马校正也常用于显示屏的校正,这是一个非常常用的变换,其所用的公式如下所示:

上式中C是常数,s是输入像素值,t是变换之后像素值,γ是幂次变换的指数值。若数字图像的值归一化到[0,1],则其输出的值也在[0,1]范围内。对于不同的伽马值,其对应的变换曲线如下图所示:

从上图可以看到,γ<1时,对低亮度部分进行拉伸,对高亮度部分进行压缩;γ>1时,对高亮度部分进行拉伸,对低亮度部分进行压缩。所以需要显示图像暗处的细节时,可以采用γ值小于1的伽马变换;如果需要图像明亮处的细节时,可以采用γ值大于1的伽马变换。

伽马校正的意义:

1) 方便人眼辨识图像

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

2) 更有效地保存图像亮度信息

未经伽马校正和经过伽马校正保存图像信息如下图所示:

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

伽马校正函数可以用OpenCV代码描述如下,这里采用查找法计算变换后的值,可以大幅度减少计算量:

自定义gamma校正函数

void MyGammaCorrection(const Mat& src, Mat& dst, float fGamma)
{
  CV_Assert(src.data);
  //只处理位深度为8位的图像
  CV_Assert(src.depth() != sizeof(uchar));
  //创建查找表
  unsigned char lut[256];
  for (int i = 0; i < 256; i++){
     lut[i] = saturate_cast<uchar>(pow((float)(i / 255.0),
       fGamma) * 255.0f);
  }
  dst = src.clone();
  const int channels = dst.channels();
  switch (channels){
    case 1: //单通道灰度图像
      MatIterator_<uchar> it; //使用迭代器来访问像素值
      for (it = dst.begin<uchar>(); it != dst.end<uchar>(); it++)
           *it = lut[(*it)];
      break;
    case 3: //3通道彩色图像
      MatIterator_<Vec3b> it; //使用迭代器来访问像素值
      for (it = dst.begin<Vec3b>(); it !=dst.end<Vec3b>();it++){
          (*it)[0] = lut[((*it)[0])];
         (*it)[1] = lut[((*it)[1])];
         (*it)[2] = lut[((*it)[2])];
      }
      break;
    }
}

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表