gamma 校正理解及python实现

注:思路是参考:http://blog.csdn.net/lichengyu/article/details/8457425点击打开链接

python代码为原创

1.什么是Gamma校正?

Gamma源于早期的CRT显示器的响应曲线,也就是输出亮度和输入电压的非线性关系,如图所示:

gamma 校正理解及python实现_第1张图片

图1 亮度和输入电压的非线性关系图

 

由图可以看出,亮度和输入电压的关系更加近似于指数函数 (output = input ^ gamma )的关系。事实确实如此,CRT显示器厂商都默认将gamma值设为2.5,也就是如上的曲线。这里的指数,也就是我们所讨论的gamma。

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

[2]

这个指数即为Gamma.

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

gamma 校正理解及python实现_第2张图片

                                                                                图1 Gamma校正.

 

二、为什么进行Gamma校正?

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

gamma 校正理解及python实现_第3张图片

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

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

 

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

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

gamma 校正理解及python实现_第4张图片

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

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



#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
__title__ = ""
__author__ = "zhoujuansheng"
__mtime__ = "2017/6/13"
# code is far away from bugs with the god animal protecting
I love animals. They taste delicious.
┏┓ ┏┓
┏┛┻━━━┛┻┓
┃ ☃ ┃
┃ ┳┛ ┗┳ ┃
┃ ┻ ┃
┗━┓ ┏━┛
┃ ┗━━━┓
┃ 神兽保佑 ┣┓
┃ 永无BUG! ┏┛
┗┓┓┏━┳┓┏┛
┃┫┫ ┃┫┫
┗┻┛ ┗┻┛
"""
import numpy as np
import cv2
import math
from matplotlib import pyplot as plt
import Recognise

file_name = "driving_license007"
img = cv2.imread("..//src//" + file_name + ".jpg")

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# gray = np.float32(gray)
# rocg = Recognise.Recognise()
image = np.power(gray / 255.0, 2.2)
# image = rocg.gamma_rectify(gray, 0.4)
cv2.imshow("gray", gray)
cv2.imshow("image", image)
cv2.waitKey(0)
cv2.destroyAllWindows()


你可能感兴趣的:(图像识别)