【问题标题】:OpenCV: How to normalize face (remove shadow)?OpenCV:如何标准化面部(去除阴影)?
【发布时间】:2020-07-31 06:48:23
【问题描述】:

是否可以使用计算机视觉算法对人脸进行归一化(去除阴影)?

这是示例图片:

这是cv2.equalizeHist 的结果:

这是cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8)) 的结果:

这是cv2.createCLAHEclipLimit=2.0tileGridSize=[1, 2, 4, 8, 16, 32] 的图像网格:

这是cv2.createCLAHEclipLimit=[1, 2, 4, 8, 16, 32]tileGridSize=(8, 8) 的图像网格:

这是使用gamma = 0.6 进行伽马校正的结果:

这里是使用gamma = [0.2, 0.4, 0.6, 0.8, 1.0] 进行伽马校正的图像网格:

这里是重现的代码:

def method_v1(img):
    img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    res = cv2.equalizeHist(img)

    img = np.hstack([img, res])

    return img


def method_v2(img):
    img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    # Less 'clipLimit' value less effect
    clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
    res = clahe.apply(img)

    img = np.hstack([img, res])

    return img


def method_v3(img):
    img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    gamma = 0.6
    res = np.power((img / 255.0), gamma) * 255
    res = np.clip(res, 0, 255).astype(np.uint8)

    img = np.hstack([img, res])

    return img


def create_clahe_grid_v1(img):
    img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    grid_size = [1, 2, 4, 8, 16, 32]

    res_list = []
    res_list.append(img)
    for sz in grid_size:
        clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(sz, sz))
        res = clahe.apply(img)
        res_list.append(res)

    img = np.hstack(res_list)

    return img


def create_clahe_grid_v2(img):
    img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    clip_limit = [1, 2, 4, 8, 16, 32]

    res_list = []
    res_list.append(img)
    for cl in clip_limit:
        clahe = cv2.createCLAHE(clipLimit=cl, tileGridSize=(8, 8))
        res = clahe.apply(img)
        res_list.append(res)

    img = np.hstack(res_list)

    return img


def create_gamma_correction_grid_v1(img):
    img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    res_list = []
    res_list.append(img)
    gamma_list = [0.2, 0.4, 0.6, 0.8, 1.0] # lighter
    #gamma_list = [1.2, 1.4, 1.6, 1.8, 2.0] # darker
    for gamma in gamma_list:
        res = np.power((img / 255.0), gamma) * 255
        res = np.clip(res, 0, 255).astype(np.uint8)
        res_list.append(res)

    img = np.hstack(res_list)

    return img

到目前为止,Gamma 校正看起来最好,但它显然无法去除阴影,因为它只是像素级非线性过滤器。还有其他值得尝试的计算机视觉算法吗?

【问题讨论】:

    标签: python opencv computer-vision


    【解决方案1】:

    您可以考虑在 Python/OpenCV 中进行除法归一化

    • 读取输入
    • 转换为灰度
    • 高斯模糊
    • 保存结果

    输入:

    import cv2
    import numpy as np
    
    # read the image
    img = cv2.imread('face_shaded.png')
    
    # convert to gray
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    
    # blur
    smooth = cv2.GaussianBlur(gray, (95,95), 0)
    
    # divide gray by morphology image
    division = cv2.divide(gray, smooth, scale=192)
    
    # save results
    cv2.imwrite('face_shaded_division.jpg',division)
    
    # show results
    cv2.imshow('smooth', smooth)  
    cv2.imshow('division', division)  
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    结果:

    根据您的整体亮度调整比例值 (192)。

    根据您的应用,您可能还需要减去均值并除以除法归一化结果的标准差。

    【讨论】:

      【解决方案2】:

      我不确定你是否会接受,但 10 年前,Tan 和 Triggs(HoG 的创建者)设计了一种光度测量方法,用于消除 face 上的任何闪电效应。

      不幸的是,他们在Matlab 中设计了代码。因此,我将在matlab 中展示示例。

      I = imread('hZLne.png');
      
      if size(I, 3) == 3
          ı = rgb2gray(I);
      end
      
      y = tantriggs(I);
      
      imshow(y)
      

      输出:

      这对全黑图像最有效。

      【讨论】:

      • 需要python中的例子
      猜你喜欢
      • 2016-05-05
      • 2018-05-24
      • 2012-10-28
      • 1970-01-01
      • 1970-01-01
      • 2020-07-14
      • 1970-01-01
      • 2012-09-21
      • 1970-01-01
      相关资源
      最近更新 更多