• 【OpenCV实现图像:用OpenCV图像处理技巧之白平衡算法】


    概要

    白平衡技术在摄影和图像处理中扮演着至关重要的角色。在不同的光照条件下,相机可能无法准确地捕捉到物体的真实颜色,导致图像呈现出暗淡、色调不自然或者褪色的效果。为了解决这个问题,我们需要了解和应用白平衡技术。

    白平衡的重要性

    在日常生活中,我们经常会遇到不同光源下拍摄的照片,比如在室内使用白炽灯、荧光灯,或者在室外阳光下拍摄。不同类型的光源会产生不同色温的光线,而相机可能无法自动适应这些光线的差异。这就导致了照片中的颜色看起来不真实,不符合我们的视觉感受。

    白平衡的原理

    白平衡技术的基本原理是通过调整图像中各个颜色通道的增益,使得图像中的灰度区域呈现出中性灰色。简单来说,就是让白色看起来像白色,黑色看起来像黑色。这样一来,不同光源下拍摄的图像就能更准确地还原物体的真实颜色。

    白平衡的调整方法

    预设白平衡模式: 相机通常提供了一些预设的白平衡模式,比如日光、阴天、荧光灯、白炽灯等。选择合适的预设模式可以在一定程度上改善图像的颜色偏差。
    
    手动白平衡: 在一些相机中,我们可以手动设置白平衡。这通常需要在拍摄场景中放置一个白色卡片,让相机通过这个参考物体来调整白平衡。
    
    后期处理: 在图像处理软件中,我们也可以进行白平衡的调整。通过调整图像的色温、色调和饱和度等参数,我们可以更精细地控制图像的颜色效果。
    
    • 1
    • 2
    • 3
    • 4
    • 5

    白平衡技术的应用

    白平衡技术不仅在摄影中应用广泛,在图像处理、广告设计、艺术创作等领域也有重要作用。在商品拍摄、人像摄影、风景摄影等各种场景中,合适的白平衡调整能够提高照片的质量,使其更具吸引力和真实感。

    白平衡是一项用于校正由不同照明条件引起的图像颜色偏差的技术。它通过调整图像的颜色对比度,使白色看起来像白色,使黑色看起来像黑色。这个过程非常重要,因为它确保了图像中的颜色是准确的,同时也使图像对人眼来说看起来更加自然。

    加载样例图像

    # 导入必要的Python库
    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    from skimage import io, img_as_ubyte
    from skimage.io import imread, imshow
    from matplotlib.patches import Rectangle
    
    # 加载样例图像
    from skimage import io
    import matplotlib.pyplot as plt
    
    # 读取图像文件
    image = io.imread(r'E:\yolo项目\Opencv-project-main\Opencv-project-main\CVZone\img.png')
    
    # 显示原始图像
    plt.figure(figsize=(10,10))
    plt.title('Original Image')  # 设置图像标题
    plt.imshow(image)  # 显示图像
    plt.show()  # 显示图像
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    结果:
    在这里插入图片描述

    统计数据分析

    # 导入必要的Python库
    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    from skimage import io, img_as_ubyte
    from skimage.io import imread, imshow
    from matplotlib.patches import Rectangle
    
    # 加载样例图像
    from skimage import io
    import matplotlib.pyplot as plt
    
    # 读取图像文件
    image = io.imread('qmark.png')
    
    # 显示原始图像
    plt.figure(figsize=(10,10))
    plt.title('Original Image')  # 设置图像标题
    plt.imshow(image)  # 显示图像
    plt.show()  # 显示图像
    
    # 分析图像中的统计信息
    def calc_color_overcast(image):
        # 计算每个通道的颜色偏差
        red_channel = image[:, :, 0]  # 红色通道
        green_channel = image[:, :, 1]  # 绿色通道
        blue_channel = image[:, :, 2]  # 蓝色通道
    
        # 创建一个DataFrame来存储结果
        channel_stats = pd.DataFrame(columns=['Mean', 'Std', 'Min', 'Median', 'P_80', 'P_90', 'P_99', 'Max'])
    
        # 计算并存储每个颜色通道的统计信息
        for channel, name in zip([red_channel, green_channel, blue_channel], ['Red', 'Green', 'Blue']):
            mean = np.mean(channel)  # 平均值
            std = np.std(channel)  # 标准差
            minimum = np.min(channel)  # 最小值
            median = np.median(channel)  # 中位数
            p_80 = np.percentile(channel, 80)  # 80th百分位数
            p_90 = np.percentile(channel, 90)  # 90th百分位数
            p_99 = np.percentile(channel, 99)  # 99th百分位数
            maximum = np.max(channel)  # 最大值
    
            # 将统计信息存储到DataFrame中
            channel_stats.loc[name] = [mean, std, minimum, median, p_80, p_90, p_99, maximum]
    
        return channel_stats
    # 计算颜色通道的统计信息
    channel_stats = calc_color_overcast(image)
    
    # 打印统计信息
    print(channel_stats)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51

    定义了一个函数 calc_color_overcast(image),该函数用于计算图像中每个颜色通道(红色、绿色、蓝色)的统计信息,包括均值、标准差、最小值、中位数、80th、90th、99th 百分位数以及最大值。这些信息对于分析图像的颜色特性非常有用。

    结果:
    在这里插入图片描述

    White Patch Algorithm

    白色补丁算法是图像处理中常用的一种颜色平衡方法。其目标是通过缩放图像的颜色通道,使得每个通道中最亮的像素变为白色。这一方法基于假设:图像中最亮的像素应当代表白色。通过调整每个通道的亮度,算法可以校正图像的颜色投射,实现图像的白平衡。

    # 导入必要的Python库
    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    from skimage import io, img_as_ubyte
    from skimage.io import imread, imshow
    from matplotlib.patches import Rectangle
    
    # 加载样例图像
    from skimage import io
    import matplotlib.pyplot as plt
    
    # 读取图像文件
    
    
    
    
    def white_patch(image, percentile=100):
        """
        Returns a plot comparison of original and corrected/white balanced image
        using the White Patch algorithm.
    
        Parameters
        ----------
        image : numpy array
                Image to process using white patch algorithm
        percentile : integer, optional
                      Percentile value to consider as channel maximum
        """
        white_patch_image = img_as_ubyte(
            (image * 1.0 / np.percentile(image,
                                         percentile,
                                         axis=(0, 1))).clip(0, 1))
        # Plot the comparison between the original and white patch corrected images
        fig, ax = plt.subplots(1, 2, figsize=(10, 10))
        ax[0].imshow(image)
        ax[0].set_title('Original Image')
        ax[0].axis('off')
    
        ax[1].imshow(white_patch_image, cmap='gray')
        ax[1].set_title('White Patch Corrected Image')
        ax[1].axis('off')
    
        plt.show()
    
    # Read the input image
    image = imread(r'E:\yolo项目\Opencv-project-main\Opencv-project-main\CVZone\img.png')
    
    # Call the function to implement white patch algorithm
    white_patch(image, 100)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50

    在这里插入图片描述
    使用默认参数percentile=100并没有明显改善图像,因为图像中RGB通道的最大值已经是[255, 255, 255]。通过观察前一章节中的统计信息,我们可以看到RGB通道的最大值和99百分位数都是255。

    为了解决这个问题,我们可以考虑将像素值的较低百分位数视为最大值,而不是绝对的最大值。

    white_patch(image, 85)
    
    
    • 1
    • 2

    结果:
    在这里插入图片描述

    小结

    优点:

    简单易用:白色补丁算法的实现相对简单,易于理解和操作。这使得它成为修复图像白平衡问题的一种便捷选择,尤其是对于那些不需要复杂操作的场景。
    
    针对特定场景有效:该算法在处理具有主要白色区域或中性灰色区域的图像时非常有效。特别是当图像中存在明显的明亮区域时,白色补丁算法可以显著地改善图像的色彩平衡问题,使图像更加清晰和自然。
    
    适用性广泛:白色补丁算法可以广泛应用于各种场景,包括摄影、图像处理等领域。它不仅适用于专业摄影师,也可以被普通用户用于简单的图像修复工作。
    
    • 1
    • 2
    • 3
    • 4
    • 5

    缺点:

    假设限制:算法的核心假设是图像中最亮的颜色是白色,然而,在实际场景中,图像中的最亮颜色可能是其他颜色。当这一假设不成立时,白色补丁算法的效果可能受到限制,无法完全修复图像的白平衡问题。
    
    过度校正风险:如果算法的假设不成立,可能会导致过度校正,使图像出现不自然的颜色或伪影。过度校正可能会引入新的问题,影响图像的质量和真实性。
    
    颜色偏移和伪影:由于算法的基本假设,即图像中最亮的区域是白色,可能会导致图像的某些区域出现颜色偏移或伪影。这种现象可能在图像的边缘或高光区域更为明显,影响整体视觉效果。在一些特殊场景下,这种颜色偏移和伪影可能会对图像的真实性产生负面影响。
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在使用白色补丁算法时,用户需要根据具体情况权衡其优点和缺点,确保选择合适的场景和图像以获得最佳的修复效果。

  • 相关阅读:
    1037 Magic Coupon
    ECCV 2022 | 悉尼大学提出:绝对尺度感知,鲁棒,以及可泛化的自监督单目深度估计网络DynaDepth
    【Python_PyQtGraph 学习笔记(八)】基于PyQtGraph将X轴坐标设置为系统时间
    Java面试时,该如何准备亮点?
    不忘初心
    详解 Java 19 中的记录类型的模式匹配
    Java内存模型(JMM)
    设计循环队列,解决假溢出问题
    ILS解析漏洞复现
    供应链解决方案SRM是什么?企业实施SRM有什么价值?
  • 原文地址:https://blog.csdn.net/weixin_47869094/article/details/134318645