一、说明
这就是我们今天要说的——图像增强!图像增强由一组用于优化图像的技术组成。这样,图像在视觉上变得更容易被人类感知,这反过来将进一步促进改进的图像处理分析。图像增强处理技术包括以下几种:
-
傅里叶变换
-
白平衡
-
直方图操作
对于本文,讨论将围绕在 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图像的选择。因此,通过可视化您想要获得的增强图像类型来明智地选择补丁。
继续发布我的下一个更新!下次见。