You're viewing an old version of the documentation. Click here to see the latest release.

色彩平衡

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

相机朝向墙壁捕获图像来调节色彩平衡

首先连接相机。

camera = app.connect_camera()

然后循环捕获图像自动调整增益、曝光时间和光圈等2D采集设置。目标是使平均RGB值的最大值达到定义限制内的值。

settings_2d = _auto_settings_configuration(camera)

然后我们捕获图像并显示它。

rgba = camera.capture(settings_2d).image_rgba().copy_data()
display_rgb(rgba[:, :, 0:3], title="RGB image before color balance", block=False)

然后我们运行标定算法,通过循环拍摄白色表面(一张纸、墙壁或类似物)的图像来调节RGB图像的颜色平衡。

[red_balance, green_balance, blue_balance] = _color_balance_calibration(camera, settings_2d)

以下是实现该功能的算法示例。

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)

下图显示了应用色彩平衡前后的彩色图像。

色彩平衡:左侧为设置前图像,右侧为设置后图像