首页 > 解决方案 > 高斯滤波(DoG)的差异没有给出预期的结果

问题描述

我正在尝试在 python 3.6 和 Opencv 4.2 中实现原始论文中的方法(增强的局部纹理特征集,用于在困难照明条件下进行面部识别,由 Xiaoyang Tan 和 Bill Triggs),
但是当我将预处理应用到图像时它没有尽管我使用了相同的参数,但给出的结果与论文中的相同:
1- 用于伽马校正,gamma=0.2
2- 用于 DoG,(sigma0=1, sigma1=2)
3- 用于对比度均衡, tau=10 和 alpha=0.1

这是预期的结果和我得到的结果:

原始图像 结果图像 预期图像

这是我使用的代码:

img_original = cv.imread('C:/Users/Ouss/Desktop/TP-LTP/face.jpg', cv.IMREAD_GRAYSCALE)

# gamma correction
lookUpTable = np.empty((1, 256), np.uint8)
for i in range(256):
# calculating the new values
lookUpTable[0, i] = np.clip(pow(i / 255.0, 2) * 255.0, 0, 255)
# mapping the new values with the original
gamma_corrected_img = cv.LUT(img_original, lookUpTable)

# DOG
blur1 = cv.GaussianBlur(gamma_corrected_img, (3, 3), 1, borderType=cv.BORDER_REPLICATE)
blur2 = cv.GaussianBlur(gamma_corrected_img, (7, 7), 2, borderType=cv.BORDER_REPLICATE)

dog_img = cv.subtract(blur1, blur2)

# contrast equalisation
# step 1
alpha = 0.1
tau = 10
temp1 = pow(np.abs(dog_img), alpha)
meanImg = np.mean(temp1)

Contrast_Equa_step01 = dog_img / pow(meanImg, 1/alpha)
# step 2
minMat = np.abs(Contrast_Equa_step01)
minMat[minMat > tau] = tau
temp2 = pow(minMat, alpha)
meanImg2 = np.mean(temp2)
Contrast_Equa_step02 = Contrast_Equa_step01 / pow(meanImg2, 1/alpha)
CEqualized_img = tau * np.tanh((Contrast_Equa_step02/tau))

标签: python

解决方案


我认为您的主要问题是 tau=10.0 太大。tau=3.0 似乎对我有用,我的图像标准化为 0 到 1 范围内的浮点数。然后最后乘以 255 并转换为 uint8。

这是我的 Python/OpenCV 代码。我已经将伽玛校正、DoG 和对比度均衡的第一阶段的版本保存了 255 到 uint8 以供查看。我还通过除以最大绝对值以将值拉伸到 -1 到 1 对 DoG 进行了归一化(尽管不需要)。归一化为 DoG 提供了更好的对比度。我还交换了 DoG 中两个模糊图像的顺序以匹配他的对比度极性。

输入:

在此处输入图像描述

import cv2
import numpy as np

# Reference: Enhanced Local Texture Feature Sets for Face Recognition Under Difficult Lighting Conditions by Xiaoyang Tan and Bill Triggs
# https://lear.inrialpes.fr/pubs/2007/TT07/Tan-amfg07a.pdf

# read image as grayscale float in range 0 to 1
img = cv2.imread('face.jpg', cv2.IMREAD_GRAYSCALE).astype(np.float64) / 255.0

# set arguments
gamma = 0.2
alpha = 0.1
tau = 3.0

# gamma correction
img_gamma = np.power(img, gamma)
img_gamma2 = (255.0 * img_gamma).clip(0,255).astype(np.uint8)

# DOG
blur1 = cv2.GaussianBlur(img_gamma, (0,0), 1, borderType=cv2.BORDER_REPLICATE)
blur2 = cv2.GaussianBlur(img_gamma, (0,0), 2, borderType=cv2.BORDER_REPLICATE)
img_dog = (blur1 - blur2)
# normalize by the largest absolute value so range is -1 to 
img_dog = img_dog / np.amax(np.abs(img_dog))
img_dog2 = (255.0 * (0.5*img_dog + 0.5)).clip(0,255).astype(np.uint8)

# contrast equalization equation 1
img_contrast1 = np.abs(img_dog)
img_contrast1 = np.power(img_contrast1, alpha)
img_contrast1 = np.mean(img_contrast1)
img_contrast1 = np.power(img_contrast1,1.0/alpha)
img_contrast1 = img_dog/img_contrast1

# contrast equalization equation 2
img_contrast2 = np.abs(img_contrast1)
img_contrast2 = img_contrast2.clip(0,tau)
img_contrast2 = np.mean(img_contrast2)
img_contrast2 = np.power(img_contrast2,1.0/alpha)
img_contrast2 = img_contrast1/img_contrast2
img_contrast = tau * np.tanh((img_contrast2/tau))

# Scale results two ways back to uint8 in the range 0 to 255
img_contrastA = (255.0 * (img_contrast+0.5)).clip(0,255).astype(np.uint8)
img_contrastB = (255.0 * (0.5*img_contrast+0.5)).clip(0,255).astype(np.uint8)

# show results
cv2.imshow('Face', img)
cv2.imshow('Gamma', img_gamma2)
cv2.imshow('DoG', img_dog2)
cv2.imshow('CE1', img_contrast1)
cv2.imshow('CE_A', img_contrastA)
cv2.imshow('CE_B', img_contrastB)
cv2.waitKey(0)
cv2.destroyAllWindows()

# save results
cv2.imwrite('face_contrast_equalization_A.jpg', img_contrastA)
cv2.imwrite('face_contrast_equalization_B.jpg', img_contrastB)


根据如何将结果从浮点数缩放回 0 到 255 范围内的 uint8,得到的结果略有不同。第一种方法在乘以 255 之前简单地偏置 0.5。第二种方法乘以 0.5,然后在乘以 255 之前偏置 0.5 . 方法 A 可能更接近参考文献的作者所达到的结果。

缩放方法 A: 在此处输入图像描述

缩放方法 B: 在此处输入图像描述

将 tau 调高或调低以获得所需的对比度。


推荐阅读