Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python OpenCV:如何规范化面(移除阴影)?_Python_Opencv_Computer Vision - Fatal编程技术网

Python OpenCV:如何规范化面(移除阴影)?

Python OpenCV:如何规范化面(移除阴影)?,python,opencv,computer-vision,Python,Opencv,Computer Vision,是否可以使用计算机视觉算法使面部正常化(去除阴影) 以下是示例图像: 以下是cv2.equalizeHist的结果: 下面是cv2.createCLAHE(clipLimit=2.0,tileGridSize=(8,8))的结果 以下是cv2.createCLAHE的图像网格,其中clipLimit=2.0和tileGridSize=[1,2,4,8,16,32]: 以下是cv2.createCLAHE的图像网格,其中clipLimit=[1,2,4,8,16,32]和tileGridS

是否可以使用计算机视觉算法使面部正常化(去除阴影)

以下是示例图像:

以下是cv2.equalizeHist的结果:

下面是cv2.createCLAHE(clipLimit=2.0,tileGridSize=(8,8))的结果

以下是
cv2.createCLAHE
的图像网格,其中
clipLimit=2.0
tileGridSize=[1,2,4,8,16,32]

以下是
cv2.createCLAHE
的图像网格,其中
clipLimit=[1,2,4,8,16,32]
tileGridSize=(8,8)

下面是伽马校正的结果,伽马=0.6:

下面是伽马校正的图像网格,伽马=[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校正看起来最好,但它显然无法移除阴影,因为它只是像素非线性过滤器。还有其他计算机视觉算法值得尝试吗?

我不确定你是否会接受,但10年前,Tan和Triggs(HoG的创建者)设计了一种光度测量方法,以消除任何闪电对机器的影响

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

I = imread('hZLne.png');

if size(I, 3) == 3
    ı = rgb2gray(I);
end

y = tantriggs(I);

imshow(y)
输出:

这对完全黑暗的图像最有效


可以考虑Python/OpenCV

中的划分规范化
  • 读取输入
  • 转换为灰度
  • 高斯模糊
  • 分部
  • 保存结果

输入:


结果:

根据您对整体亮度的要求调整比例值(192)

根据您的应用程序,您可能还希望减去除法归一化结果的平均值并除以标准偏差。

需要python示例
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()