本文转载自:FPGA入门到精通
Gamma校正是一种在图像处理中广泛使用的技术,用以调整图像的亮度和对比度,改善图像质量。
本文将详细介绍一下Gamma校正,包括Gamma校正的定义、python实现以及FPGA实现。
一、Gamma校正
1、为什么会有Gamma校正?
Gamma校正是基于人眼对亮度感知非线性的特性,人眼对亮度的敏感度随着亮度的增加而减少,也就是说,当图像的亮度较低时,人眼对亮度的变化更为敏感,如下图所示。
2、Gamma校正公式
O = C * I^γ
其中C和γ都是常数,C为亮度和对比度缩放系数,通常取值为1,γ为gamma值,I为归一化的值,范围为【0~1】,O为输出值。
不同γ的曲线如下图:
从图中可以看出:
(1)当γ小于1时,会拉伸图像中灰度级较低的区域,同时会压缩灰度级较高的部分,使图像的暗部更亮,亮部更暗。
(2)当γ大于1时,会拉伸图像中灰度级较高的区域,同时会压缩灰度级较低的部分,使图像的暗部更暗,亮部更亮。
二、Python实现
1、python代码实现
import cv2
import numpy as np
img = cv2.imread('1280_720.bmp')
# 幂函数
def gamma_f1(img, gamma=2.0):
gamma_corrected = np.array(
255 * np.power((img / 255), gamma), dtype='uint8')
return gamma_corrected
# 查表法,速度快
def gamma_f2(img, gamma=2.0):
table = np.power(np.arange(256)/255.0, gamma)*255
gamma_corrected = cv2.LUT(img, table.astype(np.uint8))
return gamma_corrected
img_gamma1 = gamma_f1(img)
img_gamma2 = gamma_f1(img, 1/2.2)
cv2.namedWindow("original", 0)
cv2.resizeWindow("original", 300, 180) # 设置窗口大小
cv2.namedWindow("gamma2.2", 0)
cv2.resizeWindow("gamma2.2", 300, 180) # 设置窗口大小
cv2.namedWindow("gamma1/2.2", 0)
cv2.resizeWindow("gamma1/2.2", 300, 180) # 设置窗口大小
cv2.imshow('original', img)
cv2.imshow('gamma2.2', img_gamma1)
cv2.imshow('gamma1/2.2', img_gamma2)
cv2.waitKey(0)
cv2.destroyAllWindows()
2、效果
三、FPGA实现
Gamma校正是一个幂函数,这就涉及到复杂函数的运算,RGB值的输入范围为0~255,这里直接采用查表法实现。
借助python生成查表。
//python 代码 生成gamma=1/2.2
for i in range(0, 256):
print(' 8\'d{}: gamma2_2_inv = {};'.format(
i, int(255 * np.power((i / 255), 1/2.2) + 0.5)))
//python 代码 生成gamma=2.2
for i in range(0, 256):
print(' 8\'d{}: gamma2_2 = {};'.format(
i, int(255 * np.power((i / 255), 2.2) + 0.5)))
function [7:0] gamma2_2;
input [7:0] val;
begin
case(val)
8'd0: gamma2_2 = 0;
8'd1: gamma2_2 = 0;
8'd2: gamma2_2 = 0;
....
8'd255: gamma2_2 = 255;
endcase
end
endfunction
function [7:0] gamma2_2_inv;
input [7:0] val;
begin
case(val)
8'd0: gamma2_2_inv = 0;
8'd1: gamma2_2_inv = 21;
...
8'd255: gamma2_2_inv = 255;
endcase
end
endfunction
根据以上的分析,可以轻松完成FPGA实现。
仿真测试效果