用OpenCV图像处理技巧之白平衡算法(二)

1. 引言

在上一节中我们介绍了白平衡算法的原理,并详细实现了基于白色补丁算法的白平衡实现,本文继续就白平衡的其他算法实现进行展开。

闲话少说,我们直接开始吧!

2. Gray-world Algorithm

灰色世界算法(Gray-world Algotithm)假设图像的平均颜色应该是灰色的。它会相应地调整颜色通道以校正颜色映射关系。

代码实现如下:

def gray_world(image):
    """
    Returns a plot comparison of original and corrected/white balanced image 
    using the Gray World algorithm.

    Parameters
    ----------
    image : numpy array
            Image to process using gray world algorithm
    """
    # Apply the Gray World algorithm
    image_grayworld = ((image * (image.mean() / image.mean(axis=(0, 1)))).clip(0, 255).astype(int))

    # Exclude alpha or opacity channel (transparency)
    if image.shape[2] == 4:
        image_grayworld[:, :, 3] = 255

    # Plot the comparison between the original and gray world corrected images
    fig, ax = plt.subplots(1, 2, figsize=(14, 10))
    ax[0].imshow(image)
    ax[0].set_title('Original Image')
    ax[0].axis('off')

    ax[1].imshow(image_grayworld)
    ax[1].set_title('Gray World Corrected Image')
    ax[1].axis('off')

    plt.show()

# Call the function to apply the Gray World algorithm
gray_world(image)

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

3. 算法优缺点

我们观察上述例子的可视化结果,可以看出基于灰色世界算法提供了比白色补丁算法更温和的结果。这主要是由于灰色平均颜色的假设,它并没有完美地将问号块转换为黄色,但红色、蓝色、白色、黑色和棕色得到了正确的增强。

针对上述实现,可以总结出该算法的优点归纳如下:

  • 简单且计算高效。
  • 假设图像的平均颜色为灰色,这通常是一般场景的合理性假设。

同时其缺点也可以归纳如下:

  • 可能对大面积存在的单一主色较为敏感,导致颜色平衡算法无法正常工作。
  • 假设图像的平均颜色应该是灰色,这种假设可能并不总是正确的。

4. Ground Truth Algorithm

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

代码实现如下:

def ground_truth(image, img_patch, mode='mean'):
    """
    Returns a plot comparison of original and corrected/white balanced image 
    using the Ground Truth algorithm.

    Parameters
    ----------
    image : numpy array
            Image to process using ground truth algorithm
    img_patch : numpy array
                Reference image patch
    mode : string, optional
           Calculation mode, either 'mean' or 'max'
    """
    if mode == 'mean':
        image_gt = ((image * (img_patch.mean() / image.mean(axis=(0, 1)))).clip(0, 255).astype(int))
    if mode == 'max':
        image_gt = ((image * 1.0 / img_patch.max(axis=(0, 1))).clip(0, 1))

    # Exclude alpha or opacity channel (transparency)
    if image.shape[2] == 4:
        image_gt[:, :, 3] = 255

    # Plot the comparison between the original and ground truth corrected images
    fig, ax = plt.subplots(1, 2, figsize=(14, 10))
    ax[0].imshow(image)
    ax[0].set_title('Original Image')
    ax[0].axis('off')

    ax[1].imshow(image_gt)
    ax[1].set_title('Ground Truth Corrected Image')
    ax[1].axis('off')

    plt.show()

5. 挑选参考色块

一般来说,考虑到在正常光线下,问号块看起来是这样的:
在这里插入图片描述

接着,我们挑选问号内的任何正方形块的颜色作为该算法的图像补丁(下图红色矩形框):

from matplotlib.patches import Rectangle
fig, ax = plt.subplots(figsize=(10,10))
ax.set_title('Reference patch in red square')
ax.imshow(image)
ax.add_patch(Rectangle((1800, 800), 50, 50, edgecolor='r', facecolor='none'));

效果如下:
在这里插入图片描述

6. 算法效果

有了上述参考色块,我们可以调用上述实现的ground_truth函数,参考代码如下:

# To visualize the specific reference patch
img_patch = image[3845:3865, 1820:1840]
# Call the function to apply the Ground Truth algorithm
ground_truth(image, img_patch, mode='mean')

得到结果如下:
在这里插入图片描述
使用白色灯光色块作为参考补丁会导致图像看起来过于明亮。这是因为算法试图根据参考补丁的颜色来调整颜色平衡映射关系。如果参考补丁是明亮的源,则算法可能会过度补偿,导致具有褪色颜色的明亮图像,如在上述示例中显而易见的。

7. 其他效果

为了更加充分的展示 Ground Truth Algorithm的效果,这里我们选择鞋子色块作为我们的参考图像补丁,样例代码如下:

# To visualize the specific reference patch
img_patch = image[3845:3865, 1820:1840]
imshow(img_patch);
# Call the function to apply the Ground Truth algorithm
ground_truth(image, img_patch, mode='mean')

补丁展示如下:
在这里插入图片描述

白平衡后的效果如下:
在这里插入图片描述

可以看到白平衡处理后的效果和参考色块整体色调基本保持一致。

8. 总结

最后的最后,我们对本系列讲解白平衡算法的三种效果进行汇总,结果如下:
在这里插入图片描述

本文所介绍的三种白平衡算法都矫正了图像中的颜色投射关系,最终,算法的选择取决于应用程序的具体要求和假设。一般来说,White PatchGray world算法适用于通用颜色校正,而Ground Truth算法非常适合有参考白色补丁的专业应用。

您学废了嘛?

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【N32L40X】学习笔记11-ADC规则通道采集+dma数据传输

ADC规则通道转换 概述 支持 1 个 ADC,支持单端输入和差分输入,最多可测量 16 个外部和 3 个内部源。支持 12 位、10 位、8 位、6 位分辨率。ADC 时钟源分为工作时钟源、采样时钟源和计时时钟源 仅可配置 AHB_CLK 作为工作时钟源。可配置 PLL 作为采样时…

【大数据之Flume】三、Flume进阶之Flume Agent 内部原理和拓扑结构

1 Flume事务 2 Flume Agent 内部原理 重要组件: 1、ChannelSelector(选择器)   ChannelSelector 的作用就是选出 Event 将要被发往哪个 Channel。   (1)Replicating ChannelSelector(复制或副本&#x…

【面试题】芯片中的IR drop现象是什么?

这里是尼德兰的喵芯片面试相关文章,欢迎您的访问! 如果文章对您有所帮助,期待您的点赞收藏,也欢迎您对文中存在的问题和疑惑进行评论 此外,gitee仓库尼德兰的喵 (gjm9999) - Gitee.com与微信公众平台也期待您的访问 让我们一起为芯片前端全栈工程师而努力!!!! 今天突然…

C++模拟实现stack

1.前言 stack 遵循的原则是先进后出,那到底是用list 还是 vector呢?其实都可以,但是队列queue就不一样了,他甚至不可以支付vector,因为效率太低了。 但是库里面用了一种新的类型,deque,它的实现…

实战项目——基于多设计模式下的同步异步日志系统

系列文章目录 1.项目介绍 2.相关技术补充 3.日志系统框架 4.代码设计 5.功能测试 6.性能测试 文章目录 目录 系列文章目录 1.项目介绍 2.相关技术补充 3.日志系统框架 4.代码设计 5.功能测试 6.性能测试 文章目录 前言 一、项目介绍 二、开发环境 三、核心技…

BTTES,2101505-88-6,是各种化学生物实验中生物偶联的理想选择

资料编辑|陕西新研博美生物科技有限公司小编MISSwu​ 规格单位:g |货期:按照具体的库存进行提供 | 纯度:95% PART1----​试剂描述: BTTES是铜(I)催化的叠氮化物-炔烃环加成(CuAAC&#x…

佰维存储面向旗舰智能手机推出UFS3.1高速闪存

手机“性能铁三角”——SoC、运行内存、闪存决定了一款手机的用户体验和定位,其中存储器性能和容量对用户体验的影响越来越大。 针对旗舰智能手机,佰维推出了UFS3.1高速闪存,写入速度最高可达1800MB/s,是上一代通用闪存存储的4倍以…

机器学习实战11-基于K-means算法的文本聚类分析,生成文本聚类后的文件

大家好,我是微学AI,今天给大家介绍机器学习实战11-基于K-means算法的文本聚类分析,生成文本聚类后的文件。文本聚类分析是NLP领域的一个核心任务,通过将相似的文本样本分组,可以帮助我们发现隐藏在文本数据中的模式和结…

springboot运行报错Failed to load ApplicationContext for xxx

Failed to load ApplicationContext for报错解决方法 报错Failed to load ApplicationContext for 报错Failed to load ApplicationContext for 网上找了一堆方法都尝试了还是没用 包括添加mapperScan,添加配置类 配置pom文件 [外链图片转存失败,源站可能有防盗链机…

前端技术搭建(动态图片)拖拽拼图!!(内含实现原理)

文章目录 前端技术搭建(动态图片)拖拽拼图(内含实现原理)导言功能介绍效果演示链接(觉得不错的,请一键三连嘤嘤嘤)项目目录页面搭建css样式设置工具函数游戏实现逻辑 开源地址总结 前端技术搭建(动态图片&a…

数据结构【排序】

第七章 排序 一、排序 1.定义:将无序的数排好序 ; 2.稳定性: Kᵢ和Kⱼ中,Kᵢ优先于Kⱼ那么在排序后的记录中仍然保持Kᵢ优先; 3.评价标准:执行时间和所需的辅助空间,其次是算法的稳定性&#xf…

不用科学操作!Google Play谷歌商店App下载使用小技巧,超详细指南

昨天文章发出后,有朋友在群里说,不如出个如何使用谷歌商店的教程。 注:谷歌商店、Google Play、Play商店均表示同一个APP,只是叫法不同而已。 我发现这是一个艰难的任务,受限于手机品牌及操作系统版本,即使…

【C语言】文件操作(二)

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃 目录 📌补充1.sprintf2.…

Android NDK工具使用

快速定位到NDK安装目录 打开你的 .bash_profile vim ~/.bash_profile 设置ndk的环境变量 ANDROID_HOME"/Users/xxxx/Library/Android/sdk" export NDK${PATH}:${ANDROID_HOME}/ndk/21.3.6528147 //这个就是你的快捷指令 alias ndkalias ndk${ANDROID_…

安装支持vs2019的MFC(解决MSBuild 错误 MSB8041、MSB8042)

安装支持MFC的vs2019(解决MSBuild 错误 MSB8041、MSB8042) 常用安装选项解决MSBuild 错误 常用安装选项 解决MSBuild 错误 安装上述勾选内容后,即可解决MSBuild 错误 MSB8041 MSB8041:此项目需要 MFC/ATL 库。 https://learn.mic…

力扣算法 704 35 34 69 367二分查找

704.二分查找 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。 二分查找法 class Solution { public:int search(vecto…

Langchain 和 Chroma 的集成

Langchain 和 Chroma 的集成 1. Chroma2. 基本示例​3. 基本示例(包括保存到磁盘)4. 将 Chroma Client 传递到 Langchain ​5. 基本示例(使用 Docker 容器)6. 更新和删除7. 带分数的相似性搜索​ 1. Chroma Chroma 是一个人工智能原生开源矢量数据库,专注于开发人员…

Linux Ubuntu crontab 添加错误 提示:no crontab for root - using an empty one 888

资料 错误提示: no crontab for root - using an empty one 888 原因剖析: 第一次使用crontab -e 命令时会让我们选择编辑器,很多人会不小心选择默认的nano(不好用),或则提示no crontab for root - usin…

数据库对象

二十、数据库对象-视图 二十一、数据库对象-索引 age字段没有索引,查找需要扫描全表: name字段做了唯一索引,查找一次: 二十二、数据库对象-事务 事务的隔离级别和问题:

HTML渐变效果:线性渐变与径向渐变详解

简介 在HTML中,你可以使用CSS来创建渐变效果,给元素添加丰富的背景样式。本文将详细介绍HTML中的渐变效果,并提供示例代码帮助你理解和应用。 线性渐变(Linear Gradient) 线性渐变通过沿一条直线给元素应用颜色的渐变效果。你可以定义起始点和结束点之间的颜色过渡方式。…