白平衡-Opencv-Python (SimplestColorBalance)

在论文《Enhancing underwater images and videos by fusion》被用到,在Water-Net中使用opencv复现了。

首先图像最亮的部分为白色,最暗的部分为黑色。其他部分进行拉伸。

统计RGB每个通道的像素值直方图分布,把像素值大小排名前n%的像素值赋值为0,把像素值排名后m%的赋值为255,其余部分拉伸到0~255之间,相当与对每个通道执行一次直方图均衡。这样使得每一个值通道的值在RGB中分布较均匀。达到颜色平衡的结果。

def wb(img, percent=0.5):
    # img = tensor_to_np(inp_np)
    out_channels = []
    #直方图分布前0.25%的像素赋值0,后0.25%的像素值赋值255
    cumstops = (
        img.shape[0] * img.shape[1] * percent / 200.0,
        img.shape[0] * img.shape[1] * (1 - percent / 200.0)
    )
    for channel in cv.split(img):
        #统计单通道的累计直方图
        cumhist = np.cumsum(cv.calcHist([channel], [0], None, [256], (0, 256)))
        #找出前0.25%的像素和后0.25%的像素的索引
        low_cut, high_cut = np.searchsorted(cumhist, cumstops)
        lut = np.concatenate((
            #赋值0
            np.zeros(low_cut),
            #弄一个0~255等差数列,使图像像素分布中间部分均衡映射到0~255
            np.around(np.linspace(0, 255, high_cut - low_cut + 1)),
            #赋值255
            255 * np.ones(255 - high_cut)
        ))
        #应用LUT,修改像素值
        out_channels.append(cv.LUT(channel, lut.astype('uint8')))
    img = cv.merge(out_channels)
    return img

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值