伽马矫正实验

⼈眼对外界光源的感光值与输⼊光强不是呈线性关系的,⽽是呈指数型关系的。在低照度下,⼈眼更容易分辨出亮度的变化,随着照度的增加,⼈ 眼不易分辨出亮度的变化。⽽摄像机感光与输⼊光强呈线性关系。为⽅便⼈眼辨识图像,需要将摄像机采集的图像进⾏gamma校正。 Gamma校正是对输⼊图像灰度值进⾏的⾮线性操作,使输出图像灰度值与输⼊图像灰度值呈指数关系:
这个指数即为Gamma.
计算机系统由于显卡或者显示原因导致实际输出的亮度有偏差,需要调节亮度以看清底部图片的设置操作,这同样属于伽马变换。
0-10范围内,输出值大概在50左右(人类视觉感知亮度),200以上的变化程度不大,人类对黑暗的环境光感知更加的敏感。
然而相机传感器与输入的关系反馈为线性关系
并且显像设备的电压响应强度和曲线都有以下的关系:Vin = Vout^gamma
伽马矫正实验原理:

1.归一化

将像素值转换为0-1之间的实数:, p为像素值。对像素A而言,其值为0.783203

2.预补偿

根据公式,将归一化后的像素以为指数对应值,进行指数运算。若gamma为2.2,则为0.454545,则像素A预补偿结果为

3.反归一化

将预补偿后的结果反变换为0-255之间的整数:,对像素A而言,预补偿后的A为228,这个228就是显示器显示的数据

# 读取显示图像
from skimage import io, transform, color
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']

img = io.imread('OIP.jpg')

print(img.shape)
print(img.dtype)

plt.figure()
plt.subplot(111)
plt.title('Original Image')
plt.imshow(img, cmap='gray')

plt.tight_layout()
plt.show()

原始图像显示:
伽马值图像测试:
import numpy as np
import matplotlib.pyplot as plt
from skimage import data, io

img = io.imread('OIP.jpg')
height, width, channels = img.shape
print(type(img[0,0,0]))


imgRed = img[:,:,0]
img2 = 255*(imgRed/255)**3
img3 = 255*(imgRed/255)**(1/3)
img4 = 255*(imgRed/255)**2
img5 = 255*(imgRed/255)**(1/2)

plt.figure(1)
plt.subplot(221)
plt.xticks()
plt.yticks()
plt.imshow(img2, cmap='gray')

plt.subplot(222)
plt.xticks()
plt.yticks()
plt.imshow(img3, cmap='gray')

plt.subplot(223)
plt.xticks()
plt.yticks()
plt.imshow(img4, cmap='gray')

plt.subplot(224)
plt.xticks()
plt.yticks()
plt.imshow(img5, cmap='gray')

plt.tight_layout()
plt.show()

测试结果:

ps:附带一个小代码可以动态实现伽马值改变图像也跟着改变

import matplotlib.pyplot as plt
from skimage import io
import tkinter as tk

img = io.imread('OIP.jpg')
height, width, channels = img.shape
print(type(img[0, 0, 0]))

root = tk.Tk()
root.title("动态调节伽马值")


gamma_var = tk.DoubleVar(value=1.0)
gamma_slider = tk.Scale(root, from_=0.1, to=3.0, resolution=0.1, variable=gamma_var, orient=tk.HORIZONTAL, length=300,
                        label="Gamma")
gamma_slider.pack()
fig = plt.figure(figsize=(8, 6))
canvas = plt.gcf().canvas
root.wm_title("图像")


# 定义更新图像的函数
def update_image():
    imgRed = img[:, :, 0]
    img2 = 255 * (imgRed / 255) ** gamma_var.get()
    plt.clf()
    plt.imshow(img2, cmap='gray')
    plt.tight_layout()
    canvas.draw()
    root.after(100, update_image)


update_image()
root.mainloop()
plt.show()

测试:

有能力的人可以优化以下

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值