白平衡——图像处理中的一种增强技术
点击上方“小白学视觉”,选择加"星标"或“置顶”
重磅干货,第一时间送达
俗话说,一张图胜过千言万语。但是,如果它传达的内容与我们想看的内容不符怎么办?我们确定它应该来自那个图像,但不幸的是它不是很明显。如果说,有可能从一幅图像中发现我们想要了解的背景,并且很可能在这一过程中获得一些额外的见解,那会怎么样?
这就是我们今天要讨论的——图像增强!
图像增强由一组用于细化图像的技术组成。通过这种方式,图像在视觉上更容易被人类感知,这反过来将进一步促进改进的图像处理分析。图像增强处理技术包括:
傅里叶变换
白平衡
直方图处理
对于这篇文章,讨论将围绕python中用于图像增强的各种白平衡算法的使用展开。但在此之前,让我们记录下基本库。
import numpy as np
import matplotlib.pyplot as plt
from skimage.io import imread, imshow
首先,什么是白平衡(WB)?这是一个消除不切实际的色偏的色彩校正过程,以便在我们想要的图像中正确呈现白色的物体。我们将实施三种白平衡技术,它们是:
白色补丁算法
灰度世界算法
地面真值算法
为了便于说明,我们将使用下图:
这种方法是一种典型的颜色恒定性适应方法,它搜索最亮的色块以用作白色参考,类似于人类视觉系统的做法。请注意,要在图像中观察到白色,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 algorithm
skio.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 algorithm
skio.imshow(gray_world(lily))
使用灰度世界算法增强百合
如图,可以看出它与原始图像并没有太大的偏差,其原因之一可能是平均颜色及其与灰色的比较并不那么显著,然后让我们看看最后一个算法。
到目前为止,我们已经对颜色空间在图像上的表现做了假设。现在,我们将选择一个补丁(图像的一部分)并使用该补丁重新创建我们想要的图像,而不是对增强图像做出假设。
为该图像选择的补丁程序如下所示:
from matplotlib.patches import Rectangle
fig, ax = plt.subplots()
ax.imshow(lily)
ax.add_patch(Rectangle((650, 550), 100, 100, edgecolor='b', facecolor='none'));
补丁(包含在蓝色边框中)
补丁的放大图像
选择补丁后,我们现在将继续增强我们的图像。为此,我们可以采用两种方式:
最大值方法— 将原始图像的每个通道归一化为该区域每个通道的最大值
平均值在方法— 将原始图像的每个通道归一化为该区域每个通道的平均值
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] = 255
return image_gt
让我们看看两种模式的输出。
使用最大值方法:
skio.imshow(ground_truth(lily, img_patch, 'max'))
使用地面真值算法增强图像(最大值模式)
除了生动地强调百合之外,还可以观察到花朵周围的浮叶也得到了增强,绿色通道被极大地突出显示。让我们看看这与使用均值作为模式有何不同。
使用平均值方法:
skio.imshow(ground_truth(lily, img_patch, 'mean'))
使用地面真值算法增强图像(平均值模式)
输出稍微接近白色补丁输出,但后者更亮。它还强调了百合花的颜色,但它没有突出浮叶的颜色,只是提亮了它。
对于地面真值算法,输出图像很大程度上取决于补丁图像的选择。因此,通过可视化我们想要获得什么样的增强图像来明智地选择补丁。
我们现在可以使用 3 种不同的方法来增强图像。
交流群
欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~