【发布时间】:2020-07-31 06:48:23
【问题描述】:
是否可以使用计算机视觉算法对人脸进行归一化(去除阴影)?
这是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) 的图像网格:
这里是使用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