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

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

參考:[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; } }}
 
 
 
 
 
 

转载地址:http://tqzwa.baihongyu.com/

你可能感兴趣的文章
【android】使用handler更新UI
查看>>
mochiweb 源码阅读(十五)
查看>>
前端面试中的常见的算法问题
查看>>
计算机语言的基本理论
查看>>
nodejs流之行读取器例子
查看>>
批量文件重命名工具
查看>>
简单说一下UWP中的JumpList
查看>>
unity将object[]或者string对象转换成枚举enum
查看>>
PostgreSQL 10.1 手册_部分 II. SQL 语言_第 9 章 函数和操作符_9.19. 范围函数和操作符...
查看>>
以太坊系列之六: p2p模块--以太坊源码学习
查看>>
使用scikit-learn解决文本多分类问题(附python演练)
查看>>
2018 年最值得关注的 JavaScript 趋势
查看>>
什么是区块链?超级账本 Brian Behlendorf 从五个方面教你认识
查看>>
Linux中的帮助功能
查看>>
针对Android的Pegasus恶意软件版本和针对iOS的有什么不同?
查看>>
全局探色器
查看>>
Hive Export和Import介绍及操作示例
查看>>
http://mongoexplorer.com/ 一个不错的 mongodb 客户端工具。。。
查看>>
Xcode 4.3 使用xcodebuild命令编译项目环境设置
查看>>
上传jar包到nexus私服
查看>>