博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Gamma校正及其OpenCV实现
阅读量:5116 次
发布时间:2019-06-13

本文共 1808 字,大约阅读时间需要 6 分钟。

參考:[1]

[2]

 

一、什么是Gamma校正?

Gamma校正是对输入图像灰度值进行的非线性操作,使输出图像灰度值与输入图像灰度值呈指数关系:

[2]

这个指数即为Gamma.

经过Gamma校正后的输入和输出图像灰度值关系如图1所看到的:横坐标是输入灰度值,纵坐标是输出灰度值,蓝色曲线是gamma值小于1时的输入输出关系,红色曲线是gamma值大于1时的输入输出关系。能够观察到,当gamma值小于1时(蓝色曲线),图像的总体亮度值得到提升,同一时候低灰度处的对照度得到添加,更利于分辩低灰度值时的图像细节。

                                                                                图1 Gamma校正.

 

二、为什么进行Gamma校正?

1. 人眼对外界光源的感光值与输入光强不是呈线性关系的,而是呈指数型关系的。在低照度下,人眼更easy分辨出亮度的变化,随着照度的添加,人眼不易分辨出亮度的变化。而摄像机感光与输入光强呈线性关系。如图2所看到的:

图2 人眼和摄像机的感光与实际输入光强的关系[1]。

为方便人眼辨识图像,须要将摄像机採集的图像进行gamma校正。

 

2. 为能更有效的保存图像亮度信息,需进行Gamma校正。

未经gamma校正和经过gamma校正保存图像信息如图3所看到的:

图3 未经gamma校正和经过gamma校正保存图像信息.

能够观察到,未经gamma校正的情况下,低灰度时,有较大范围的灰度值被保存成同一个值,造成信息丢失;同一时候高灰度值时,非常多比較接近的灰度值却被保存成不同的值,造成空间浪费。经过gamma校正后,改善了存储的有效性和效率。

 

三、利用OpenCV实现的Gamma校正

void MyGammaCorrection(Mat& src, Mat& dst, float fGamma){	CV_Assert(src.data);	// accept only char type matrices	CV_Assert(src.depth() != sizeof(uchar));	// build look up table	unsigned char lut[256];	for( int i = 0; i < 256; i++ )	{		lut[i] = saturate_cast
(pow((float)(i/255.0), fGamma) * 255.0f); } dst = src.clone(); const int channels = dst.channels(); switch(channels) { case 1: { MatIterator_
it, end; for( it = dst.begin
(), end = dst.end
(); it != end; it++ ) //*it = pow((float)(((*it))/255.0), fGamma) * 255.0; *it = lut[(*it)]; break; } case 3: { MatIterator_
it, end; for( it = dst.begin
(), end = dst.end
(); it != end; it++ ) { //(*it)[0] = pow((float)(((*it)[0])/255.0), fGamma) * 255.0; //(*it)[1] = pow((float)(((*it)[1])/255.0), fGamma) * 255.0; //(*it)[2] = pow((float)(((*it)[2])/255.0), fGamma) * 255.0; (*it)[0] = lut[((*it)[0])]; (*it)[1] = lut[((*it)[1])]; (*it)[2] = lut[((*it)[2])]; } break; } }}
 
 
 
 
 
 

转载于:https://www.cnblogs.com/mfrbuaa/p/4296506.html

你可能感兴趣的文章
同步代码时忽略maven项目 target目录
查看>>
MVC.NET:提供对字体文件.woff的访问
查看>>
Oracle中包的创建
查看>>
团队开发之个人博客八(4月27)
查看>>
发布功能完成
查看>>
【原】小程序常见问题整理
查看>>
C# ITextSharp pdf 自动打印
查看>>
【Java】synchronized与lock的区别
查看>>
django高级应用(分页功能)
查看>>
【转】Linux之printf命令
查看>>
关于PHP会话:session和cookie
查看>>
Chrome development tools学习笔记(3)
查看>>
软件过程的守护神
查看>>
NAT配置
查看>>
【翻译】Brewer's CAP Theorem CAP定理
查看>>
undefined与null
查看>>
redis总结
查看>>
解决SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的 STATEMENT 'OpenRowset/OpenDatasource' 的访问...
查看>>
STM32F10x_RTC秒中断
查看>>
[原创]网站HTML,XHTML,XML,WML,CSS等测试验证工具介绍
查看>>