【问题标题】:Difference of Gaussian filtering (DoG) doesn't give the expected results高斯滤波(DoG)的差异没有给出预期的结果
【发布时间】:2019-12-31 06:50:54
【问题描述】:

我正在尝试实现原始论文中的方法(Enhanced Local Texture Feature Sets for Face 在 python 3.6 和 Opencv 4.2 中,Xiaoyang Tan 和 Bill Triggs 在困难光照条件下的识别,
但是当我将预处理应用于图像时,它并没有给出与论文中相同的结果 虽然我使用了指定的相同参数:
1- 伽马校正,伽马=0.2
2- 对于 DoG,(sigma0=1, sigma1=2)
3- 对于对比度均衡,tau=10 和 alpha=0.1

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

Original Imageresulted imageexpected image

这是我使用的代码:

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


    【解决方案1】:

    我认为您的主要问题是 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 以获得您想要的对比度。

    【讨论】:

    • 感谢回复,这是一个更好的结果,更接近原始结果,虽然 tau 设置为 3,但与原始论文中的 10 相比
    • 人们永远不知道他们实际实现了什么,而只报告主要概念。所以细节可能略有不同,因此需要稍微不同的 tau。此外,他们对命令的实现可能已经被不同地编码(例如,他们说他们处理完整的图像,然后裁剪出给定大小的中心部分)。或者他们的实现可能有一个视觉错误或有偏见或规模不同。
    • 我已经修改了我的答案,加入了两种不同的方法来将结果缩放回 0 到 255 范围内的 uint8。第一种方法可能更接近参考文献的作者所获得的结果。
    • 第一种缩放方法更接近我认为的论文中的那个,我想这就是我正在寻找的解决方案,谢谢。 Ps:我想给你投赞成票,但它不允许我,它说我必须至少有 15 名声望,这只是我在这里的第一篇文章。所以谢谢你,对不起
    • 好的。如果你记得的话,当你有足够的积分时再回来。将不胜感激。
    【解决方案2】:

    有几个可能的问题。

    1) 您应该在所有操作中将图像标准化为 0 到 1 范围内的浮点数,然后缩小到 0 到 255 范围内的整数以获得最终结果。

    2) 您使用的是 gamma=2,而不是 gamma=0.2

    3) 使用 sigma 值计算高斯模糊时,应将维度设置为 0。请参阅https://docs.opencv.org/4.1.1/d4/d86/group__imgproc__filter.html#gaabe8c836e97159a9193fb0b11ac52cf1

    4) 通常,DoG 偏差为 0.5

    这是一个简单的例子,计算 Gamma 增强图像,并在 Python/OpenCV 中将 DoG 图像与原始人脸图像分开。

    输入:

    import cv2
    
    img = cv2.imread('face.jpg', cv2.IMREAD_GRAYSCALE).astype('float32') / 255.0
    
    # gamma correction
    img_gamma = img**0.2
    img_gamma = (255.0 * img_gamma).clip(0,255).astype('uint8')
    
    # DOG
    blur1 = cv2.GaussianBlur(img, (0,0), 1, borderType=cv2.BORDER_REPLICATE)
    blur2 = cv2.GaussianBlur(img, (0,0), 2, borderType=cv2.BORDER_REPLICATE)
    # compute difference and bias to 0.5
    img_dog1 = blur2 - blur1 + 0.5
    img_dog1 = (255.0 * img_dog1).clip(0,255).astype('uint8')
    # Or compute difference and add back to image as band pass boost filter
    img_dog2 = blur2 - blur1 + img
    img_dog2 = (255.0 * img_dog2).clip(0,255).astype('uint8')
    
    # show results
    cv2.imshow('Face', img)
    cv2.imshow('Gamma', img_gamma)
    cv2.imshow('DOG1', img_dog1)
    cv2.imshow('DOG2', img_dog2)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    # save results
    cv2.imwrite('face_gamma.jpg', img_gamma)
    cv2.imwrite('face_dog1.jpg', img_dog1)
    cv2.imwrite('face_dog2.jpg', img_dog2)
    


    来自输入的 Gamma 增强结果:

    来自输入的DoG Result1:

    来自输入的DoG Result2:

    也许这些建议将有助于您的全面处理。

    【讨论】:

    • 感谢您的回复,我只是想知道我的对比度均衡方法与论文中的方法相比是否正确,我尝试使用您提供的对比度均衡方法的代码,但它没有'不要给出类似的结果。
    • 在论文中,在方程 5 和 6 中,x' 和 y' 是什么?
    • 我也想不通,我不知道它们代表什么,因为论文中没有关于它们的任何解释,所以我用 x 和 y 代替
    猜你喜欢
    • 1970-01-01
    • 2014-03-07
    • 2015-09-16
    • 2017-05-09
    • 2020-05-29
    • 1970-01-01
    • 2019-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多