【OpenCV实现图像:用OpenCV图像处理技巧之白平衡算法】

文章目录

    • 概要
    • 加载样例图像
    • 统计数据分析
    • White Patch Algorithm
    • 小结

概要

白平衡技术在摄影和图像处理中扮演着至关重要的角色。在不同的光照条件下,相机可能无法准确地捕捉到物体的真实颜色,导致图像呈现出暗淡、色调不自然或者褪色的效果。为了解决这个问题,我们需要了解和应用白平衡技术。

白平衡的重要性

在日常生活中,我们经常会遇到不同光源下拍摄的照片,比如在室内使用白炽灯、荧光灯,或者在室外阳光下拍摄。不同类型的光源会产生不同色温的光线,而相机可能无法自动适应这些光线的差异。这就导致了照片中的颜色看起来不真实,不符合我们的视觉感受。

白平衡的原理

白平衡技术的基本原理是通过调整图像中各个颜色通道的增益,使得图像中的灰度区域呈现出中性灰色。简单来说,就是让白色看起来像白色,黑色看起来像黑色。这样一来,不同光源下拍摄的图像就能更准确地还原物体的真实颜色。

白平衡的调整方法

预设白平衡模式: 相机通常提供了一些预设的白平衡模式,比如日光、阴天、荧光灯、白炽灯等。选择合适的预设模式可以在一定程度上改善图像的颜色偏差。手动白平衡: 在一些相机中,我们可以手动设置白平衡。这通常需要在拍摄场景中放置一个白色卡片,让相机通过这个参考物体来调整白平衡。后期处理: 在图像处理软件中,我们也可以进行白平衡的调整。通过调整图像的色温、色调和饱和度等参数,我们可以更精细地控制图像的颜色效果。

白平衡技术的应用

白平衡技术不仅在摄影中应用广泛,在图像处理、广告设计、艺术创作等领域也有重要作用。在商品拍摄、人像摄影、风景摄影等各种场景中,合适的白平衡调整能够提高照片的质量,使其更具吸引力和真实感。

白平衡是一项用于校正由不同照明条件引起的图像颜色偏差的技术。它通过调整图像的颜色对比度,使白色看起来像白色,使黑色看起来像黑色。这个过程非常重要,因为它确保了图像中的颜色是准确的,同时也使图像对人眼来说看起来更加自然。

加载样例图像

# 导入必要的Python库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from skimage import io, img_as_ubyte
from skimage.io import imread, imshow
from matplotlib.patches import Rectangle# 加载样例图像
from skimage import io
import matplotlib.pyplot as plt# 读取图像文件
image = io.imread(r'E:\yolo项目\Opencv-project-main\Opencv-project-main\CVZone\img.png')# 显示原始图像
plt.figure(figsize=(10,10))
plt.title('Original Image')  # 设置图像标题
plt.imshow(image)  # 显示图像
plt.show()  # 显示图像

结果:
在这里插入图片描述

统计数据分析

# 导入必要的Python库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from skimage import io, img_as_ubyte
from skimage.io import imread, imshow
from matplotlib.patches import Rectangle# 加载样例图像
from skimage import io
import matplotlib.pyplot as plt# 读取图像文件
image = io.imread('qmark.png')# 显示原始图像
plt.figure(figsize=(10,10))
plt.title('Original Image')  # 设置图像标题
plt.imshow(image)  # 显示图像
plt.show()  # 显示图像# 分析图像中的统计信息
def calc_color_overcast(image):# 计算每个通道的颜色偏差red_channel = image[:, :, 0]  # 红色通道green_channel = image[:, :, 1]  # 绿色通道blue_channel = image[:, :, 2]  # 蓝色通道# 创建一个DataFrame来存储结果channel_stats = pd.DataFrame(columns=['Mean', 'Std', 'Min', 'Median', 'P_80', 'P_90', 'P_99', 'Max'])# 计算并存储每个颜色通道的统计信息for channel, name in zip([red_channel, green_channel, blue_channel], ['Red', 'Green', 'Blue']):mean = np.mean(channel)  # 平均值std = np.std(channel)  # 标准差minimum = np.min(channel)  # 最小值median = np.median(channel)  # 中位数p_80 = np.percentile(channel, 80)  # 80th百分位数p_90 = np.percentile(channel, 90)  # 90th百分位数p_99 = np.percentile(channel, 99)  # 99th百分位数maximum = np.max(channel)  # 最大值# 将统计信息存储到DataFrame中channel_stats.loc[name] = [mean, std, minimum, median, p_80, p_90, p_99, maximum]return channel_stats
# 计算颜色通道的统计信息
channel_stats = calc_color_overcast(image)# 打印统计信息
print(channel_stats)

定义了一个函数 calc_color_overcast(image),该函数用于计算图像中每个颜色通道(红色、绿色、蓝色)的统计信息,包括均值、标准差、最小值、中位数、80th、90th、99th 百分位数以及最大值。这些信息对于分析图像的颜色特性非常有用。

结果:
在这里插入图片描述

White Patch Algorithm

白色补丁算法是图像处理中常用的一种颜色平衡方法。其目标是通过缩放图像的颜色通道,使得每个通道中最亮的像素变为白色。这一方法基于假设:图像中最亮的像素应当代表白色。通过调整每个通道的亮度,算法可以校正图像的颜色投射,实现图像的白平衡。

# 导入必要的Python库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from skimage import io, img_as_ubyte
from skimage.io import imread, imshow
from matplotlib.patches import Rectangle# 加载样例图像
from skimage import io
import matplotlib.pyplot as plt# 读取图像文件def white_patch(image, percentile=100):"""Returns a plot comparison of original and corrected/white balanced imageusing the White Patch algorithm.Parameters----------image : numpy arrayImage to process using white patch algorithmpercentile : integer, optionalPercentile value to consider as channel maximum"""white_patch_image = img_as_ubyte((image * 1.0 / np.percentile(image,percentile,axis=(0, 1))).clip(0, 1))# Plot the comparison between the original and white patch corrected imagesfig, ax = plt.subplots(1, 2, figsize=(10, 10))ax[0].imshow(image)ax[0].set_title('Original Image')ax[0].axis('off')ax[1].imshow(white_patch_image, cmap='gray')ax[1].set_title('White Patch Corrected Image')ax[1].axis('off')plt.show()# Read the input image
image = imread(r'E:\yolo项目\Opencv-project-main\Opencv-project-main\CVZone\img.png')# Call the function to implement white patch algorithm
white_patch(image, 100)

在这里插入图片描述
使用默认参数percentile=100并没有明显改善图像,因为图像中RGB通道的最大值已经是[255, 255, 255]。通过观察前一章节中的统计信息,我们可以看到RGB通道的最大值和99百分位数都是255。

为了解决这个问题,我们可以考虑将像素值的较低百分位数视为最大值,而不是绝对的最大值。

white_patch(image, 85)

结果:
在这里插入图片描述

小结

优点:

简单易用:白色补丁算法的实现相对简单,易于理解和操作。这使得它成为修复图像白平衡问题的一种便捷选择,尤其是对于那些不需要复杂操作的场景。针对特定场景有效:该算法在处理具有主要白色区域或中性灰色区域的图像时非常有效。特别是当图像中存在明显的明亮区域时,白色补丁算法可以显著地改善图像的色彩平衡问题,使图像更加清晰和自然。适用性广泛:白色补丁算法可以广泛应用于各种场景,包括摄影、图像处理等领域。它不仅适用于专业摄影师,也可以被普通用户用于简单的图像修复工作。

缺点:

假设限制:算法的核心假设是图像中最亮的颜色是白色,然而,在实际场景中,图像中的最亮颜色可能是其他颜色。当这一假设不成立时,白色补丁算法的效果可能受到限制,无法完全修复图像的白平衡问题。过度校正风险:如果算法的假设不成立,可能会导致过度校正,使图像出现不自然的颜色或伪影。过度校正可能会引入新的问题,影响图像的质量和真实性。颜色偏移和伪影:由于算法的基本假设,即图像中最亮的区域是白色,可能会导致图像的某些区域出现颜色偏移或伪影。这种现象可能在图像的边缘或高光区域更为明显,影响整体视觉效果。在一些特殊场景下,这种颜色偏移和伪影可能会对图像的真实性产生负面影响。

在使用白色补丁算法时,用户需要根据具体情况权衡其优点和缺点,确保选择合适的场景和图像以获得最佳的修复效果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/136100.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

项目实战:中央控制器实现(2)-优化Controller,将共性动作抽取到中央控制器

1、FruitController FruitController已经和Web没有关系了,和Web容器解耦,可以脱离Web容器做单元测试 package com.csdn.fruit.controller; import com.csdn.fruit.dto.PageInfo; import com.csdn.fruit.dto.PageQueryParam; import com.csdn.fruit.dto.R…

5G与物联网应用:新一代网络技术融合开创新时代

5G与物联网应用:新一代网络技术融合开创新时代 随着信息技术的不断演进,5G和物联网作为新一代网络技术,正在引领我们走向一个更加智能化、互联互通的新时代。本文将分析5G与物联网应用的技术原理、应用场景与发展趋势,并探讨它们…

软件测试|selenium执行js脚本

JavaScript是运行在客户端(浏览器)和服务器端的脚本语言,允许将静态网页转换为交互式网页。可以通过 Python Selenium WebDriver 执行 JavaScript 语句,在Web页面中进行js交互。那么js能做的事,Selenium应该大部分也能…

软件测试|测试方法论—边界值

边界值分析法是一种很实用的黑盒测试用例方法,它具有很强的发现故障的能力。边界值分析法也是作为对等价类划分法的补充,测试用例来自等价类的边界。 这个方法其实是在测试实践当中发现,Bug 往往出现在定义域或值域的边界上,而不…

Godot4实现游戏的多语言版本

要在Godot 4中实现多语言版本的游戏,您需要按照以下几个步骤来设置和管理游戏文本以及可能的其他资源,如图像或声音。以下是根据官方文档和详细教程整理的简明指南: 准备翻译文件: Godot支持使用.csv文件或.po文件进行国际化​​…

基于单片机GP2D12测距-proteus仿真-源程序

基于51单片机红外测距-proteus仿真-源程序 一、系统方案 本设计采用51单片机作为主控器,液晶1602显示,GP2D12采集距离值,按键设置报警阀值,测量值超过阀值,蜂鸣器报警。 二、硬件设计 原理图如下: 三、单…

Day45 力扣动态规划 : 1143.最长公共子序列 |1035.不相交的线 | 53. 最大子序和

Day45 力扣动态规划 : 1143.最长公共子序列 |1035.不相交的线 | 53. 最大子序和 1143.最长公共子序列第一印象看完题解的思路实现中的困难感悟代码 1035.不相交的线第一印象感悟代码 53. 最大子序和第一印象dp递推公式初始化遍历顺序 实现中的困难感悟代…

数字政府!3DCAT实时云渲染助推上海湾区数字孪生平台

数字孪生,是一种利用物理模型、传感器数据、运行历史等信息,在虚拟空间中构建实体对象或系统的精确映射,从而实现对其全生命周期的仿真、优化和管理的技术。数字孪生可以应用于各个领域,如工业制造、智慧城市、医疗健康、教育培训…

原厂可调漏电继电器 LLJ-125F Φ45导轨安装可选面板安装

LLJ-F(S)系列漏电继电器 原厂漏电继电器 LLJ-125F Φ45 导轨安装 系列型号: LLJ-10F(S)漏电继电器LLJ-15F(S)漏电继电器LLJ-16F(S)漏电继电器 LLJ-25F(S)漏电继电器LLJ-30F(S)漏电继电器LLJ-32F(S)漏电继电器 LLJ-60F(S)漏电继电器LLJ-63F(S)漏电继电器LLJ-80F(S)…

渲染管线详解

光栅化的渲染管线一般分为三大阶段:应用程序阶段->几何阶段->光栅化阶段 也可以四大阶段: 应用程序阶段->几何阶段->光栅化阶段->逐片元操作阶段 更详细的流程如下: Vertex Specification(顶点规范化&#xff09…

一文搞定多端开发,做全栈大牛 附三大企业实战项目

一个功能三套代码 一改需求就是加不完的班? 不存在的,告别改改改 拥抱多端开发 一套代码搞定多个平台 高效开发:一套代码,多端通用 根据统计数据,全球移动设备用户数已经超过了50亿。随着智能手机、平板电脑等移动…

JSON——数组语法

一段JSON可能是以 ”{“ 开头 也可能仅包含一段JSON数组 如下 [ { "name" : "hello,world"}, {"name" : "SB JSON”}, {“name” : "SB互联网房地产CNM“}, ] 瞧,蛋疼不...CJSON过来还是得搜下网…

【ES专题】Logstash与FileBeat详解以及ELK整合详解

目录 前言阅读对象阅读导航前置知识笔记正文一、ELK架构1.1 经典的ELK1.2 整合消息队列Nginx架构 二、LogStash介绍2.1 Logstash核心概念2.1.1 Pipeline2.1.2 Event2.1.3 Codec (Code / Decode)2.1.4 Queue 2.2 Logstash数据传输原理2.3 Logstash的安装(以windows为…

Python tkinter用iconphoto方法修改窗口标题的图片

修改Python Tkinter窗口的标题图片,可以使用PhotoImage、iconphoto方法。这个方法允许你设置窗口的图标。 运行结果 代码示例如下: import tkinter as tkroot Tk()# 加载图片,记住一定是要PNG图片 icon tk.PhotoImage(filephoto\\图片.pn…

python的format函数的用法及实例

目录 1.format函数的语法及用法 (1)语法:{}.format() (2)用法:用于格式化字符串。可以接受无限个参数,可以指定顺序。返回结果为字符串。 2.实例 (1)不设置位置&…

ChatGPT - 在ChatGPT中设置通用提示模板

文章目录 Prompt设置验证 Prompt VERBOSITY: 我可能会使用 V[0-3] 来定义代码的详细程度:V0 简洁明了 V1 简练 V2 详细 V3 非常详细,附有例子助理回应 您是用户问题背景下的主题专家。我们一步一步来:除非您只是回答一个简短的问题&#xff…

探索环保葡萄酒之生物动力

根据生物动力农业和园艺协会的说法,生物动力农业是“一种精神-伦理-生态的农业、园艺、食品生产和营养方法。”生物动力农民将他们的农场或葡萄园视为一个坚固的有机体,一个自我维持的生态系统。这些农业哲学和实践在整个农业周期中应用了一种整体方法。…

计算机毕业设计基于springboot+java+vue的健身房课程预约信息网站

运行环境 开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven包:Maven 项目介绍 本健身网…

C/C++轻量级并发TCP服务器框架Zinx-游戏服务器开发005:守护进程与进程监控

文章目录 1 守护进程1.1 进程组和会话1.2 会话的相关概念1.3 守护进程的概念1.4 守护线程的特点1.5 守护进程创建的基本步骤1.6 本项目守护进程的实现 2 进程监控2.1 进程监控的实现 1 守护进程 1.1 进程组和会话 进程除了有进程的PID之外还有一个进程组,进程组是…

AD9371 Crossbar

AD9371 系列快速入口 AD9371ZCU102 移植到 ZCU106 : AD9371 官方例程构建及单音信号收发 ad9371_tx_jesd -->util_ad9371_xcvr接口映射: AD9371 官方例程之 tx_jesd 与 xcvr接口映射 AD9371 官方例程 时钟间的关系与生成 : AD9371 官方…