色彩平衡
本教程展示了如何通过循环拍摄白色表面(一张纸、墙壁或类似物)的图像来调节2D图像的颜色平衡。

首先连接相机。
然后循环捕获图像自动调整增益、曝光时间和光圈等2D采集设置。目标是使平均RGB值的最大值达到定义限制内的值。
然后我们捕获图像并显示它。
然后我们运行标定算法,通过循环拍摄白色表面(一张纸、墙壁或类似物)的图像来调节RGB图像的颜色平衡。
以下是实现该功能的算法示例。
def _color_balance_calibration(camera: zivid.Camera, settings_2d: zivid.Settings2D) -> Tuple[float, float, float]:
"""Balance color for RGB image by taking images of white surface (piece of paper, wall, etc.) in a loop.
Args:
camera: Zivid camera
settings_2d: 2D capture settings
Returns:
corrected_red_balance: Corrected red balance
corrected_green_balance: Corrected green balance
corrected_blue_balance: Corrected blue balance
"""
print("Starting color balance calibration")
corrected_red_balance = 1.0
corrected_green_balance = 1.0
corrected_blue_balance = 1.0
saturated = False
while True:
settings_2d.processing.color.balance.red = corrected_red_balance
settings_2d.processing.color.balance.green = corrected_green_balance
settings_2d.processing.color.balance.blue = corrected_blue_balance
rgba = camera.capture(settings_2d).image_rgba().copy_data()
mean_color = _compute_mean_rgb(rgba[:, :, 0:3], 100)
print(" Mean color values:")
print(f" R: {int(mean_color.red)}")
print(f" G: {int(mean_color.green)}")
print(f" B: {int(mean_color.blue)}")
if int(mean_color.green) == int(mean_color.red) and int(mean_color.green) == int(mean_color.blue):
print("Color balance successful")
break
if saturated is True:
print("Color balance incomplete - the range limits of color balance parameters have been reached")
break
max_color = max(float(mean_color.red), float(mean_color.green), float(mean_color.blue))
corrected_red_balance = np.clip(settings_2d.processing.color.balance.red * max_color / mean_color.red, 1, 8)
corrected_green_balance = np.clip(
settings_2d.processing.color.balance.green * max_color / mean_color.green, 1, 8
)
corrected_blue_balance = np.clip(settings_2d.processing.color.balance.blue * max_color / mean_color.blue, 1, 8)
corrected_values = [corrected_red_balance, corrected_green_balance, corrected_blue_balance]
if 1.0 in corrected_values or 8.0 in corrected_values:
saturated = True
print("Color balance:")
print(f" Red: {corrected_red_balance}")
print(f" Green: {corrected_green_balance}")
print(f" Blue: {corrected_blue_balance}")
return (corrected_red_balance, corrected_green_balance, corrected_blue_balance)
最后,我们使用该色彩平衡设置重新捕获图像并显示它。
settings_2d.processing.color.balance.red = red_balance
settings_2d.processing.color.balance.green = green_balance
settings_2d.processing.color.balance.blue = blue_balance
rgba_balanced = camera.capture(settings_2d).image_rgba().copy_data()
display_rgb(rgba_balanced[:, :, 0:3], title="RGB image after color balance", block=True)
下图显示了应用色彩平衡前后的彩色图像。
