文章目录
概要
随着数字图像处理技术的不断发展,白平衡算法成为了图像处理中一个关键的环节。白平衡的目标是校正图像中的颜色偏差,使得白色在图像中呈现真实的白色,从而提高图像的质量。
常用的白平衡算法:White Patch、Gray World、和 Ground Truth 算法
White Patch算法:
White Patch算法基于假设:图像中存在一个最亮的区域,该区域应该是白色的。该算法通过检测图像中最亮的区域并调整整个图像的色调来实现白平衡。White Patch算法适用于通用颜色校正,因为它相对简单且在许多情况下表现良好。
Gray World算法:
Gray World算法假设图像中的平均颜色应该是灰色的,通过调整图像的色调来使平均颜色趋近于灰色。这种算法对于一些场景中的光照条件变化较大的图像表现较好,适用于通用颜色校正。它在实现上相对简单,计算量也较小。
Ground Truth算法:
Ground Truth算法是一种专业应用的白平衡算法,它依赖于图像中有参考白色补丁的信息。通过分析这些参考白色补丁的颜色信息,算法可以更准确地进行白平衡校正。这种算法适用于对颜色要求较高、有参考标准的专业应用,例如医学影像、卫星图像等领域。
Gray-world Algotithm
灰色世界算法是一种白平衡算法,其原理基于假设图像的平均颜色应该是灰色的。在实现中,算法首先计算图像的平均亮度以及每个颜色通道的平均亮度。然后,通过计算亮度比例,对每个颜色通道进行相应的调整,以校正颜色映射关系。最终,通过灰色世界校正,图像呈现更为真实和自然的颜色。
该算法对于一些场景中光照条件变化较大的图像表现较好,是一种简单而有效的白平衡方法。通过调整图像的颜色映射关系,灰色世界算法能够提高图像的色彩准确性,使得图像更符合人眼感知的自然色彩。
bash
import cv2
import matplotlib.pyplot as plt
def gray_world(image_path):
# 读取图像
image = cv2.imread(image_path)
# 转换图像颜色通道顺序(OpenCV使用BGR,而matplotlib使用RGB)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# 计算图像的平均亮度
avg_brightness = image.mean()
# 计算每个颜色通道的平均亮度
avg_channel_brightness = image.mean(axis=(0, 1))
# 计算亮度比例,并相应地调整每个颜色通道
image_grayworld = ((image * (avg_brightness / avg_channel_brightness)).clip(0, 255).astype(int))
# 绘制原始图像和灰色世界校正后的对比图
fig, ax = plt.subplots(1, 2, figsize=(14, 10))
ax[0].imshow(image)
ax[0].set_title('原始图像')
ax[0].axis('off')
ax[1].imshow(image_grayworld)
ax[1].set_title('灰色世界校正后的图像')
ax[1].axis('off')
plt.show()
# 调用函数应用灰色世界算法
# Use a raw string for the file path
gray_world('4444.png')
对于灰色世界算法,以下是其优缺点的总结:
优点:
简单且计算高效: 灰色世界算法是一种简单直观的颜色校正方法,计算过程相对高效。
合理性假设: 算法基于图像的平均颜色应该是灰色的合理性假设。在许多场景中,这个假设是成立的,因为在典型的场景中,整体色调趋于中性。
缺点:
对单一主色敏感: 该算法可能对大面积存在的单一主色较为敏感,导致颜色平衡算法无法正常工作。如果图像中存在大块的单一颜色,算法可能会偏向调整其他颜色,而对这个主色不敏感。
不总是正确的假设: 灰色世界算法的核心假设是图像的平均颜色应该是灰色的,然而,在某些场景中,这个假设并不总是正确的。例如,如果图像中有很强的色调偏移或特殊照明条件,灰色世界算法可能产生不理想的结果。
Ground Truth Algorithm
接着我们来介绍最后一种白平衡常用的算法 Ground Truth Algorithm,该算法需要图像中已知对象的颜色作为参考色。它根据此参考色来调整颜色通道以更正颜色投射关系
bash
import cv2
import matplotlib.pyplot as plt
from matplotlib.patches import Rectangle
def ground_truth(image, img_patch, mode='mean'):
# 使用均值或最大值来进行颜色校正
if mode == 'mean':
image_gt = ((image * (img_patch.mean() / image.mean(axis=(0, 1)))).clip(0, 255).astype(int))
elif mode == 'max':
image_gt = ((image * 1.0 / img_patch.max(axis=(0, 1))).clip(0, 1))
else:
raise ValueError("Invalid mode. Use 'mean' or 'max'.")
# 绘制原始图像和Ground Truth校正后的对比图
fig, ax = plt.subplots(1, 2, figsize=(14, 10))
ax[0].imshow(image)
ax[0].set_title('原始图像')
ax[0].axis('off')
ax[1].imshow(image_gt)
ax[1].set_title('Ground Truth校正后的图像')
ax[1].axis('off')
plt.show()
# 读取图像
image = cv2.imread('4444.png')
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# 选择参考色块的区域
img_patch = image[800:850, 1800:1850, :]
# 显示图像和参考色块的矩形框
fig, ax = plt.subplots(figsize=(10, 10))
ax.set_title('参考块在红色矩形框内')
ax.imshow(image)
ax.add_patch(Rectangle((1800, 800), 50, 50, edgecolor='r', facecolor='none'))
# 调用 Ground Truth Algorithm
ground_truth(image, img_patch, mode='mean')
结论:
三种白平衡算法各有优劣,选择适当的算法取决于应用场景的具体需求和假设。White Patch和Gray World算法适用于通用颜色校正,而Ground Truth算法更适合专业领域,特别是需要高精度白平衡的场景。在实际应用中,根据图像的特性和应用要求选择合适的白平衡算法,有助于提高图像质量和信息准确性