自动伽马校正(Auto Gamma Correction)算法

微信公众号:幼儿园的学霸

目录

文章目录

  • 自动伽马校正(Auto Gamma Correction)算法
  • 目录
  • 理论
  • 代码实现
  • 参考资料

理论

在对图像进行处理过程中,查找到一篇对图像进行自动gamma校正的论文,论文名称及链接见参考文献1.

文章的核心描述如下:

Average of brightness is simple element that can be computed in the least amount of time. Basic approach in this article present a technique to estimate appropriate gamma based on average brightness. …, We suppose a gamma which changes average of brightness to 1/2, …

其大概意思是:假定一副合理的图像其所有像素(归一化后)的均值应该在0.5左右,那么自动伽马校正的伽马值就要使得目标图像向这个目标前进。
假设X是图像的平均值,那么自动伽马校正所需要的伽马值应该基于下列公式进行计算:

根据论文描述:

This paper proposes a method which estimates a power that transport average amount of brightness to center of histogram.

即通过自动gamma校正后图像的灰度直方图将向中心进行偏移。

代码实现

按照上述公式,可以很快实现该算法。代码如下。
1.在实现过程中,采用了查找表的思想,以加快图像处理速度。
2.针对多通道图像,对各通道的gamma再次进行求均值,作为gamma校正的gamma值,以避免多通道图像的偏色现象。该修改在原论中并不存在。

//
// Created by liheng on 11/22/20.
//#include <iostream>
#include <chrono>
#include <opencv2/opencv.hpp>//自动Gamma校正算法
//Input Param:src--输入图像,3 channels or 1channels
//Output Param:dst--归一化后的图像,type as src
//Return:   null
void AutoGammaCorrection(const cv::Mat &src, cv::Mat &dst)
{const int channels = src.channels();const int type = src.type();assert( type==CV_8UC1 || type==CV_8UC3 );//======计算gamma值========//auto mean = cv::mean(src);//求均值mean[0] = std::log10(0.5) / std::log10(mean[0]/255);//gamma = -0.3/log10(X)if( 3==channels ){mean[1] = std::log10(0.5) / std::log10(mean[1]/255);//gamma = -0.3/log10(X)mean[2] = std::log10(0.5) / std::log10(mean[2]/255);//gamma = -0.3/log10(X)//多通道图像,对求得的gamm再次平均,避免偏色现象auto mean3 = (mean[0]+mean[1]+mean[2])/3;mean[0]=mean[1]=mean[2] = mean3;}//=======计算gamma查找表,减少计算量=======////查找表,数组的下标对应图片里面的灰度值//lut(0,10)=(50,60,70)表示通道1灰度值为10的像素其对应的值为50;// 通道2灰度值为10的像素其对应的值为60;// 通道3灰度值为10的像素其对应的值为70cv::Mat lut(1,256,src.type());if( 1==channels ){for(int i=0; i<256;++i)//灰度等级[0,255]{//将灰度值归一化0-1之间float Y = i*1.0f/255;// or Y=i*0.00392;//求该灰度值gamma校正后的值Y = std::pow(Y,mean[0]);lut.at<unsigned char>(0,i) = cv::saturate_cast<unsigned char>(Y*255);}}else if(3==channels){for(int i=0; i<256;++i)//灰度等级[0,255]{//将灰度值归一化0-1之间float Y = i*1.0f/255;// or Y=i*0.00392;//求该灰度值gamma校正后的值auto B = cv::saturate_cast<unsigned char>(std::pow(Y,mean[0])*255);auto G = cv::saturate_cast<unsigned char>(std::pow(Y,mean[1])*255);auto R = cv::saturate_cast<unsigned char>(std::pow(Y,mean[2])*255);lut.at<cv::Vec3b>(0,i) = cv::Vec3b(B,G,R);}}//=========利用查找表进行校正==========//cv::LUT(src,lut,dst);
}int main()
{std::string image_path = "../autogamma.png";cv::Mat src = cv::imread(image_path,cv::IMREAD_COLOR);cv::imshow("src",src);cv::Mat dst1,dst2;AutoGammaCorrection(src,dst1);src.convertTo(src,CV_32FC3,1.0/255);cv::pow(src,0.7,dst2);cv::normalize(dst2,dst2,0,255,cv::NORM_MINMAX);cv::convertScaleAbs(dst2,dst2);cv::imshow("dst1",dst1);cv::imshow("dst2",dst2);cv::waitKey(0);
}

效果如下:

类别 图像 直方图
原图
自动gamma校正
手动gamma校正

可以看到,
1.自动gamma校正通过自动计算gamma值来调整图像,比手工设定gamma值要明显方便很多。
2.经过自动gamma校正后的图像,其直方图的中心相对原图向中心进行了平移。

参考资料

1.自动伽马校正原英文论文 Automatic gamma correction based on average of
brightness


下面的是我的公众号二维码图片,按需关注。

自动伽马校正(Auto Gamma Correction)算法相关推荐

  1. 我理解的伽马校正(Gamma Correction)

    [图形学]我理解的伽马校正(Gamma Correction) 2015年05月30日 18:22:52 妈妈说女孩子要自立自强 阅读数:69844 版权声明:本文为博主原创文章,未经博主允许不得转载 ...

  2. 【转】伽马校正(Gamma Correction)

    在未得到原作者的同意下转载,特地在此贴出源地址以作声明:http://blog.163.com/hong.lg0518@126/blog/static/18907460200972711556304/ ...

  3. 伽马矫正(Gamma correction)

    在学习HOG描述子时,对图像进行预处理中使用了伽马矫正这个方法,这里对伽马矫正进行简要的介绍. 伽马矫正也称幂律变换,一般用于平滑的扩展暗调的细节.进行伽马矫正的原因是因为人类的眼睛在感知光线时,眼睛 ...

  4. 色彩校正(CCM)和伽马校正(Gamma)

    目录 1.色彩矫正(CCM) 2.伽马校正(Gamma) 1.色彩矫正(CCM)         色彩校正(Color Correction)是指用相同的方法改变图像中的所有像素的颜色值,以得到不同得 ...

  5. OpenCV论道:为什么我的伽马校正函数只有一行?

    最近在用 OpenCV 识别棋盘棋子,基本的思路是这样的:先转灰度,再做高斯模糊和二值化,此时棋盘格上有的有棋子,有的无棋子:通过迭代腐蚀,消去棋子,再迭代膨胀回来,就得到了一个纯净的棋盘:识别棋盘, ...

  6. OpenGL学习脚印:伽马校正(Gamma Correction)

    写在前面 由于CRT,LED等显示设备显示颜色时并非按照线性方式工作,因此我们在程序中输出的颜色,最终输出到显示器上时会产生亮度减弱的现象,这种现象在计算光照和实时渲染时对图形质量有一定影响,需要我们 ...

  7. OpenGL Gamma Correction伽马校正的实例

    OpenGL Gamma Correction伽马校正 先上图,再解答. 完整主要的源代码 源代码剖析 先上图,再解答. 完整主要的源代码 #include <glad/glad.h> # ...

  8. Gamma Correction(伽马校正)

    定义 Gamma correction, gamma nonlinearity, gamma encoding, or often simply gamma, is the name of a non ...

  9. 伽马校正(gamma correction)学习笔记

    学习HDR和Bloom特效的过程中,接触到了伽马矫正的问题.查阅了不少资料,这一篇讲的最清楚,下面的图片也是来自该文章. 这应该说是一个历史遗留问题,以前的CRT显示器是使用电子显像管,通过控制电流大 ...

  10. 伽马校正笔记(Gamma Correction)

    在数字图像系统中,伽马(Gamma)是一个重要的但很少被正确理解的特性.它定义了一个像素的数值和对应的实际亮度之间的关系. 人眼感知的亮度和相机"看到"的亮度区别 对于数码相机来说 ...

最新文章

  1. petaPar培训文档
  2. 伍哥原创之豆荚商城商品搜索架构介绍
  3. C语言 计算结构体大小
  4. BOM--window对象
  5. Skip-Thought Vector —— 跳跃思维句表示
  6. MooTool 1.0.0 发布,开发者常备桌面小工具
  7. shell命令locate
  8. 485通讯的校验和_RS485通讯如何实现三菱PLC对三菱变频器的控制?
  9. animate auto
  10. php怎么设置浏览器禁止打开新窗口,JS打开新窗口防止被浏览器阻止的方法_javascript技巧...
  11. 【51单片机】通过定时器中断 在8位数码管显示时间
  12. 图像彩色化方法(基于颜色传递、颜色扩展)
  13. 冬瓜哥祝大家新年快乐!
  14. 深入浅出matplotlib(1):为什么要使用matplotlib
  15. mac安装win10后触摸板没有右键功能键的添加技巧
  16. python最小二乘法_最小二乘法(least sqaure method)
  17. spring2.5.6升级到4.3.7常见问题
  18. 极验验证码破解之selenium
  19. 史上最全的用Python操控手机APP攻略!建议收藏!
  20. 【数学建模】“一口价”的战略(博弈模型)

热门文章

  1. 【gp数据库】查询GP中某张表的分布键信息
  2. 字节测试开发面试题总结
  3. 随机森林算法原理梳理
  4. win10家庭版添加“本地安全策略”
  5. 后缀树(一)定义及构造
  6. PetaLinux 添加启动后自动执行脚本
  7. Ai斗地主智能出牌算法
  8. win10 jFrameDesigner安装
  9. FPGA_电机控制(Verilog)
  10. 小程序服务器新消息通知,如何在手机上实时接收微信小程序客服消息提醒?