gamma值对图像的影响图像gamma校正

gamma校正原理:

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

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的图像进行伽马校正

Gamma校正实现:

# include iostream # include opencv2\ core\core.HPP # include opencv2\ highgui\highgui.HPP # include opencv2\ img pencv forintI=0; i 256; I ) ) floatf=I0.5f )/255; f=浮动) ) powf,kFactor ); lut [ I ]=saturate _ cast uchar f * 255.0 f-0.5f ); }Mat resultImage=srcImage.clone ; ifsrcimage.channels==1) mat iterator _ uchar iterator=result image.begin uchar ); mat iterator _ uchariteratorend=result image.end uchar ; for ; 迭代器!=迭代器结束; 迭代器* iterator=lut ) )迭代器); } else { mat iterator _ ve c3b iterator=result image.begin ve c3b ; mat iterator _ ve C3 biteratorend=result image.endv ec3b ; for ; 迭代器!=迭代器结束; iterator ) iterator ) [0]=lut ) ) iterator ) [0] ); //b 迭代器[1]=lut ) ) )迭代器) [1] ); //g 迭代器) 2)=lut ) ) 迭代器) ) ); //r } }返回结果图像; }int main ) matsrcimage=im read ‘ lake water.jpg ); if ! src image.data 打印could not loadimage…\ n ); 返回- 1;//取两种不同伽马值float gamma1=3.33f; 浮动gamma2=0.33 f; floatkfactor1=1/伽马1; floatkfactor2=1/伽马2; mat result1=gamma transform src image,kFactor1); mat result2=gamma transform src image,kFactor2); imshowsrcImage )、srcimage ); imshowres1 )、result1); imshowres2 )、result2); 维基0; 返回0; }

原图:

伽马=3.33的效果图:

伽马=0.33的效果图:

极速赛车稳赚4码Image=srcImage.clone ; ifsrcimage.channels==1) mat iterator _ uchar iterator=result image.begin uchar ); mat iterator _ uchariteratorend=result image.end uchar ; for ; 迭代器!=迭代器结束; 迭代器* iterator=lut ) )迭代器); } else { mat iterator _ ve c3b iterator=result image.begin ve c3b ; mat iterator _ ve C3 biteratorend=result image.endv ec3b ; for ; 迭代器!=迭代器结束; iterator ) iterator ) [0]=lut ) ) iterator ) [0] ); //b 迭代器[1]=lut ) ) )迭代器) [1] ); //g 迭代器) 2)=lut ) ) 迭代器) ) ); //r } }返回结果图像; }int main ) matsrcimage=im read ‘ lake water.jpg ); if ! src image.data 打印could not loadimage…\ n ); 返回- 1;//取两种不同伽马值float gamma1=3.33f; 浮动gamma2=0.33 f; floatkfactor1=1/伽马1; floatkfactor2=1/伽马2; mat result1=gamma transform src image,kFactor1); mat result2=gamma transform src image,kFactor2); imshowsrcImage )、srcimage ); imshowres1 )、result1); imshowres2 )、result2); 维基0; 返回0; }

原图:

伽马=3.33的效果图:

伽马=0.33的效果图:

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注