白平衡(White Balance) 是图像处理和摄影中的一种技术,旨在消除由于光源色温差异导致的颜色偏差,使得图像中的白色和其他颜色呈现出自然、真实的效果。
白平衡是调整图像中各个颜色通道(红色、绿色和蓝色)的亮度和色彩平衡,以消除由不同光源(如日光、白炽灯、荧光灯等)产生的色偏。其目的是让图像看起来像是在中性白光下拍摄的,从而确保图像中的白色看起来确实是白色,其他颜色也会显得更为自然。
**去除颜色偏差:**不同光源有不同的色温,这会影响图像的整体色调。白平衡的主要作用就是调整图像的色温,让白色看起来更接近自然白色,其他颜色看起来也更自然。
**提高图像的真实感:**通过正确的白平衡调整,图像中的色彩会更加真实,人物肤色也会更自然,物体的颜色更准确。
**创造特定的气氛和效果:**有时摄影师故意不进行白平衡校正,通过调整白平衡来创造特定的氛围。例如,偏蓝的色调给人一种冷峻的感觉,而偏红的色调可以让画面显得更温暖。
白平衡调整的目的是使图像中的色温达到理想的“白平衡”状态。通常的调整方法包括:
**自动白平衡(Auto White Balance, AWB):**现代相机和手机通常都具备自动白平衡功能,自动根据环境光源进行调整。
**预设模式:**许多相机提供一些常见的白平衡预设模式,如“阳光”、“阴天”、“白炽灯”、“荧光灯”等。这些模式适用于不同的光源场景。
**手动白平衡:**在一些专业相机中,可以通过手动设置色温值(以K为单位,如5000K、6500K等)来精确调节白平衡。
**自定义白平衡:**用户可以通过拍摄一张白色或灰色的卡片,或者通过相机提供的其他自定义方法来设置白平衡。
在数字图像处理中,白平衡通常是在后期处理中进行调整。例如,使用图像编辑软件(如Photoshop)或通过编程语言(如Python中的OpenCV库)来调整图像的色温和色偏,从而获得理想的颜色效果。
import cv2
import numpy as np
import matplotlib.pyplot as plt
def apply_white_balance(image):
# Convert the image to float32 for more precision in calculations
img_float = image.astype(np.float32) / 255.0
# Calculate the mean of each channel
r_mean = np.mean(img_float[:, :, 2])
g_mean = np.mean(img_float[:, :, 1])
b_mean = np.mean(img_float[:, :, 0])
# Calculate the average mean
avg = (r_mean + g_mean + b_mean) / 3.0
# Scale each channel to the average
img_float[:, :, 0] = img_float[:, :, 0] * (avg / b_mean) # Adjust Blue channel
img_float[:, :, 1] = img_float[:, :, 1] * (avg / g_mean) # Adjust Green channel
img_float[:, :, 2] = img_float[:, :, 2] * (avg / r_mean) # Adjust Red channel
# Clip values to ensure they are within the valid range [0, 1]
img_float = np.clip(img_float, 0, 1)
# Convert back to uint8
img_corrected = (img_float * 255).astype(np.uint8)
return img_corrected
# Load an image
image_path = 'your_image.jpg' # Replace with the path to your image
image = cv2.imread(image_path)
# Apply white balance
balanced_image = apply_white_balance(image)
# Display the original and balanced images
plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
plt.title('Original Image')
plt.axis('off')
plt.subplot(1, 2, 2)
plt.imshow(cv2.cvtColor(balanced_image, cv2.COLOR_BGR2RGB))
plt.title('White Balanced Image')
plt.axis('off')
plt.show()
此处用Python直接调用现有的库,难度并不大,后续作者会给出verilog代码的实现。