Gamma 矫正用于平衡光照不均匀


伽马校正Gamma correction) 又叫伽马非线性化gamma nonlinearity)、伽马编码gamma encoding) 或是就只单纯叫伽马(gamma)。是用来针对影片或是影像系统里对于光线的辉度(luminance)或是三色刺激值(tristimulus values)所进行非线性的运算或反运算。

维基百科

1、公式

其中A是一个常量,输入和输出的值都为非负实数值。一般地来说在A=1的通常情况下,输入输出的值的范围都是在0到1之间。伽马值γ < 1的情况有时被称作编码伽马值(encoding gamma),而执行这个编码运算所使用上述幂定律的过程也叫做伽马压缩(gamma compression);相对地,伽马值γ > 1的情况有时也被称作解码伽马值(decoding gamma),而执行这个解码运算所使用上述幂定律的过程也叫做“伽马展开(gamma expansion)”。

2、解释

为图像进行伽马编码的目的是用来对人类视觉的特性进行补偿,从而根据人类对光线或者黑白的感知,最大化地利用表示黑白的数据位或带宽。在通常的照明(既不是漆黑一片,也不是令人目眩的明亮)的情况下,人类的视觉大体有伽马或者是幂函数的性质。如果不将图像进行伽马编码,那么数据位或者带宽的利用就会分布不均匀——会有过多的数据位或者带宽用来表示人类根本无法察觉到的差异,而用于表示人类非常敏感的视觉感知范围的数据位或者带宽又会不足。图像的伽马编码并不是必须的(甚至有的时候会适得其反),浮点数格式的颜色值已经提供了一部分对数曲线的线性估计。γ校正(Gamma Correction,伽玛校正):所 谓伽玛校正就是对图像的伽玛曲线进行编辑,以对图像进行非线性色调编辑的方法,检出图像信号中的深色部分和浅色部分,并使两者比例增大,从而提高图像对比 度效果。

3、详解

1、什么是Gamma曲线矫正?

Gamma曲线矫正是什么意思?Gamma曲线是一种特殊的色调曲线,当Gamma值等于1的时候,曲线为与坐标轴成45°的直线,这个时候表示输入和输出密度相同。高于1的Gamma值将会造成输出亮化,低于1的Gamma值将会造成输出暗化。总之,我们的要求是输入和输出比率尽可能地接近于1。在显示器、扫描仪、打印机等输入、输出设备中这是一个相当常见并且比较重要的概念。在计算机系统中,由于显卡或者显示器的原因会出现实际输出的图像在亮度上有偏差,而Gamma曲线矫正就是通过一定的方法来矫正图像的这种偏差的方法。一般情况下,当用于Gamma矫正的值大于1时,图像的高光部分被压缩而暗调部分被扩展,当Gamma矫正的值小于1时,图像的高光部分被扩展而暗调部分被压缩,Gamma矫正一般用于平滑的扩展暗调的细节。

2、Gamma 矫正代码
 1 #include <opencv2/core/core.hpp>
 2 #include <opencv2/imgproc/imgproc.hpp>
 3 #include <opencv2/imgproc/types_c.h>
 4 #include <opencv2/highgui/highgui.hpp>
 5 #include <opencv2/highgui/highgui_c.h>
 6 #include <opencv2/highgui.hpp>
 7 #include <opencv2/calib3d.hpp>
 8 #include <iostream>
 9 ?
10 using namespace cv;
11 using namespace std;
12 ?
13 void GammaCorrection(Mat& src, Mat& dst, float fGamma)
14 {
15     unsigned char lut[256];
16     for (int i = 0; i < 256; i++)
17     {
18         lut[i] = saturate_cast<uchar>(pow((float)(i / 255.0), fGamma) * 255.0f);
19     }
20 ?
21     dst = src.clone();
22     const int channels = dst.channels();
23     switch (channels)
24     {
25         case 1:
26         {
27 ?
28             MatIterator_<uchar> it, end;
29             for (it = dst.begin<uchar>(), end = dst.end<uchar>(); it != end; it++)
30                 * it = lut[(*it)];
31 ?
32             break;
33         }
34         case 3:
35         {
36 ?
37             MatIterator_<Vec3b> it, end;
38             for (it = dst.begin<Vec3b>(), end = dst.end<Vec3b>(); it != end; it++)
39             {
40                 (*it)[0] = lut[((*it)[0])];
41                 (*it)[1] = lut[((*it)[1])];
42                 (*it)[2] = lut[((*it)[2])];
43             }
44 ?
45             break;
46 ?
47         }
48         default:
49             break;
50     }
51 }
52 ?
53 int main()
54 {
55     Mat image = imread("D://Images/wrong/2.jpg");
56     if (image.empty())
57     {
58         cout << "Error: Could not load image" << endl;
59         return 0;
60     }
61     Mat dst;
62     float fGamma = 1 / 1.8;
63     GammaCorrection(image, dst, fGamma);
64     imwrite("D://Images/wrong/24.jpg", dst);
65     waitKey();
66 ?
67     return 0;
68 }
 

 1 package org.jaiken.tools;
 2 ?
 3 import org.opencv.core.Core;
 4 import org.opencv.core.CvType;
 5 import org.opencv.core.Mat;
 6 import org.opencv.imgcodecs.Imgcodecs;
 7 ?
 8 public class GammaCorrection {
 9     // 伽马校正
10     public Mat gamma(Mat src) {
11         Mat x = new Mat();
12         src.convertTo(x, CvType.CV_32FC3);
13         Mat i = new Mat();
14
15         Core.pow(x, 1/1.8, i);
16         Mat dst = new Mat();
17         // 归一化
18         Core.normalize(i, dst, 0, 255, Core.NORM_MINMAX, 0);
19         Imgcodecs.imwrite("D://Images/wrong/22.jpg", dst);
20         return dst;
21     }
22 ?
23     public static void main(String[] args) {
24         System.load("D://Export/opencv_java320.dll");
25         Mat src = Imgcodecs.imread("D://Images/wrong/2.jpg",0);
26         if (src.empty()) {
27             System.err.println("The picture doesn‘t exist");
28             return;
29         }
30         GammaCorrection gammaCorrection = new GammaCorrection();
31         gammaCorrection.gamma(src);
32     }
33 ?
34 }
?

效果图


这样还仅能看出图像亮度上的变化,体会不到细节上的变化,这样用阈值化和Blob 分析的方法检测下两张图像,结果图如下。

结果很明显的第四列,第五行的图像细节上更加清楚,处理结果更加的的好,而没有了图像上"线"的干扰。

原文地址:https://www.cnblogs.com/Jaiken/p/10943312.html

时间: 2024-11-06 03:10:16

Gamma 矫正用于平衡光照不均匀的相关文章

Gamma矫正与Unity 线性工作流

Gamma是什么东西? Gamma 中文伽马,其实由来已久.本质上是一个色彩的变换曲线,比如输入颜色值是横坐标X,变换完的颜色就是纵坐标Y 咦 这样很奇怪,为什么颜色要经过这样的Gamma 变换呢? 正常RGB(0.5,0.5,0.5) 显示在显示上就RGB(0.5,0.5,0.5)就好了. 干嘛还要做Gamma变换,或者统一说gamma矫正? gamma矫正的由来,有好几个传送.龚敏敏 一篇<Gamma传说>文章里面说的,大概意思我也用别人的文章说明. 在很久很久以前(其实没多久),全世界都

Unity 5:光照系统

原文链接 Unity在一些有理想的游戏开发者当中变得越来越流行.这应该归功于Unity对多平台(像手机.台式机以及主机环境等)的直接支持.此外,对于低收入开发者和工作室来说,它还可以免费使用. Unity支持多种技术及组件,其中一些关键组件就是光照和照明技术.在Unity中,你可以通过模拟灯光的复杂行为或者使用一个简单的光照模型来照亮一个场景. 这篇教程将会着重解释Unity 5中光照系统的工作原理,光照类型和特性,以及如何使用它们来创造丰富的光照效果. 预备工作 首先,确保你使用的是最新一版的

gamma校正原理

http://blog.csdn.net/u013286409/article/details/50239377 目录(?)[-] 图2中左图为原图,中图为gamma = 1/2.2在校正结果,原图中左半侧的灰度值较高,右半侧的灰度值较低,经过gamma = 1/2.2校正后(中图),左侧的对比度降低(见胡须),右侧在对比度提高(明显可以看清面容),同时图像在的整体灰度值提高. 右图为gamma = 2.2在校正结果,校正后,左侧的对比度提高(见胡须),右侧在对比度降低(面容更不清楚了),同时图

MIPI接口数字Gamma的用法和修改

在色彩管理系统中,为了产生一致的颜色效果,需要对用来观察图像色彩的显示器进行校正与特性化,在显示器的校正与特性化中,常常会涉及Gamma值.白点坐标.色温.三原色荧光剂色度值等参数的设定,其中Gamma值的设定至关重要,不同的Gamma值参数设定使显示器显示的亮度和颜色有较大的差别.显示器作为图像信息输出的主要设备,Gamma值对LCD显示器色彩的影响实验数据有更实际的应用价值. 最近调试一款ic为FL10801的IPS屏,编译完初始化代码,发现屏幕偏想某一种颜色,我以为是初始化代码中RGB颜色

AVL树(平衡二叉查找树)

首先要说AVL树,我们就必须先说二叉查找树,先介绍二叉查找树的一些特性,然后我们再来说平衡树的一些特性,结合这些特性,然后来介绍AVL树. 一.二叉查找树 1.二叉树查找树的相关特征定义 二叉树查找树,又叫二叉搜索树,是一种有顺序有规律的树结构.它可以有以下几个特征来定义它: (1)首先它是一个二叉树,具备二叉树的所有特性,他可以有左右子节点(左右孩子),可以进行插入,删除,遍历等操作: (2)如果根节点有左子树,则左子树上的所有节点的值均小于根节点上的值,如果根节点有右子树,则有字数上的所有节

《逐梦旅程 WINDOWS游戏编程之从零开始》笔记8——光照与材质

第14章 绘制出质感的世界--光照与材质 1. 光照与光源 在Direct3D中的光源类型和光照类型是不同的两个概念,光照模型描述的是光线的反射特征,而光源类型主要强调的是能够产生这些光照模型的方式以及光线的位置,方向,强度等特征. 四大光照类型 环境光:基于整个自然界环境的整体亮度,称为环境光或者背景光,没有位置或者方向上的特征,只有一个颜色亮度值,不会衰减,在所有方向和所有物体表面上投射的环境光的数量是恒定不变的(有点像我们白天的自然光).在Direc3D中设置环境光可以直接使用setRen

光照贴图深入学习 Lightmapping In-Depth

If you are about to lightmap your first scene in Unity, this Quickstart Guide might help you out. 如果你是在Unity第一次接触光照贴图,这个快速指南可以帮助你快速了解. Lightmapping is fully integrated in Unity, so that you can build entire levels from within the Editor, lightmap the

gamma原理及快速实现算法(C/C++)

参考 http://www.cambridgeincolour.com/tutorials/gamma-correction.htm http://en.wikipedia.org/wiki/Gamma_correction 论文Gamma矫正的快速算法以及其C语言实现 一.什么是Gamma校正 Gamma校正是对输入图像灰度值进行的非线性操作,使输出图像灰度值与输入图像灰度值呈指数关系: [2]   A是一个常数,通常取1,这个指数即为Gamma 经过Gamma校正后的输入和输出图像灰度值关系

Unity 3D 光照贴图快速入门 Lightmapping Quickstart

This an introductory description of lightmapping in Unity. For more advanced topics see in-depth description of lightmapping in Unity 这是一个Unity 光照贴图的引导手册.如果想查看更多的高级功能请查看in-depth description of lightmapping in Unity. Unity has a built-in lightmapper: