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

文章目录

    • 概要
    • Gray-world Algotithm
    • Ground Truth Algorithm
    • 结论:

概要

随着数字图像处理技术的不断发展,白平衡算法成为了图像处理中一个关键的环节。白平衡的目标是校正图像中的颜色偏差,使得白色在图像中呈现真实的白色,从而提高图像的质量。
常用的白平衡算法:White Patch、Gray World、和 Ground Truth 算法

White Patch算法:
White Patch算法基于假设:图像中存在一个最亮的区域,该区域应该是白色的。该算法通过检测图像中最亮的区域并调整整个图像的色调来实现白平衡。White Patch算法适用于通用颜色校正,因为它相对简单且在许多情况下表现良好。

Gray World算法:
Gray World算法假设图像中的平均颜色应该是灰色的,通过调整图像的色调来使平均颜色趋近于灰色。这种算法对于一些场景中的光照条件变化较大的图像表现较好,适用于通用颜色校正。它在实现上相对简单,计算量也较小。

Ground Truth算法:
Ground Truth算法是一种专业应用的白平衡算法,它依赖于图像中有参考白色补丁的信息。通过分析这些参考白色补丁的颜色信息,算法可以更准确地进行白平衡校正。这种算法适用于对颜色要求较高、有参考标准的专业应用,例如医学影像、卫星图像等领域。

Gray-world Algotithm

灰色世界算法是一种白平衡算法,其原理基于假设图像的平均颜色应该是灰色的。在实现中,算法首先计算图像的平均亮度以及每个颜色通道的平均亮度。然后,通过计算亮度比例,对每个颜色通道进行相应的调整,以校正颜色映射关系。最终,通过灰色世界校正,图像呈现更为真实和自然的颜色。

该算法对于一些场景中光照条件变化较大的图像表现较好,是一种简单而有效的白平衡方法。通过调整图像的颜色映射关系,灰色世界算法能够提高图像的色彩准确性,使得图像更符合人眼感知的自然色彩。

import cv2
import matplotlib.pyplot as pltdef gray_world(image_path):# 读取图像image = cv2.imread(image_path)# 转换图像颜色通道顺序(OpenCV使用BGR,而matplotlib使用RGB)image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)# 计算图像的平均亮度avg_brightness = image.mean()# 计算每个颜色通道的平均亮度avg_channel_brightness = image.mean(axis=(0, 1))# 计算亮度比例,并相应地调整每个颜色通道image_grayworld = ((image * (avg_brightness / avg_channel_brightness)).clip(0, 255).astype(int))# 绘制原始图像和灰色世界校正后的对比图fig, ax = plt.subplots(1, 2, figsize=(14, 10))ax[0].imshow(image)ax[0].set_title('原始图像')ax[0].axis('off')ax[1].imshow(image_grayworld)ax[1].set_title('灰色世界校正后的图像')ax[1].axis('off')plt.show()# 调用函数应用灰色世界算法
# Use a raw string for the file path
gray_world('4444.png')

在这里插入图片描述
对于灰色世界算法,以下是其优缺点的总结:

优点:

简单且计算高效: 灰色世界算法是一种简单直观的颜色校正方法,计算过程相对高效。合理性假设: 算法基于图像的平均颜色应该是灰色的合理性假设。在许多场景中,这个假设是成立的,因为在典型的场景中,整体色调趋于中性。

缺点:

对单一主色敏感: 该算法可能对大面积存在的单一主色较为敏感,导致颜色平衡算法无法正常工作。如果图像中存在大块的单一颜色,算法可能会偏向调整其他颜色,而对这个主色不敏感。不总是正确的假设: 灰色世界算法的核心假设是图像的平均颜色应该是灰色的,然而,在某些场景中,这个假设并不总是正确的。例如,如果图像中有很强的色调偏移或特殊照明条件,灰色世界算法可能产生不理想的结果。

Ground Truth Algorithm

接着我们来介绍最后一种白平衡常用的算法 Ground Truth Algorithm,该算法需要图像中已知对象的颜色作为参考色。它根据此参考色来调整颜色通道以更正颜色投射关系

import cv2
import matplotlib.pyplot as plt
from matplotlib.patches import Rectangledef ground_truth(image, img_patch, mode='mean'):# 使用均值或最大值来进行颜色校正if mode == 'mean':image_gt = ((image * (img_patch.mean() / image.mean(axis=(0, 1)))).clip(0, 255).astype(int))elif mode == 'max':image_gt = ((image * 1.0 / img_patch.max(axis=(0, 1))).clip(0, 1))else:raise ValueError("Invalid mode. Use 'mean' or 'max'.")# 绘制原始图像和Ground Truth校正后的对比图fig, ax = plt.subplots(1, 2, figsize=(14, 10))ax[0].imshow(image)ax[0].set_title('原始图像')ax[0].axis('off')ax[1].imshow(image_gt)ax[1].set_title('Ground Truth校正后的图像')ax[1].axis('off')plt.show()# 读取图像
image = cv2.imread('4444.png')
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)# 选择参考色块的区域
img_patch = image[800:850, 1800:1850, :]# 显示图像和参考色块的矩形框
fig, ax = plt.subplots(figsize=(10, 10))
ax.set_title('参考块在红色矩形框内')
ax.imshow(image)
ax.add_patch(Rectangle((1800, 800), 50, 50, edgecolor='r', facecolor='none'))# 调用 Ground Truth Algorithm
ground_truth(image, img_patch, mode='mean')

在这里插入图片描述

结论:

三种白平衡算法各有优劣,选择适当的算法取决于应用场景的具体需求和假设。White Patch和Gray World算法适用于通用颜色校正,而Ground Truth算法更适合专业领域,特别是需要高精度白平衡的场景。在实际应用中,根据图像的特性和应用要求选择合适的白平衡算法,有助于提高图像质量和信息准确性

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

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

相关文章

Matter 协议详解

目录 1、Matter 协议发展 1.1、什么是Matter 1.2、Matter能做什么 2、整体介绍 3、架构介绍 3.1、Matter网络拓扑结构 3.2、标识符 3.2.1、Fabric引用和Fabric标识符 3.2.2、供应商标识符(Vendor ID,VID) 3.2.3、产品标识符&#x…

轻量封装WebGPU渲染系统示例<32>- 若干线框对象(源码)

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/rendering/src/voxgpu/sample/WireframeEntityTest.ts 当前示例运行效果: 此示例基于此渲染系统实现,当前示例TypeScript源码如下: export class WireframeEntityTest {private mRsc…

深入解析JavaScript中的变量作用域与声明提升

JS中的变量作用域 背景: ​ 之前做js逆向的时候,有一个网站很有意思,就是先出现对其赋值,但是后来的变量赋值没有对其发生修改,决定说一下js中的作用域问题. 全局作用域: ​ 全局作用域的变量可以在任何…

(论文阅读34-39)理解CNN

34.文献阅读笔记 简介 题目 Understanding image representations by measuring their equivariance and equivalence 作者 Karel Lenc, Andrea Vedaldi, CVPR, 2015. 原文链接 http://www.cv-foundation.org/openaccess/content_cvpr_2015/papers/Lenc_Understanding_I…

模拟业务流程+构造各种测试数据,一文带你测试效率提升80%

📢专注于分享软件测试干货内容,欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!📢交流讨论:欢迎加入我们一起学习!📢资源分享:耗时200小时精选的「软件测试」资…

(五)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB

一、七种算法(DBO、LO、SWO、COA、LSO、KOA、GRO)简介 1、蜣螂优化算法DBO 蜣螂优化算法(Dung beetle optimizer,DBO)由Jiankai Xue和Bo Shen于2022年提出,该算法主要受蜣螂的滚球、跳舞、觅食、偷窃和繁…

基于乌鸦算法优化概率神经网络PNN的分类预测 - 附代码

基于乌鸦算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于乌鸦算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于乌鸦优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要:针对PNN神经网络的光滑…

【Python】jupyter notebook(学习笔记)

Jupyter Notebook初见 1、Jupyter Notebook介绍 web版的ipython 编程、写文档、记笔记、展示 格式.ipynb 2、为什么使用Jupyter Notebook? 画图方面的优势:图像的生成不会堵塞后面代码的执行数据展示方面的优势:生成的数据可以保存在文件中 3、J…

《QT从基础到进阶·二十一》QGraphicsView、QGraphicsScene和QGraphicsItem坐标关系和应用

前言: 我们需要先由一个 QGraphicsView,这个是UI显示的地方,也就是装满可见原色的Scene,然后需要一个QGraphicsScene 用来管理所有可见的界面元素,要实现UI功能,我们需要用各种从QGraphicsItem拼装成UI控件…

MySQL MVCC机制详解

MySQL MVCC机制详解 MVCC, 是Multi Version Concurrency Control的缩写,其含义是多版本并发控制。这一概念的提出是为了使得MySQL可以实现RC隔离级别和RR隔离级别。 这里回顾一下MySQL的事务, MySQL的隔离级别和各种隔离级别所存在的问题。 事务是由 …

redis基线检查

1、禁止使用 root 用户启动 | 访问控制 描述: 使用root权限来运行网络服务存在较大的风险。Nginx和Apache都有独立的work用户,而Redis没有。例如,Redis的Crackit漏洞就是利用root用户权限替换或增加authorize_keys,从而获取root登录权限。 加固建议: 使用root切换到re…

新版软考高项试题分析精选(二)

请点击↑关注、收藏,本博客免费为你获取精彩知识分享!有惊喜哟!! 1、除了测试程序之外,黑盒测试还适用于测试( )阶段的软件文档。 A.编码 B.总体设计 D.数据库设计 C.软件需求分析 答案&a…

NSSCTF第12页(2)

[CSAWQual 2019]Unagi 是xxe注入,等找时间会专门去学一下 XML外部实体(XXE)注入 - 知乎 【精选】XML注入学习-CSDN博客 【精选】XML注入_xml注入例子-CSDN博客 题目描述说flag在/flag下 发现有上传点,上传一句话木马试试 文件…

一文搞懂CAN总线协议

1.基础概念 CAN 是 Controller Area Network 的缩写(以下称为 CAN),是 ISO 国际标准化的串行通信协议。在北美和西欧,CAN 总线协议已经成为汽车计算机控制系统和嵌入式工业控制局域网的标准总线,并且拥有以 CAN 为底层…

指针传2

几天没有写博客了,怎么说呢?这让我总感觉缺点什么,心里空落落的,你懂吧! 好了,接下来开始我们今天的正题! 1. ⼆级指针 我们先来看看代码: 首先创建了一个整型变量a,将…

在 HarmonyOS 上实现 ArkTS 与 H5 的交互

介绍 本篇 Codelab 主要介绍 H5 如何调用原生侧相关功能,并在回调中获取执行结果。以“获取通讯录”为示例分步讲解 JSBridge 桥接的实现。 相关概念 Web组件:提供具有网页显示能力的 Web 组件。 ohos.web.webview:提供 web 控制能力。 …

<C++> 优先级队列

目录 前言 一、priority_queue的使用 1. 成员函数 2. 例题 二、仿函数 三、模拟实现 1. 迭代器区间构造函数 && AdjustDown 2. pop 3. push && AdjustUp 4. top 5. size 6. empty 四、完整实现 总结 前言 优先级队列以及前面的双端队列基本上已经脱离了队列定…

Ansible 企业实战详解

一、ansible简介1. ansible是什么2.ansible的特点ansible的架构图 二、ansible 任务执行1、ansible 任务执行模式2、ansible 执行流程3、ansible 命令执行过程 二 .Ansible安装部署1.yum安装2.ansible 程序结构3、ansible配置文件查找顺序4、ansible配置文件5.ansible自动化配置…

electronjs入门-编辑器应用程序

我们将在Electron中创建一个新项目,如我们在第1章中所示,名为“编辑器”,我们将在下一章中使用它来创建编辑器;在index.js中,这是我们的主要过程;请记住为Electron软件包放置必要的依赖项: npm…

uniapp基础学习笔记01

文章目录 本博客根据黑马教程学习uniapp一、技术架构二、创建项目2.1 Hbuilder创建2.2 插件安装2.3 微信开发者工具配置与运行2.3.1 简单修改基础页面 2.4 pages.json和tabBar2.4.1 pages.json与tabBar配置2.4.2 案例 三、uniapp与原生开发的区别 本博客根据黑马教程学习uniapp…