该代码实现的GTM全局色调映射算法通过对图像的暗部进行亮度调整,从而增加整个图像的对比度和动态范围。算法的核心思想是计算图像的全局平均亮度和最大亮度值,并根据这些值来调整像素的亮度值。
具体的实现步骤如下:
将图像转换到LAB色彩空间中,从而更好地处理亮度分量。
提取出L通道,该通道表示图像的亮度分量。
计算全局亮度值和最大亮度值,分别用lum和max_lum表示。
基于全局亮度和最大亮度值,计算出gain和bias值来调整像素的亮度值。
通过对L通道进行亮度调整,从而调整图像的对比度和动态范围。
将调整后的L通道、原来的A和B通道合并成一个新的LAB图像。
将新的LAB图像转换回RGB色彩空间,得到最终的调整后的图像。
def global_tone_mapping(image,gamma=2.2,lum_threshold=0.8):
# RGB2LAB 色彩空间转换
lab = cv2.cvtColor(image,cv2.COLOR_RGB2LAB)
# 分L A B 三通道
L,A,B = cv2.split(lab)
# 计算全局亮度值
lum = np.mean(L)
# 计算全局最大亮度
max_lum = np.max(L)
# 计算gain和bias值以用于tone mapping
gain = (1-lum_threshold) / (max_lum ** gamma - lum ** gamma)
bias = lum_threshold /(1-lum*gamma)
print('gain=',gain)
print('bias=',bias)
# 应用tone mapping 到 L 通道
L = cv2.pow(L/255.0,gamma)
L = gain * L + bias
print('L=gain*L+bias=',L)
L=np.uint8(cv2.normalize(L,None,0,255,cv2.NORM_MINMAX))
print('L=',L)
#结合L A B 到 LAB image
lab = cv2.merge((L,A,B))
#转换LAB为RGB
result = cv2.cvtColor(lab,cv2.COLOR_LAB2RGB)
return result