【算法与数据结构】图像白平衡原理及Python-OpenCV简单实现

本文主要是介绍【算法与数据结构】图像白平衡原理及Python-OpenCV简单实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

色温与白平衡

从字面上理解,白平衡的意思是白色的平衡。白平衡是描述显示器中红、绿、蓝三基色混合生成后白色精确度的一项指标,可以解决色彩还原和色调处理的一系列问题。

色温,就是定量的以开尔文温度(K)来表示色彩。它是开尔文通过黑体这一理想光源,在不同温度下,所发出光线的颜色特性来定义的。

开尔文温度和摄氏度之间的关系: 
零下273.15摄氏度被称为绝对零度,就是0K。然后温度每上升一摄氏度,也就是上升1K。

将一个黑体加热之后,随着温度的升高,黑体会先发出红色,然后越来越亮,变成黄光,在变成白光,直至蓝光。

红色是暖色,色温低。
蓝色是冷色,色温高。

白平衡就涉及到了一个相对颜色的问题,比如一张纯白色的白纸,在白炽灯下拍出来颜色是白色的。但是在烛光下拍出来就是偏暖色,在晴朗的蓝天拍出来就偏冷色。那么这张纸到底是什么颜色?、

白平衡的初始技能就是将在不同环境色温中的白色物体都还原成真的白色

工作原理

摄像机内部有三个CCD电子耦合元件,他们分别感受蓝色、绿色、红色的光线,在预置情况下这三个感光电路电子放大比例是相同的,为1:1:1的关系,白平衡的调整就是根据被调校的景物改变了这种比例关系。

比如被调校景物(你认为的白色)的蓝、绿、红色光的比例关系是2:1:1(蓝光比例多,色温偏高),那么白平衡调整后的比例关系为1:2:2,调整后的电路放大比例中明显蓝的比例减少,增加了绿和红的比例,这样被调校景物通过白平衡调整电路到所拍摄的影像,蓝、绿、红的比例才会相同。


代码

import cv2
import numpy as npimg = cv2.imread('111.png',1)
cv2.imshow('111',img)
width = img.shape[1]
height = img.shape[0]
dst = np.zeros(img.shape,img.dtype)#1.计算三通道灰度平均值
imgB = img[:,:,0]
imgG = img[:,:,1]
imgR = img[:,:,2]
bAve = cv2.mean(imgB)[0]
gAve = cv2.mean(imgG)[0]
rAve = cv2.mean(imgR)[0]
aveGray = (int)(bAve + gAve + rAve)/3#2计算每个通道的增益系数
bCoef = aveGray / bAve
gCoef = aveGray / gAve
rCoef = aveGray / rAve#3使用增益系数
imgB = np.floor((imgB * bCoef)) #向下取整
imgG = np.floor((imgG * gCoef))
imgR = np.floor((imgR * rCoef))#4将数组元素后处理
maxB = np.max(imgB)
minB = np.min(imgB)
maxG = np.max(imgG)
minG = np.min(imgG)
maxR = np.max(imgR)
minR = np.min(imgR)
for i in range(0,height):for j in range(0,width):imgb = imgB[i, j]imgg = imgG[i, j]imgr = imgR[i, j]if imgb > 255:imgb = 255if imgg > 255:imgg = 255if imgr > 255:imgr = 255dst[i,j] = (imgb,imgg,imgr)
cv2.imshow('222',dst)
cv2.waitKey(0)

               

参考:

https://blog.csdn.net/helimin12345/article/details/78255669

https://blog.csdn.net/u010468553/article/details/79585447

这篇关于【算法与数据结构】图像白平衡原理及Python-OpenCV简单实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/214145

相关文章

基于Python编写一个git自动上传的脚本(打包成exe)

《基于Python编写一个git自动上传的脚本(打包成exe)》这篇文章主要为大家详细介绍了如何基于Python编写一个git自动上传的脚本并打包成exe,文中的示例代码讲解详细,感兴趣的小伙伴可以跟... 目录前言效果如下源码实现利用pyinstaller打包成exe利用ResourceHacker修改e

Python在二进制文件中进行数据搜索的实战指南

《Python在二进制文件中进行数据搜索的实战指南》在二进制文件中搜索特定数据是编程中常见的任务,尤其在日志分析、程序调试和二进制数据处理中尤为重要,下面我们就来看看如何使用Python实现这一功能吧... 目录简介1. 二进制文件搜索概述2. python二进制模式文件读取(rb)2.1 二进制模式与文本

Python中Tkinter GUI编程详细教程

《Python中TkinterGUI编程详细教程》Tkinter作为Python编程语言中构建GUI的一个重要组件,其教程对于任何希望将Python应用到实际编程中的开发者来说都是宝贵的资源,这篇文... 目录前言1. Tkinter 简介2. 第一个 Tkinter 程序3. 窗口和基础组件3.1 创建窗

基于C++的UDP网络通信系统设计与实现详解

《基于C++的UDP网络通信系统设计与实现详解》在网络编程领域,UDP作为一种无连接的传输层协议,以其高效、低延迟的特性在实时性要求高的应用场景中占据重要地位,下面我们就来看看如何从零开始构建一个完整... 目录前言一、UDP服务器UdpServer.hpp1.1 基本框架设计1.2 初始化函数Init详解

Java中Map的五种遍历方式实现与对比

《Java中Map的五种遍历方式实现与对比》其实Map遍历藏着多种玩法,有的优雅简洁,有的性能拉满,今天咱们盘一盘这些进阶偏基础的遍历方式,告别重复又臃肿的代码,感兴趣的小伙伴可以了解下... 目录一、先搞懂:Map遍历的核心目标二、几种遍历方式的对比1. 传统EntrySet遍历(最通用)2. Lambd

Django调用外部Python程序的完整项目实战

《Django调用外部Python程序的完整项目实战》Django是一个强大的PythonWeb框架,它的设计理念简洁优雅,:本文主要介绍Django调用外部Python程序的完整项目实战,文中通... 目录一、为什么 Django 需要调用外部 python 程序二、三种常见的调用方式方式 1:直接 im

Python字符串处理方法超全攻略

《Python字符串处理方法超全攻略》字符串可以看作多个字符的按照先后顺序组合,相当于就是序列结构,意味着可以对它进行遍历、切片,:本文主要介绍Python字符串处理方法的相关资料,文中通过代码介... 目录一、基础知识:字符串的“不可变”特性与创建方式二、常用操作:80%场景的“万能工具箱”三、格式化方法

springboot+redis实现订单过期(超时取消)功能的方法详解

《springboot+redis实现订单过期(超时取消)功能的方法详解》在SpringBoot中使用Redis实现订单过期(超时取消)功能,有多种成熟方案,本文为大家整理了几个详细方法,文中的示例代... 目录一、Redis键过期回调方案(推荐)1. 配置Redis监听器2. 监听键过期事件3. Redi

SpringBoot全局异常拦截与自定义错误页面实现过程解读

《SpringBoot全局异常拦截与自定义错误页面实现过程解读》本文介绍了SpringBoot中全局异常拦截与自定义错误页面的实现方法,包括异常的分类、SpringBoot默认异常处理机制、全局异常拦... 目录一、引言二、Spring Boot异常处理基础2.1 异常的分类2.2 Spring Boot默

基于SpringBoot实现分布式锁的三种方法

《基于SpringBoot实现分布式锁的三种方法》这篇文章主要为大家详细介绍了基于SpringBoot实现分布式锁的三种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、基于Redis原生命令实现分布式锁1. 基础版Redis分布式锁2. 可重入锁实现二、使用Redisso