自动伽马校正(Auto Gamma Correction)算法
自动伽马校正(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)算法相关推荐
- 我理解的伽马校正(Gamma Correction)
[图形学]我理解的伽马校正(Gamma Correction) 2015年05月30日 18:22:52 妈妈说女孩子要自立自强 阅读数:69844 版权声明:本文为博主原创文章,未经博主允许不得转载 ...
- 【转】伽马校正(Gamma Correction)
在未得到原作者的同意下转载,特地在此贴出源地址以作声明:http://blog.163.com/hong.lg0518@126/blog/static/18907460200972711556304/ ...
- 伽马矫正(Gamma correction)
在学习HOG描述子时,对图像进行预处理中使用了伽马矫正这个方法,这里对伽马矫正进行简要的介绍. 伽马矫正也称幂律变换,一般用于平滑的扩展暗调的细节.进行伽马矫正的原因是因为人类的眼睛在感知光线时,眼睛 ...
- 色彩校正(CCM)和伽马校正(Gamma)
目录 1.色彩矫正(CCM) 2.伽马校正(Gamma) 1.色彩矫正(CCM) 色彩校正(Color Correction)是指用相同的方法改变图像中的所有像素的颜色值,以得到不同得 ...
- OpenCV论道:为什么我的伽马校正函数只有一行?
最近在用 OpenCV 识别棋盘棋子,基本的思路是这样的:先转灰度,再做高斯模糊和二值化,此时棋盘格上有的有棋子,有的无棋子:通过迭代腐蚀,消去棋子,再迭代膨胀回来,就得到了一个纯净的棋盘:识别棋盘, ...
- OpenGL学习脚印:伽马校正(Gamma Correction)
写在前面 由于CRT,LED等显示设备显示颜色时并非按照线性方式工作,因此我们在程序中输出的颜色,最终输出到显示器上时会产生亮度减弱的现象,这种现象在计算光照和实时渲染时对图形质量有一定影响,需要我们 ...
- OpenGL Gamma Correction伽马校正的实例
OpenGL Gamma Correction伽马校正 先上图,再解答. 完整主要的源代码 源代码剖析 先上图,再解答. 完整主要的源代码 #include <glad/glad.h> # ...
- Gamma Correction(伽马校正)
定义 Gamma correction, gamma nonlinearity, gamma encoding, or often simply gamma, is the name of a non ...
- 伽马校正(gamma correction)学习笔记
学习HDR和Bloom特效的过程中,接触到了伽马矫正的问题.查阅了不少资料,这一篇讲的最清楚,下面的图片也是来自该文章. 这应该说是一个历史遗留问题,以前的CRT显示器是使用电子显像管,通过控制电流大 ...
- 伽马校正笔记(Gamma Correction)
在数字图像系统中,伽马(Gamma)是一个重要的但很少被正确理解的特性.它定义了一个像素的数值和对应的实际亮度之间的关系. 人眼感知的亮度和相机"看到"的亮度区别 对于数码相机来说 ...
最新文章
- petaPar培训文档
- 伍哥原创之豆荚商城商品搜索架构介绍
- C语言 计算结构体大小
- BOM--window对象
- Skip-Thought Vector —— 跳跃思维句表示
- MooTool 1.0.0 发布,开发者常备桌面小工具
- shell命令locate
- 485通讯的校验和_RS485通讯如何实现三菱PLC对三菱变频器的控制?
- animate auto
- php怎么设置浏览器禁止打开新窗口,JS打开新窗口防止被浏览器阻止的方法_javascript技巧...
- 【51单片机】通过定时器中断 在8位数码管显示时间
- 图像彩色化方法(基于颜色传递、颜色扩展)
- 冬瓜哥祝大家新年快乐!
- 深入浅出matplotlib(1):为什么要使用matplotlib
- mac安装win10后触摸板没有右键功能键的添加技巧
- python最小二乘法_最小二乘法(least sqaure method)
- spring2.5.6升级到4.3.7常见问题
- 极验验证码破解之selenium
- 史上最全的用Python操控手机APP攻略!建议收藏!
- 【数学建模】“一口价”的战略(博弈模型)