【图像处理】图像白平衡处理

news2024/9/25 15:29:04

一、说明

        这就是我们今天要说的——图像增强!图像增强由一组用于优化图像的技术组成。这样,图像在视觉上变得更容易被人类感知,这反过来将进一步促进改进的图像处理分析。图像增强处理技术包括以下几种:

  1. 傅里叶变换

  2. 白平衡

  3. 直方图操作

        对于本文,讨论将围绕在 Python 中使用各种白平衡算法进行图像增强展开。但在其他任何事情之前,让我们记下向前推进的基本库。

import numpy as np
import matplotlib.pyplot as plt
from skimage.io import imread, imshow

二、关于白平衡

        首先,什么是白平衡(WB)?这是一个消除不真实色偏的色彩校正过程,因此在您想要的图像中,人看起来是白色的物体可以正确地呈现为白色。我们将实施三种白平衡技术,它们是:

  • 白补丁算法
  • 灰色世界算法
  • 真值算法

        为了便于说明,我们将使用下图:

2.1 白补丁算法

        这种方法是 Color Constancy adaptation 的典型方法,它搜索最亮的色块用作白色参考,类似于人类视觉系统的工作方式。请注意,要在图像中观察到白色,RGB 颜色空间中的每个通道都应处于最大值。

        Python中的代码实现:

def white_patch(image, percentile=100):    """
    White balance image using White patch algorithm    Parameters
    ----------
    image : numpy array
            Image to white balance
    percentile : integer, optional
                  Percentile value to consider as channel maximum    Returns
    -------
    image_wb : numpy array
               White-balanced image    """    white_patch_image = img_as_ubyte((image*1.0 / 
                                   np.percentile(image,percentile,
                                   axis=(0, 1))).clip(0, 1))    return white_patch_image#call the function to implement white patch algorithmskio.imshow(white_patch(lily, 85))

        使用白补丁算法增强百合

        正如所观察到的,可以看到图像变得相对明亮,中间的百合花变得非常鲜艳。这就是白色补丁算法如何增强我们的形象。现在,让我们看看下一个算法。

2.2 灰度图算法

        灰度世界算法是一种白平衡方法,它假设您的图像平均为中性灰色。如果图像中的颜色分布良好,则灰色世界假设成立。考虑到这个假设是正确的,平均反射颜色被假设为光的颜色。因此,我们可以通过查看平均颜色并将其与灰色进行比较来估计照明偏色。

        Python中的代码实现:

def gray_world(image):    """
    White balance image using Gray-world algorithm    Parameters
    ----------    image : numpy array
            Image to white balance
    
    Returns
    -------    image_wb : numpy array   
               White-balanced image    """
    image_grayworld = ((image * (access.mean() / 
                      image.mean(axis=(0,1)))).
                      clip(0,255).astype(int))    # for images having a transparency channel
    
    if image.shape[2] == 4:
    image_grayworld[:,:,3] = 255    return image_grayworld#call the function to implement gray world algorithmskio.imshow(gray_world(lily))

        使用灰色世界算法增强百合

        看到图像,可以观察到它与原始图像没有太大偏差。原因之一可能是平均颜色及其与灰色的比较并不那么重要。那么让我们看看最后一个算法。

2.3 真值算法

        到目前为止,我们已经对色彩空间在图像上的表现做出了假设。现在,我们将选择一个补丁(图像的一部分)并使用该补丁重新创建我们想要的图像,而不是为增强我们的图像做出假设。

        为这张图片选择的补丁是你可以在下面看到的那个:

from matplotlib.patches import Rectanglefig, ax = plt.subplots()
ax.imshow(lily)
ax.add_patch(Rectangle((650, 550), 100, 100, edgecolor='b', facecolor='none'));

        补丁(包含在蓝色边界框内)

2.4 贴片的放大图像

        选择补丁后,我们现在将继续增强我们的形象。为此,我们可以通过两种方式做到这一点:

  •         MAX 方法——将原始图像的每个通道归一化为区域每个通道的最大值
  •         MEAN 方法——将原始图像的每个通道归一化为区域每个通道的平均值

        Python中的代码实现:

def ground_truth(image, patch, mode='mean'):      """
   White balance image using Ground-truth algorithm   Parameters
   ----------   image : numpy array
           Image to white balancr
   patch : numpy array
           Patch of "true" white
   mode : mean or max, optional
          Adjust mean or max of each channel to match patch
  
   Returns
   -------
   
   image_wb : numpy array
              White-balanced image   """   image_patch = img_patch   if mode == 'mean':
       image_gt = ((image * (image_patch.mean() / \
                   image.mean(axis=(0, 1))))\
                   .clip(0, 255)\
                   .astype(int))   if mode == 'max':
       image_gt = ((image * 1.0 / image_patch.max(axis
                    (0,1))).clip(0, 1))   #transparency channel   if image.shape[2] == 4:
       image_gt[:,:,3] = 255return image_gt

1)  两种模式的输出使用最大方法

skio.imshow(ground_truth(lily, img_patch, 'max'))

2) 使用 Ground Truth 算法增强图像(MAX 模式)

        除了生动地强调百合之外,还可以观察到花朵周围的睡莲叶也得到了增强。绿色通道被大大突出。让我们看看这与使用均值作为模式有何不同。

        使用均值方法:

skio.imshow(ground_truth(lily, img_patch, 'mean'))

3) 使用 Ground Truth 算法增强图像(MEAN 模式)

        输出稍微接近白色补丁输出,但后者更亮。它还强调了百合的颜色,但它没有突出垫子的颜色,而是使它变亮了。

        对于ground truth算法,输出图像在很大程度上取决于patch图像的选择。因此,通过可视化您想要获得的增强图像类型来明智地选择补丁。

       继续发布我的下一个更新!下次见。

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

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

相关文章

python开发的连连看小游戏

说明: 1.在网上找了一个基础版本改进而来,大概增加了200行代码,相对原版要复杂了一些; 2.界面采用tkinter开发,比较简单; 3.新增了连接连功能; 4.新增了积分功能; 5.新增了陷入…

python套接字(一):socket的使用

文章目录 前言一、什么是套接字?二、python中套接字的常用方法三、使用1、服务器端代码2、客户端代码 前言 最近研究了一下python的socket的使用,特此记录下来,方便以后参考。 一、什么是套接字? 套接字(Socket),就…

线上展览平台平台有哪些?蛙色3D虚拟展厅平台简介

导语: 随着科技的飞速发展和全球化的趋势,线上展览平台正日益受到关注和重视。它们成为了传统展览方式的有力补充,为各行业提供了一个全新的展示和交流平台。 我们将一起探索当今主流的线上展览平台,并重点介绍蛙色3D虚拟展厅平台…

jmeter如何将上一个请求的结果作为下一个请求的参数

目录 1、简介 2、用途 3、下载、简单应用 4、如何将上一个请求的结果作为下一个请求的参数 1、简介 在JMeter中,可以通过使用变量来将上一个请求的结果作为下一个请求的参数传递。 ApacheJMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测…

网络安全(黑客)怎么自学?

最近看到很多问题,都是小白想要转行网络安全行业咨询学习路线和学习资料的,作为一个培训机构,学习路线和免费学习资料肯定是很多的。机构里面的不是顶级的黑阔大佬就是正在学习的同学,也用不上这些内容,每天都在某云盘…

Win10系统怎么设置滑动打开组合框?

Win10系统怎么设置滑动打开组合框?Win10系统戏中用户想要设置一下滑动打开组合框,但不知道怎么操作,用户需要打开Win10系统的高级系统设置选项,点击高级选项找到视觉效果选项,勾选滑动打开组合框选项保存即可。 解决方…

Unity入门3——脚本基础

一、生命周期函数 ​ 所有继承 MonoBehavior 的脚本,最终都会挂载到 GameObject 游戏对象上 ​ 生命周期函数就是该脚本对象依附的 GameObject 对象从出生到消亡整个生命周期中 ​ 会通过反射自动调用的一些特殊函数 ​ Unity 帮助我们记录了一个 GameObject 对象依…

OpenShift Route 的实现原理

OpenShift Route 的实现原理 OpenShift 如何使用 HAProxy 实现 Router 和 RouteRouter appHAProxy 配置1. HTTP2. HTTPS OpenShift 中的 Route 解决了从集群外部访问服务的需求,与 Kubernetes 中的 Ingress 类似。 OpenShift 中 Route 资源 API 定义如下&#xff1…

解剖学关键点检测方向论文翻译和精读:基于热力图回归的CNN融入空间配置实现关键点定位

解剖学关键点检测方向论文翻译和精读:Integrating spatial configuration into heatmap regression based CNNs for landmark localization Abstract: In many medical image analysis applications, only a limited amount of training data is available due to t…

Pyinstaller 打包 paddle出现的问题

目录 问题解决方法 1.找到自己项目所需要的包 2.使用【auto-py-to-exe】库,添加对应项目对应的包 --add-data 需要添加的文件 --hidden-import 需要添加的文件 问题来源 问题解决思路 问题解决方法 1.找到自己项目所需要的包 这里可以参考博主的另外一篇文章&…

大模型当私人法律顾问?北大团队推出法律大模型,数据与模型全部开源!

作者 | 小戏、Python “要是我有一个学法的朋友就好了” 法律作为我们社会生活的最高指引,其重要性毋庸多言。然而类似于医学,法律又是一个入行门槛非常高的专业领域,想想通过率不到 10% 的法考,显然遇到法律相关的专业问题不太支…

mysql中SQL语句查询字段相加的和,以及更改小数精确位。和查询SQL语句结果相减的SQL查询

最近在工作中碰到了SQL进行查询,用户缴费以及退费信息的工作,以及查询完后需要修改SQL结果后小数位的需求,整理结果如下: 首先,看内容: 如图,operate_type代表缴费与退费,分别用0和1区别。 #…

快速教你如何使用postman工具进行接口测试?(配置全局token、JWT可用)

现在很多人都在使用前后端分离进行项目开发,那在后端开发过程中使用postman测试工具可快速便捷完成接口测试。但是在测试过程中,很多人发现因为JWT的鉴权,导致半个小时就需要更新一下token,让我们的测试变得复杂。 若是将token作…

【JUC中的 “8锁现象” 】 —— 每天一点小知识

💧 J U C 中的“ 8 锁现象” \color{#FF1493}{JUC中的 “8锁现象” } JUC中的“8锁现象”💧 🌷 仰望天空,妳我亦是行人.✨ 🦄 个人主页——微风撞见云的博客🎐 🐳 《数据结构与算法》…

python基础学习3【NumPy矩阵与通用函数【矩阵相乘+平方+广播机制+转置】+ save、load、sort、repeat、unique、鸢尾花1】

NumPy矩阵与通用函数 a np.mat([[1,2],[3,4]])#生成矩阵b np.matrix([[1,7],[6,4]])np.bmat("a b") 矩阵的运算 矩阵特有属性: 属性 说明 T自身转置H共轭转置I逆矩阵A自身数据的二维数据视图 例如: np.matrix(a).T 矩阵相乘:…

【Map集合的基本功能】

Map集合的基本功能 V put(K key,V value):添加元素 V remove(K key,V value):根据键删除键值对元素 package com.gather.map; //Map集合常用的基本功能 import java.util.HashMap; import java.util.Map; public class MapDemo02 {public static void m…

Flutter:路由、拦截返回事件、自定义独立路由

路由堆栈 Flutter 路由管理中有两个非常重要的概念: Route:路由是应用程序页面的抽象,对应 Android 中 Activity 和 iOS 中的 ViewController,由 Navigator 管理。Navigator:Navigator 是一个组件,管理和…

哈希表--想彻底了解哈希表,看这一篇文章就可以了

为了一次存储便能得到所查记录,在记录的存储位置和它的关键字之间建立一个确定的对应关系H,已H(key)作为关键字为key的记录在表中的位置,这个对应关系H为哈希(Hash)函数, 按这个思路建立的表为哈…

【Leetcode】 1071. 字符串的最大公因子

For two strings s and t, we say “t divides s” if and only if s t ... t (i.e., t is concatenated with itself one or more times). Given two strings str1 and str2, return the largest string x such that x divides both str1 and str2. Example 1: Input: s…

开发改了接口,经常忘通知测试的解决方案!

目录 前言: Apifox解决方案 Apifox对此给出的解决方案是: 用Apifox怎么处理接口变更 接口代码实现逻辑修改 接口参数修改 前言: 在开发过程中,接口变动十分频繁,测试人员没有及时获得相关通知的情况也很普遍。这…