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

1. 引言

欢迎继续来到我们的图像处理系列,在这里我们将探讨白平衡的关键技术。如果大家曾经拍过一张看起来暗淡、褪色或颜色不自然的照片,那么此时大家就需要了解到白平衡技术的重要性。在本文中,我们将深入探讨白平衡的概念,并探索各种算法来提高图像的成像质量。
闲话少说,我们直接开始吧!

2. 定义

白平衡是一种用于校正由不同照明条件引起的图像中的颜色校正的技术。这是一个调整图像颜色对比度的过程,使白色看起来像白色,使黑色看起来像黑色。这对于确保图像中的颜色是准确的并且对人眼来说是自然的是非常重要的。

3. 加载样例图像

好的,按照惯例我们还是首先导入我们需要的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 pltimage = io.imread('qmark.png')
plt.figure(figsize=(10,10))
plt.title('Original Image')
plt.imshow(image)
plt.show()

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

4. 统计数据分析

为了分析图像中的统计信息,让我们使用以下函数:

def calc_color_overcast(image):# Calculate color overcast for each channelred_channel = image[:, :, 0]green_channel = image[:, :, 1]blue_channel = image[:, :, 2]# Create a dataframe to store the resultschannel_stats = pd.DataFrame(columns=['Mean', 'Std', 'Min', 'Median', 'P_80', 'P_90', 'P_99', 'Max'])# Compute and store the statistics for each color channelfor 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)p_90 = np.percentile(channel, 90)p_99 = np.percentile(channel, 99)maximum = np.max(channel)channel_stats.loc[name] = [mean, std, minimum, median, p_80, p_90, p_99, maximum]return channel_stats

得到结果如下:
在这里插入图片描述
从上面数据帧中的结果可以明显看出,图像中出现了蓝色伪影。仔细分析具有每个百分位数的最高平均值、中值都是蓝色通道最大。

5. White Patch Algorithm

白色补丁算法是图像处理中最常用的一种颜色平衡方法,旨在通过缩放颜色通道来校正图像中的颜色投射,从而使每个通道中最亮的像素变为白色。这是通过假设图像中最亮的像素是白色来实现的。

相应的代码实现如下:

def white_patch(image, percentile=100):"""Returns a plot comparison of original and corrected/white balanced image using 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('qmark.png')# Call the function to implement white patch algorithm
white_patch(image, 100)

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

为了解决上述问题,我们可以将像素值的较低百分位数视为最大值,而不是绝对最大值。因此,让我们尝试下85百分位:

white_patch(image, 85)

结果如下:
在这里插入图片描述
使用第85个百分位正确地改善了图像的颜色。可以看到,以下颜色已正确分配:

问号块:黄色
马里奥帽子:红色
背包:棕色
鞋子:黑色和白色
墙壁:不同深浅的蓝色

6. 优缺点分析

我们接下来分析上述算法的优缺点,其有点可以总结如下:

  • 简单易用。
  • 可以有效地纠正具有主要白色区域或中性灰色区域的图像中的白平衡问题。
  • 当图像中有明显的明亮区域时,效果很好。

其缺点可以概括如下:

  • 假设图像中最亮的颜色是白色,这可能并不总是正确的。
  • 如果假设不成立,可能会导致过度校正,从而导致不自然的颜色或伪影。
  • 可能导致图像的某些区域出现颜色偏移或伪影。

7. 总结

本文重点介绍了使用White Patch Algorithm进行白平衡进而改善图像成像质量的算法细节,并总结了该算法的优缺点并给出了相应的代码示例。

您学废了嘛?

参考

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

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

相关文章

idea+springboot+jpa+maven+jquery+mysql进销存管理系统源码

ideaspringbootjpamavenjquerymysql进销存管理系统 一、系统介绍1.环境配置 二、系统展示1. 管理员登录2.首页3.采购订单4.收货入库5. 采购退货6. 商品入库7. 商品出库8. 库存查询9.商品移库10.库存盘点11.销售订单12.发货出库13.销售退货14.商品查询15. 供应商查询16.客户查询…

微信小程序将接口返回的文件流预览导出Excel文件并转发

把接口url替换就可以用了 exportExcel () {wx.request({url: importMyApply, //这个地方是你获取二进制流的接口地址method: POST,responseType: "arraybuffer", //特别注意的是此处是请求文件流必须加上的属性,不然你导出到手机上的时候打不开&#xff…

Jetson Orin Nano 平台适配IMX585 camera驱动调试记录

1. 前言 Jetson Orin Nano Devkit适配imx585 camera 使用argus_camera捕获流,图片是黑色的 用示波器来测量mipi信号,信号正常 Jetpack版本: sensor参数: dts配置: mode0 { /* */ mclk_khz = “24000”; num_lanes = “4”; tegra_sinterface = “serial_c”; ph…

“VCMessage”任务意外失败

从网上查到很多都是说设置这个位置,但是我的已经是对的,还是出现 “VCMessage”任务意外失败这个错误。 又查到一个人说解决方法是更正OutputPath或从父级继承:右键单击项目,然后转到"属性">"链接器">"常规&q…

mac brew安装 node 踩坑日记- n切换node不生效

最近用了一个旧电脑开发,发现里面node管理混乱,有nvm、n和homebrew,导致切换node 切换不了,开发也有莫名其妙的错误。所以我打算重新装一下node,使用n做为管理工具。 1. 删除nvm cd ~ rm -rf .nvm2. 删除n sudo rm -…

GAMS---典型优化模型和算法介绍、GAMS安装和介绍、GAMS程序编写、GAMS程序调试、实际应用算例演示与经验分享

优化分析是很多领域中都要面临的一个重要问题,求解优化问题的一般做法是:建立模型、编写算法、求解计算。常见的问题类型有线性规划、非线性规划、混合整数规划、混合整数非线性规划、二次规划等,优化算法包括人工智能算法和内点法等数学类优…

Vue移动端项目--瑞幸咖啡重构优化

来了客官,好久不见! 从年初开始,就有个想法,想着把之前做过的项目重新整理一下。毕竟今时不同往日,从现在的角度去看曾经做过的项目,倒是觉得有很多稚嫩的地方。毕竟无论做什么都是熟能生巧,由浅…

字符串 (2)--- 前缀函数与 KMP 算法

/* https://www.luogu.com.cn/problem/UVA455 最小周期&#xff1a; n - pi[n -1] */ #include <iostream> #include <string> #include <vector> using namespace std; vector<int> prefix_fun(string s) { int len s.length(); /…

深度学习——批标准化Batch Normalization

什么是批标准化&#xff1f; 批标准化&#xff08;Batch Normalization&#xff09;是深度学习中常用的一种技术&#xff0c;旨在加速神经网络的训练过程并提高模型的收敛速度。 批标准化通过在神经网络的每一层中对输入数据进行标准化来实现。具体而言&#xff0c;对于每个输…

Linux基本指令操作

登陆指令&#xff08;云服务器版&#xff09; 当我们获取公网IP地址后&#xff0c;我们就可以打开xshell。 此时会有这样的界面&#xff0c;我们若是想的登陆&#xff0c;则需要输入以下的指令 ssh 用户名公网IP地址 然后会跳出以下的窗口 接着输入密码——密码便是先前定好…

微服务安全简介

​由于其可扩展性、灵活性和敏捷性&#xff0c;微服务架构已经变得越来越受欢迎。然而&#xff0c;随着这种架构的分布和复杂性增加&#xff0c;确保强大的安全措施变得至关重要。微服务的安全性超越了传统的方法&#xff0c;需要采用全面的策略来保护免受不断演变的威胁和漏洞…

Promise 讲解,js知识,es6

文章目录 一、Promise的三种状态1. 初始态pending2. 成功态fulfilled&#xff0c;调用resolve方法3. 失败态rejected&#xff0c;调用reject方法 二、Promise的方法then方法catch方法 三、async和awaitasync 函数await 表达式 四、代码举例帮助理解1、Promise的值通过then方法获…

在vsCode 中执行Electron 项目时,出现中文乱码问题

问题&#xff1a;vscode 中执行Electron 项目时&#xff0c;控制台出现乱码 解决方法&#xff1a; 在 terminal 修改编码格式&#xff1a;65001代表UTF-8&#xff0c;936代表GBK

IC设计从业者必备的宝藏网站!

对于IC设计从业者而言&#xff0c;获取准确的学习资源&#xff0c;行业资讯直观重要&#xff0c;今日我们推荐ic行业专业的宝藏网站&#xff0c;希望对从业者有所帮助。 01-找开源项目的网站 GitHub除了Git代码仓库托管及基本的 Web管理界面以外&#xff0c;还提供了订阅、讨论…

用 Generative AI 构建企业专属的用户助手机器人

原文来源&#xff1a; https://tidb.net/blog/a9cdb8ec 关于作者&#xff1a;李粒&#xff0c;PingCAP PM TL;DR 本文介绍了如何用 Generative AI 构建一个使用企业专属知识库的用户助手机器人。除了使用业界常用的基于知识库的回答方法外&#xff0c;还尝试使用模型在 fe…

JAVA面试总结-Redis篇章(三)——缓存雪崩

JAVA面试总结-Redis篇章&#xff08;三&#xff09;——缓存雪崩

go性能分析工具之trace

参考文章&#xff1a; https://eddycjy.gitbook.io/golang/di-9-ke-gong-ju/go-tool-trace https://mp.weixin.qq.com/s__bizMzUxMDQxMDMyNg&mid2247484297&idx1&sn7a01fa4f454189fc3ccdb32a6e0d6897&scene21#wechat_redirect 你有没有考虑过&#xff0c;你的g…

0基础学习VR全景平台篇 第70篇:VR直播-如何设置付费观看、试看

对于拥有优质内容的VR直播&#xff0c;可以通过付费观看的方式进行内容变现&#xff0c;是当下非常流行的商业模式。 付费价格&#xff1e;0时便会自动弹出“试看时间”的设置项。试看时间&#xff1d;0秒时&#xff0c;用户进入直播间需要先付费才可观看&#xff1b;试看时间&…

Python中字符串拼接有哪些方法

目录 什么是字符串拼接 为什么要进行字符串拼接 Python中字符串拼接有哪些方法&#xff1f; 什么是字符串拼接 字符串拼接是将多个字符串连接在一起形成一个新的字符串的操作。在编程中&#xff0c;字符串拼接经常用于将不同的字符串组合在一起&#xff0c;以创建更长或更有…

勘探开发人工智能技术:地震层位解释

1 地震层位解释 层位解释是地震构造解释的重要内容&#xff0c;是根据目标层位的地震反射特征如振幅、相位、形态、连续性、特征组合等信息在地震数据体上进行追踪解释获得地震层位数据的方法。 1.1 地震信号、层位与断层 图1.1 所示为地震信号采集的过程&#xff0c;地面炮…