ISP-全局色调映射(GTM)算法简单实现

该代码实现的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

 

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值