当前位置:   article > 正文

C++数字图像处理(1)-伽马变换_c++伽马变换

c++伽马变换

1、算法原理

    伽马变换(幂律变换)是常用的灰度变换,是一种简单的图像增强算法。数学公式如下:

(1)

    式(1)中,r为输入的灰度值,取值范围为[0, 1]。C称为灰度缩放系数,用于整体拉伸图像灰度,通常取值为1。gamma取值灰度输入输出曲线图如下:

图(1) gamma曲线图

    从图(1)可知:当gamma>1.0时,伽马变换将拉低图像灰度值,图像视觉上变暗;当gamm<1.0时,伽马变换将提高图像的灰度值,图像视觉上变亮。

2、算法定义

    输入:8位灰度图像。

    输出:8位灰度图像。

    参数:gamma值、C值。

3、算法实现

(1)、公式实现

  1. //函数名:gammaTransformation
  2. //作用:实现灰度变换中的伽马变换
  3. //参数:
  4. //matInput:输入图像
  5. //matOutput : 输出图像
  6. //fGamma : 伽马值
  7. //fC : C值(缩放系数)
  8. //返回值:无
  9. //注:支持单通道8位灰度图像
  10. void gammaTransformation(cv::Mat& matInput, cv::Mat& matOutput, float fGamma, float fC /*= 1.0f*/)
  11. {
  12. assert(matInput.elemSize() == 1);
  13. //构造输出图像
  14. matOutput = cv::Mat::zeros(matInput.rows, matInput.cols, matInput.type());
  15. //循环中尽量避免除法
  16. float fNormalFactor = 1.0f / 255.0f;
  17. for (size_t r = 0; r < matInput.rows; r++)
  18. {
  19. unsigned char* pInput = matInput.data + r * matInput.step[0];
  20. unsigned char* pOutput = matOutput.data + r * matOutput.step[0];
  21. for (size_t c = 0; c < matInput.cols; c++)
  22. {
  23. //gamma变换
  24. float fOutput = std::pow(pInput[c] * fNormalFactor, fGamma) * fC;
  25. //数值溢出判断
  26. fOutput = fOutput > 1.0f ? 1.0f : fOutput;
  27. //输出
  28. pOutput[c] = static_cast<unsigned char>(fOutput * 255.0f);
  29. }
  30. }
  31. }

(2)、查表加速

    几乎所有的灰度变换算法中,都可以使用查表方法进行加速。在【公式实现】中,循环中调用了库函数pow、并进行了一次if判断。这些操作,可以在循环外提提前计算好,循环中查表即可。在嵌入式系统中,查表法使用较多。优化后的代码如下:

  1. void gammaTransformation(cv::Mat& matInput, cv::Mat& matOutput, float fGamma, float fC /*= 1.0f*/)
  2. {
  3. assert(matInput.elemSize() == 1);
  4. //构造输出图像
  5. matOutput = cv::Mat::zeros(matInput.rows, matInput.cols, matInput.type());
  6. //循环中尽量避免除法
  7. float fNormalFactor = 1.0f / 255.0f;
  8. //构造查询表
  9. std::vector<unsigned char> lookUp(256);
  10. for (size_t m = 0; m < lookUp.size(); m++)
  11. {
  12. //gamma变换
  13. float fOutput = std::pow(m * fNormalFactor, fGamma) * fC;
  14. //数值溢出判断
  15. fOutput = fOutput > 1.0f ? 1.0f : fOutput;
  16. //输出
  17. lookUp[m] = static_cast<unsigned char>(fOutput * 255.0f);
  18. }
  19. for (size_t r = 0; r < matInput.rows; r++)
  20. {
  21. unsigned char* pInput = matInput.data + r * matInput.step[0];
  22. unsigned char* pOutput = matOutput.data + r * matOutput.step[0];
  23. for (size_t c = 0; c < matInput.cols; c++)
  24. {
  25. //查表gamma变换
  26. pOutput[c] = lookUp[pInput[c]];
  27. }
  28. }
  29. }

 

(3)、测试结果

 

技术交流合作QQ:3355138068

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/78952
推荐阅读
相关标签
  

闽ICP备14008679号