伽马校正的介绍

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了伽马校正的介绍相关的知识,希望对你有一定的参考价值。

参考技术A 伽马校正的介绍
伽马校正就是对影象的伽马曲线进行编辑,以对影象进行非线性色调编辑的方法,检出影象讯号中的深色部分和浅色部分,并使两者比例增大,从而提高影象对比度效果。
伽马校正是什么。。
这个不用管,用处不大
伽马校正的概念
现实世界中几乎所有的CRT显示装置、摄影胶片和许多电子照相机的光电转换特性都是非线性的。这些非线性部件的输出与输入之间的关系(例如,电子摄像机的输出电压与场景中光强度的关系,CRT发射的光的强度与输入电压的关系)可以用一个幂函式来表示,它的一般形式是:输出=(输入)γ式中的γ (gamma)是幂函式的指数,它用来衡量非线性部件的转换特性。这种特性称为幂-律(power-law)转换特性。按照惯例,“输入”和“输出”都缩放到0~1之间。其中,0表示黑电平,1表示颜色分量的最高电平。对于特定的部件,人们可以度量它的输入与输出之间的函式关系,从而找出γ值。实际的影象系统是由多个部件组成的,这些部件中可能会有几个非线性部件。如果所有部件都有幂函式的转换特性,那么整个系统的传递函式就是一个幂函式,它的指数γ 等于所有单个部件的g 的乘积。如果影象系统的整个γ =1,输出与输入就成线性关系。这就意味在重现影象中任何两个影象区域的强度之比率与原始场景的两个区域的强度之比率相同,这似乎是影象系统所追求的目标:真实地再现原始场景。但实际情况却不完全是这样。当这种再生影象在“明亮环境”下,也就是在其他白色物体的亮度与影象中白色部分的亮度几乎相同的环境下观看时,γ =1的系统的确可使影象看起来像“原始场景”一样。但是某些影象有时在“黑暗环境”下观看所获得的效果会更好,放映电影和投影幻灯片就属于这种情况。在这种情况下,γ 值不是等于1而通常认为g »1.5,人的视角系统所看到的场景就好像是“原始场景”。根据这种观点,投影幻灯片的γ 值就设计为1.5左右,而不是1。还有一种环境称为中间环境的“暗淡环境”,这种环境就像房间中的其他东西能够看到,但比影象中白色部分的亮度更暗。看电视的环境和计算机房的环境就属于这种情况。在这种情况下,通常认为再现影象需要γ »1.25才能看起来像“原始场景”。
VRAY,中的伽马校正怎么用?
伽马值在很多地方都可以调节。

1 在上方选单栏中的自定义中,选择首选项,然后在场开的对话方块中,选择“GAMMA和LUT” ,就能看到伽马值了,伽马值的英文叫Gamma 。

2 如果有VRAY渲染器,那么在渲染器中的颜色对映中,也能找到伽马值。
伽马校正是什么意思? 30分
校正亮度。
伽玛校正的数学函式
以传统CRT(Cathode Ray Tube)萤幕的特性而言,该曲线通常是一个乘幂函式,Y=(X+e)γ,其中,Y为亮度、X为输出电压、e为补偿系数、乘幂值(γ)为伽玛值,改变乘幂值(γ)的大小,就能改变CRT的伽玛曲线。典型的Gamma值是0.45,它会使CRT的影像亮度呈现线性。使用CRT的电视机等显示器萤幕,由于对于输入讯号的发光灰度,不是线性函式,而是指数函式,因此必需校正。
极品飞车18 画面设定中 伽玛校正 什么意思 调成多少画面最好 50%么 我显示卡970
伽马校正?你调高看看是不是亮度高了,有时候这些奇怪的选项源于蛋疼的汉化组
检验伽马值是什么意思
显示器伽马值

是显示器的物理属性,固定的,不变的,不可校正的。显示器伽马在不同的上下文环境中,有不同的含义,一个意思是指显示器的输出影象对输入讯号的失真,另一个意思是指这种失真的具体数值。由于显示器伽马和档案伽马是固定不变的,伽马校正过程是校正计算机的系统伽马!,使得显示器伽马、系统伽马、档案伽马三个变换的叠加为1.0,从而使最终显示器的影象和原始场景一样,不存在失真。

这就好比密码通讯,档案伽马是加密过程,系统伽马和显示器伽马是档案伽马的一种反作用,是解密过程,最后看到的结果和原始资讯一样。
什么是伽玛校正(Gamma Correction)
所谓伽玛校正就是对影象的伽玛曲线进行编辑,以对影象进行非线性色调编辑的方法,检出影象讯号中的深色部分和浅色部分,并使两者比例增大,从而提高影象对比度效果。计算机绘图领域惯以此萤幕输出电压与对应亮度的转换关系曲线,称为伽玛曲线(Gamma Curve)。以传统CRT(Cathode Ray Tube)萤幕的特性而言,该曲线通常是一个乘幂函式,Y=(X+e)γ,其中,Y为亮度、X为输出电压、e为补偿系数、乘幂值(γ)为伽玛值,改变乘幂值(γ)的大小,就能改变CRT的伽玛曲线。典型的Gamma值是0.45,它会使CRT的影像亮度呈现线性。使用CRT的电视机等显示器萤幕,由于对于输入讯号的发光灰度,不是线性函式,而是指数函式,因此必需校正。
显示器调光线的时候,伽马是什么意思
Gamma,汉语音译为“伽马”。

数码影象中的每个象素都有一定的光亮程度,即从黑色(0)到白色(1)。这些象素值就是输入到电亥显示器里面的资讯。但由于技术的限制,纯平(CRT)显示器只能以一种非线性的方式输出这些值,即:输出=输入X伽马。

在不加调整的情况下,多数CRT显示器都有一个2.5的伽马值,它的意义是:假如一个象素的光亮度为0.5,在没有颜色管理应用程式的干预下(*),它在显示器上输出的光亮度只有0.18(0.5X2.5)。对于液晶显示屏(LCD),特别是膝上型电脑的LCD来说,其输出的曲线就更加不规则。一些校准软体或硬体可以让显示屏输出影象时按一定的伽马曲线输出,例如Windows常用的伽马值为2.2,这几乎与人类视觉的反应相反。sRGB和Adobe RGB颜色也是以2.2的伽马值为基础设立的。

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 分析的方法检测下两张图像,结果图如下。

技术图片

 

技术图片

技术图片

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

以上是关于伽马校正的介绍的主要内容,如果未能解决你的问题,请参考以下文章

图形学我理解的伽马校正(Gamma Correction)

OpenGL学习脚印:伽马校正(Gamma Correction)

图像处理基础基于matlab图像SRGB+Adobe RGB伽马校正含Matlab源码 255期

伽马主打咖啡介绍

MATLAB 中的 Gamma 校正实现

伽马咖啡公司介绍