打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

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

重磅干货,第一时间送达

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

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

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

  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扩展模块中文版教程
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
使用颜色空间进行图像分割
Python的图像处理
Open3d学习计划—6(RGBD图像)
如何在机器学习中应用图像处理以及使用相对于的技术
好玩的OpenCV:图像操作的基本知识(2)
python+opencv图像处理(八)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服