首页 > 编程语言 >python 灰世界白平衡算法

python 灰世界白平衡算法

时间:2023-08-01 22:44:06浏览次数:42  
标签:img python cv2 白平衡 算法 np new avg 255

白平衡是图像处理比较常见的一个概念,在采集图像的过程中,相机的感光元件或者镜头会对原始色彩造成影响,而白平衡技术通常可以用来校正这种光线和镜头对颜色影响。

灰度世界算法(Gray World)假设认为,一幅彩色图像中,RGB三个通道的颜色平均值是趋于同一个灰度值K的,所以如果当前的通道的均值与K值存在差异,就需要对该通道的像素值进行矫正,矫正的结果则是与K有关。K值的取法有两种,一种是取最大像素值的一般,即8位图中的127或者128;第二种是以三通道的均值来作为K值。

灰度世界白平衡算法流程如下:

  (1)计算RGB三个通道各自的均值,得到Ravg、Gavg和Bavg ;

  (2)取RGB均值的均值得到K值:K = ( Ravg + Gavg + Bavg ) / 3 ;

  (3)计算各通道相对于K值的增益:

      KR = K / Ravg

      KG = K / Gavg

      KB = K / Bavg

  (4)根据增益逐个调整RGB三通道的像素值:

      Rnew = R * KR

      Gnew = G * KG

      Bnew = B * KB

  (5)调整输出,由于上面的计算可能存在溢出,因此需要对结果进行调整,调整有两种做法:

      a)超出部分取255;

      b)计算Rnew、Gnew、Bnew的最大值,然后映射回0到255。


python代码实现如下:

import cv2
import numpy as np

img = cv2.imread('./cat.jpg')

b,g,r = cv2.split(img)  #图像bgr通道分离

avg_b = np.average(b)
avg_g = np.average(g)
avg_r = np.average(r)

k = (avg_b+avg_g+avg_r)/3  #计算k值

kr = k/avg_r #计算rgb的增益(增益通常在0-2的浮点数之间)
kb = k/avg_b
kg = k/avg_g

#根据增益逐个调整RGB三通道的像素值,超出部分取255(数据类型还是要转换回uint8)
new_b = np.where((kb * b) > 255,255,kb*b).astype(np.uint8)
new_g = np.where((kg * g) > 255,255,kg*g).astype(np.uint8)
new_r = np.where((kr * r) > 255,255,kr*r).astype(np.uint8)

# 合并三个通道
img_new = cv2.merge([new_b,new_g,new_r])

cv2.imshow('img',img)
cv2.imshow('img_new',img_new)

cv2.waitKey(0)
cv2.destroyAllWindows()

把awb算法封装到函数中:

# coding=gbk  文件中有中文字符,将其转换为utf-8,否则编译会出错
import cv2
import numpy as np

def AWB(image):
    img = cv2.imread(image)
    b,g,r = cv2.split(img)  #图像bgr通道分离

    avg_b = np.average(b)
    avg_g = np.average(g)
    avg_r = np.average(r)

    k = (avg_b+avg_g+avg_r)/3  #计算k值

    kr = k/avg_r #计算rgb的增益(增益通常在0-2的浮点数之间)
    kb = k/avg_b
    kg = k/avg_g

    #根据增益逐个调整RGB三通道的像素值,超出部分取255(数据类型还是要转换回uint8)
    new_b = np.where((kb * b) > 255, 255, kb*b).astype(np.uint8)
    new_g = np.where((kg * g) > 255, 255, kg*g).astype(np.uint8)
    new_r = np.where((kr * r) > 255, 255, kr*r).astype(np.uint8)

    # 合并三个通道
    img_new = cv2.merge([new_b,new_g,new_r])
    return img_new

img = cv2.imread('./night.png')
awb_img = AWB('./night.png')  #对图片进行简单灰世界算法处理

cv2.imshow('img',img)
cv2.imshow('awb',awb_img)

cv2.waitKey(0)
cv2.destroyAllWindows()

 

k值取127或者128也可以,但是效果会差一点:

 

标签:img,python,cv2,白平衡,算法,np,new,avg,255
From: https://www.cnblogs.com/libai123456/p/17599345.html

相关文章

  • opencv-python 模板匹配
    模板匹配:在给定的图像中查找和模板最相似的区域。模板匹配类似于卷积,模板在原图上从左上角原点(0,0)开始滑动,计算模板与滑动窗口的差别程度,计算方法有6种,每次计算的结果放在一个矩阵中,最后输出差别程度的矩阵。原始图像为A*B,模板大小是a*b的话,输出的矩阵大小为:(A-a+1)*(B-b+1)。1模......
  • opencv-python 图像直方图
    统计学中,直方图是一种对数据分布情况的图形表示,并且将统计数据组织到一系列定义好bin当中(bin是从数据中计算出的特征统计量,可以看作“直条”或“组距”)。图像直方图是用来表示数字图像中亮度分布的直方图,统计的是图像中每个像素亮度值的个数。横坐标表示图像中各个像素点的灰度级......
  • python - 文件
    #str=r'''#《春晓》这首小诗,初读似觉平淡无奇,反复读之,便觉诗中别有天地。它的艺术魅力不在于华丽的辞藻,不在于奇绝的艺术手法,而在于它的韵味。整首诗的风格就像行云流水一样平易自然,然而悠远深厚,独臻妙境。千百年来,人们传诵它,探讨它,仿佛在这短短的四行诗里,蕴涵着开掘不完的艺......
  • Cmd:创建Python虚拟环境
    安装virtualenv安装虚拟环境pipinstallvirtualenv或pipinstallvirtualenv-ihttp://pypi.douban.com/simple/--trusted-hostpypi.douban.com创建虚拟环境目录virtualenvtestcdtest进入Scripts工作目录cdScripts激活当前虚拟环境activate.bat安装vi......
  • 什么是算法复杂度?
    算法复杂度(AlgorithmComplexity)是衡量算法性能的度量标准。它描述了算法在输入规模增大时,所需的计算资源(例如时间和空间)的增长情况。算法复杂度通常用"大O符号"(BigOnotation)来表示,用来描述算法在最坏情况下的增长速度。在算法复杂度的表示中,我们关注的是算法执行所需的基本操......
  • 文心一言 VS 讯飞星火 VS chatgpt (69)-- 算法导论6.5 8题
    八、HEAP-DELETE(A,i)操作能够将结点i从堆A中删除。对于一个包含n个元素的堆,请设计一个能够在O(lgn)时间内完成的HEAP-DELETE操作。文心一言:要在O(logn)时间内完成HEAP-DELETE操作,可以使用以下方法:1.首先找到要删除的节点i的父节点。可以从根节点开始,依次向上遍历,直......
  • 文心一言 VS 讯飞星火 VS chatgpt (69)-- 算法导论6.5 8题
    八、HEAP-DELETE(A,i)操作能够将结点i从堆A中删除。对于一个包含n个元素的堆,请设计一个能够在O(lgn)时间内完成的HEAP-DELETE操作。文心一言:要在O(logn)时间内完成HEAP-DELETE操作,可以使用以下方法:1.首先找到要删除的节点i的父节点。可以从根节点开始,依次向上遍......
  • 基础算法串讲 习题分析
    第八题原题再现对于一个含有\(26\)个结点的完全二叉树,其中多少个结点没有子结点?A.10B.11C.12D.13题目解答叶子节点个数:\(26-(2^4-1)=26-15=11\)倒数第二层的右边结点:\([(16-11)/2]=2\)总个数:\(11+2=13\)犯の错误没有子结点的结点有两种叶子节点倒数第二......
  • 预测算法-20230801(持续更新)
    第一章-关于预测的核心算法机器学习中的预测算法,本笔记主要记录“函数逼近”问题下的预测。属于监督学习的一种函数逼近常见算法:线性回归、逻辑回归应用:分类问题、回归问题函数逼近的主要分类:惩罚线性回归、集成方法大、小数据集,宽、高瘦数据集宽数据:每次观测有大......
  • Python爬虫入门
    前言网页构成首先介绍一个网页的基本构成:HTML负责网页的结构,CSS负责样式的美化,Javascript负责交互逻辑。HTMLCSSJavascript点击F12打开开发者工具(部分电脑可能为Fn+F12),使用元素选择工具,再将鼠标指针移动到任意网页元素,单击该元素则该元素对应的网页源代码会被选中。......