一、什么是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;

}

}

}

java opencv gamma_Gamma校正及其OpenCV实现相关推荐

  1. OpenCV畸变校正原理以及损失有效像素原理分析

    常用的张正友标定法的流程,其中获取了摄像机的内参矩阵K,和畸变系数D. 1.在普通相机cv模型中,畸变系数主要有下面几个:(k1; k2; p1; p2[; k3[; k4; k5; k6]] ,其中 ...

  2. OpenCV透视校正perspective correction的实例(附完整代码)

    OpenCV透视校正perspective correction的实例 OpenCV透视校正perspective correction的实例 OpenCV透视校正perspective correc ...

  3. opencv java ubuntu_Ubuntu 16.04配置OpenCV 3.1.0 for Java

    我们都知道,OpenCV是基于C++的开源计算机视觉库,但是从2.4.4版本开始提供了Java绑定,也就是说,我们也可以使用Java来开发基于OpenCV的计算机视觉应用.目前,最新的版本是3.1.0 ...

  4. Java在eclipse中调用opencv时报错:java.lang.UnsatisfiedLinkError的解决方法

    昨天把Java+opencv的环境配置好后,迫不及待的进行测试...... 出师不利.... 第一个代码就有错误,代码如下: import org.opencv.core.*; import org. ...

  5. 【OpenCV 例程 300篇】237. 基于主成分提取的方向校正(OpenCV)

    『youcans 的 OpenCV 例程200篇 - 总目录』 [youcans 的 OpenCV 例程 300篇]237. 基于主成分提取的方向校正(OpenCV) 主成分分析(Principal ...

  6. java通过模板匹配html,OpenCV模板匹配

    目标 在本教程中,您将学习如何:使用OpenCV功能matchTemplate()来搜索图像补丁和输入图像之间的匹配 使用OpenCV函数minMaxLoc()来查找给定数组中的最大值和最小值(以及它 ...

  7. OpenCV android sdk配置OpenCV android NDK开发实例

    OpenCV android sdk配置OpenCV android NDK开发实例 [尊重原创,转载请注明出处]http://blog.csdn.net/guyuealian/article/det ...

  8. 我为什么要学习openCV,什么是openCV

    OpenCV:Open Source Computer Vision Library  开源计算机视觉库 个人学习openCV两个原因:1.看好计算机视觉技术未来广阔市场前景:2.为产品做升级引入新技 ...

  9. openCV学习系列1:我为什么要学习openCV,什么是openCV

    OpenCV:Open Source Computer Vision Library  开源计算机视觉库 个人学习openCV两个原因:1.看好计算机视觉技术未来广阔市场前景:2.为产品做升级引入新技 ...

最新文章

  1. ASP.NET MVC以ValueProvider为核心的值提供系统: DictionaryValueProvider
  2. 分布式K/V存储方案
  3. 安装.Net的痛苦经历!
  4. docker安装Zabbix
  5. .net mvc web api上传图片/文件并重命名
  6. Newtonsoft.Json Deserialize Type 或者 同类型 变量 反序列化
  7. HBase优化案例分析:Facebook Messages系统问题与解决方案
  8. 关于提高社交网站SNS竞争力的分析
  9. mysql第二条减第一条_Mysql SQL优化
  10. 十六、oracle 索引
  11. spring security3.x学习(3)_初探过滤器机制和auto-config用法
  12. 微信小程序开发之——模板
  13. C语言编写 小企鹅表情包
  14. 链接计算机网络密码错误,手机连不上路由器显示密码错误怎么办?
  15. react初步学习(三)
  16. 如何给PDF文件添加页眉页脚,一分钟轻松搞定
  17. 计算机直接切换到桌面,屏幕如何快速切换桌面
  18. 使用webpack打包TS时遇到的问题
  19. 如何使用MD5加密解密工具?
  20. 阿里云(三) Ubuntu系统下mysql卸载

热门文章

  1. 从今天起开始做一个真正的BLOGER
  2. 关于如何选择Bloger托管商
  3. Linux虚拟机获取不到ip地址的解决办法
  4. AR技术,让生活变得更加智能与多彩
  5. 计算机科学与技术专业免学费,这3所不参与国内排名的大学,免学费、包分配,考上就是铁饭碗...
  6. 转载----编写高质量代码:改善Java程序的151个建议(第1章:JAVA开发中通用的方法和准则___建议1~5)...
  7. continue语句的作用
  8. Android手机天气预报项目报告
  9. 手写实现timeline时间线组件
  10. 【跃迁之路】【639天】程序员高效学习方法论探索系列(实验阶段396-2018.11.12)...