白平衡——图像处理中的一种增强技术

小白学视觉

共 4420字,需浏览 9分钟

 ·

2021-10-13 18:58

点击上方小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

俗话说,一张图胜过千言万语。是,如果它传达的内容与我们想看的内容不符怎么办?我们确定它应该来自那个图像,但不幸的是它不是很明显。如果说,有可能从一幅图像中发现我们想要了解的背景,并且很可能在这一过程中获得一些额外的见解,那会怎么样?


这就是我们今天要讨论的——图像增强!


图像增强由一组用于细化图像的技术组成。通过这种方式,图像在视觉上更容易被人类感知,这反过来将进一步促进改进的图像处理分析。图像增强处理技术包括:


  1. 傅里叶变换

  2. 白平衡

  3. 直方图处理


对于这篇文章,讨论将围绕python中用于图像增强的各种白平衡算法的使用展开。但在此之前,让我们记录下基本库。

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


首先,什么是白平衡(WB)?这是一个消除不切实际的色偏的色彩校正过程,以便在我们想要的图像中正确呈现白色的物体。我们将实施三种白平衡技术,它们是:


  1. 白色补丁算法

  2. 灰度世界算法

  3. 地面真值算法


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


白色补丁算法


这种方法是一种典型的颜色恒定性适应方法,它搜索最亮的色块以用作白色参考,类似于人类视觉系统的做法。请注意,要在图像中观察到白色,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))

使用白色补丁算法增强百合

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


灰度世界算法


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


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))

使用灰度世界算法增强百

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


地面真值算法


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


为该图像选择的补丁程序如下所示:

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

补丁(包含在蓝色边框中)

补丁的放大图像

选择补丁后,我们现在将继续增强我们的图像。为此,我们可以采用两种方式:


  1. 最大值方法— 将原始图像的每个通道归一化为该区域每个通道的最大值

  2. 平均值在方法— 将原始图像的每个通道归一化为该区域每个通道的平均值


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

让我们看看两种模式的输出。


使用最大值方法:

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

使用地面真值算法增强图像(最大值模式)

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


使用平均值方法:

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

使用地面真值算法增强图像(平均值模式)

输出稍微接近白色补丁输出,但后者更亮。它还强调了百合花的颜色,但它没有突出浮叶的颜色,只是提亮了它。


对于地面真值算法,输出图像很大程度上取决于补丁图像的选择。因此,通过可视化我们想要获得什么样的增强图像来明智地选择补丁。

我们现在可以使用 3 种不同的方法来增强图像。


下载1:OpenCV-Contrib扩展模块中文版教程
在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲
小白学视觉公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲
小白学视觉公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群


欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~


浏览 29
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报