首页 > 编程知识 正文

gamma系数计算方法(gamma校正特性曲线)

时间:2023-05-04 08:13:57 阅读:74458 作者:1930

1、伽马校正定义

伽马来源于显示器/电视(CRT )的响应曲线,即亮度和输入电压之间的非线性关系。

伽玛校正是编辑图像的伽玛曲线,对图像进行非线性灰度编辑的方法,通过检测图像信号中较浓的部分和较薄的部分,增大两者的比率,提高图像的对比度效果。

如果图像照度不均匀,可以通过伽马校正提高或降低整个图像的亮度。 实际上可以用两种不同的方式进行伽马标准化、平方根、对数法。

2、伽马校正原理

假设图像中有一个值为200的像素a,则需要执行以下步骤来校正此像素:

1 .归一化:将像素值转换为0到1之间的实数。 算法如下:(I0.5 )/256这里包括一个除法和一个加法操作。 对于像素a的情形,对应于该情形的归一化值为0.783至203。

2 .使用事先补偿)式,求出将像素正规化后的数据的1/伽马作为指数的对应值。 这个步骤包括求指数的运算。 假设伽马值为2. 2,则1/伽马值为0. 454545,并且作为对标准化了的a值进行预补偿的结果,1/伽马值为0. 783203 ^0. 454545=0. 894872。

3 .逆正规化:将预补偿的实数值逆转换为0 ~ 255的整数值。 具体算法为: f*256 - 0. 5该步骤包括乘法和减法。 跟在前面的例子之后,将a的预补偿结果0. 894872代入上面的公式,其中,a的预补偿后的对应像素值为228,最后被发送给显示器的数据。

如上所述,直接用数学公式编程时,假设图像分辨率为800*600,为了对其进行伽马校正,需要执行48万个浮点数的乘法运算、除法运算、指数运算。 效率太低,完全得不到实时效果。

针对这种情况,提出了一种高速算法,如果能够知道图像像素所取的值的范围,例如0 ~ 255间的整数,则图像中的任意一个像素值只能是0 ~ 255的256个整数中的任意一个; 在已知伽马值的情况下,0到255之间的任何整数在经过“归一化、预补偿、逆归一化”操作后,对应的结果是唯一的,并且在0到255的范围内。

如前例所示,如果已知伽马值为2. 2并且像素a的原始值为200,则需要与伽马校正后的a对应的预补偿值为228。 根据上述原理,对0 ~ 255的每个整数进行事前校正操作,只需将对应的事前校正值保存在预先制作的伽马校正查找表LUT:Look Up Table中,就可以使用该表对任意像素值为0 ~ 255的图像进行伽马校正

3、参考代码

# include math.htypedefunsignedcharunit 8; 0到255之间的整数UNIT8 g_GammaLUT[256]; //全局数组:包含256个要素的伽马校正查找表//Buildtable ) )函数,针对0-255,由//归一化、预补偿、逆归一化; //将结果保存在伽马查找表中。 //表达式到fprecompensation=1/gammavoidbuildtable (floatfprecompensation ) { int i; 浮动f; for(I=0; i256; I () f=) I0.5f )/256; //归一化f=(浮动) pow(f,fPrecompensation ); g_gammalut[I]=(unit8) (f*256-0.5F ); //反向规范化} } voidgammacorrectiom (unit8src [ ],int iWidth,int iHeight,float fGamma,UNIT8 Dst[] ) { int iCols,iRows; bildtable(1/f伽马); //伽马校正查找表初始化//图像的每个像素的查找表校正for(irows=0; iRowsiHeight; irows(for ) icols=0; iColsiWidth; icols } { irows * iwidthicols }=g _ gammal ut [ src [ irows * iwidthicols ]; }}参考: https://www.cn blogs.com/Qiqi baby/p/5325193.html

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。