颜色空间的图像阴影检测与去除方法

Posted by Jinming Qiao on June 2, 2020

基于LAB 颜色空间的图像阴影检测与去除方法


期刊名称:《基于LAB 颜色空间的图像阴影检测与去除方法》

期刊作者:梁永侦,潘斌,郭小明,梁媛

毕业院校:辽宁石油化工大学计算机与通信工程学院


论文内容概要

  1. 介绍阴影分类中自阴影与投射阴影的相关概念与情况原理
  2. 分析基于LAB颜色空间的图像阴影检测与去除方法和相关理论
  3. 介绍一种均值偏移算法来对图像进行色彩分割算法方法
  4. 介绍实验测试结果与比对分析结果并对整体算法进行总述

阴影分类

  • 物体在没有强光直射的情况下,只有普通自然光照射而产生的自投影,称为自阴影
  • 物体在强光直射的情况下,背光一侧物体所投射的阴影较暗,且亮度远低于周围区域,称为投射阴影

方法原理

  1. LAB 颜色空间
    • LAB 颜色空间是指“颜色-对立”空间,表示彩色空间有3 个通道,其中L 表示亮度,A 和B 为颜色相异的另外2 个通道
    • L 通道取值范围是( 0,100) ,对应于从黑色到白色的不同阴影。A 通道取值范围是( -128, 127) ,表示绿色与红色的比率。B通道取值范围也是( -128,127) ,表示蓝色与黄色的比率
  2. 阴影检测
    • 场景图像中阴影区域的亮度远比周围环境亮度小,显示亮度较为阴暗,又因为L 通道表示的是 图像亮度信息,所以该阴影区域很容易就定位在L 通道中
    • 流程:
      1. 将单幅RGB 图像转换为等效的LAB 图像。
      2. 分别计算图像中L、A 和B在图像平面上颜色像素的平均值。
      3. 图像中存在较低值的L和B像素区域时,可将该像素分类为阴影区域像素,而其他像素为非阴影区域像素。
@staticmethod
def remove_shadows(org_image,
                   lab_adjustment=False,
                   region_adjustment_kernel_size=10,
                   shadow_dilation_iteration=5,
                   shadow_dilation_kernel_size=3,
                   verbose=False):

    # If the image is in BGRA color space, convert it to BGR
    if org_image.shape[2] == 4:
        org_image = cv.cvtColor(org_image, cv.COLOR_BGRA2BGR)
        converted_img = cv.cvtColor(org_image, cv.COLOR_BGR2LAB)
        # Used for constructing corrected image
        shadow_clear_img = np.copy(org_image)  
        # Calculate the mean values of A and B across all pixels
        means = [np.mean(converted_img[:, :, i]) for i in range(3)]
        thresholds = [means[i] - (np.std(converted_img[:, :, i]) / 3) for i in range(3)]

        # If mean is below 256 (which is I think the max value for a channel)
        # Apply threshold using only L
        if sum(means[1:]) <= 256:
            mask = cv.inRange(converted_img, (0, 0, 0), (thresholds[0], 256, 256))
            else:  # Else, also consider B channel
                mask = cv.inRange(converted_img, (0, 0, 0),
                                  (thresholds[0], 256, thresholds[2]))

                kernel_size = (region_adjustment_kernel_size, region_adjustment_kernel_size)
                kernel = cv.getStructuringElement(cv.MORPH_ELLIPSE, kernel_size)
                cv.morphologyEx(mask, cv.MORPH_CLOSE, kernel, mask)
                cv.morphologyEx(mask, cv.MORPH_OPEN, kernel, mask)

                # We need connected components
                # Initialize the labels of the blobs in our binary image
                labels = measure.label(mask)

阴影去除

  1. 色彩分割和色度匹配
    • 基于LAB 颜色空间,将颜色空间中的a* 和b* 定义为色度属性。根据均值偏移算法原理,通过对图像不同的颜色值分析,逐步将图像色彩进行分割处理。
  2. 重新整合
    • 通过分析和计算求取平均值,将阴影区域不同区段的色度值乘以适当的常数,使得各阴影区段与非阴影区段的平均色度值相匹配。
  3. 色度校正
    • 将去阴影区段分布不均的色度值重新乘以或除以适当的常数,以进一步缩小非阴影区域与去阴 影区域的色度差,从而达到校正整幅图像平均色度值相匹配的目的
  4. 边缘校正
    • 采用一种非线性平滑技术的中值滤波法来对图像进行边缘校正,以减少阴影区域与非阴影区域边界中的误差。

实验效果

  • 原图

  • 处理图