如何在python中实现全局对比度归一化?

数据挖掘 Python 图像分类 计算机视觉 预处理
2021-10-04 11:29:40

我正在尝试在 Yoshua Bengio 的深度学习书(第 12.2.1.1 节第 442 节)中的 python 中实现全局对比度归一化。从书中,为了使用全局对比度归一化获得归一化图像,我们使用以下等式:

Xi,j,k=sXi,j,kX¯max{ϵ,λ+13rci=1rj=1ck=13(Xi,j,kX¯)2}
在哪里 Xi,j,k 是图像的张量,并且 Xi,j,k 是归一化图像的张量,并且 X¯=13rci=1rj=1ck=13Xi,j,k 是原始图像像素的平均值。 ϵλ 是一些常数,通常与 λ=10ϵ 设置为一个非常小的数字,这是我的实现:

import Image
import numpy as np
import math
def global_contrast_normalization(filename, s, lmda, epsilon):
    X = np.array(Image.open(filename))

    X_prime=X
    r,c,u=X.shape
    contrast =0
    su=0
    sum_x=0

    for i in range(r):
        for j in range(c):
            for k in range(u):

                sum_x=sum_x+X[i][j][k]
    X_average=float(sum_x)/(r*c*u)

    for i in range(r):
        for j in range(c):
            for k in range(u):

                su=su+((X[i][j][k])-X_average)**2
    contrast=np.sqrt(lmda+(float(su)/(r*c*u)))


    for i in range(r):
        for j in range(c):
            for k in range(u):

                X_prime[i][j][k] = s * (X[i][j][k] - X_average) / max(epsilon, contrast)
    Image.fromarray(X_prime).save("result.jpg")
global_contrast_normalization("cat.jpg", 1, 10, 0.000000001)

原图:

原始图像

结果图像:

结果

我得到了意想不到的结果。我的实施有什么问题?

1个回答

代码存在多个问题:

  1. 您将图像中的值强制为 uint8(8 位整数)。由于这些值是浮点数,它们将被强制转换/舍入为 0 或 1。这稍后将被解释为黑色图像和最暗的灰色形式(255 中的 1)。

  2. 一旦你有适当的浮点数作为值 PIL 或枕头不能处理数组(他们只做具有 [0, 255] 值的图像)

第一个问题发生是因为你/numpy 希望数组是 uint8。规范化版本将有浮动。

你应该使用过:

X_prime = X.astype(float)

这是代码的工作版本:

import numpy
import scipy
import scipy.misc
from PIL import Image


def global_contrast_normalization(filename, s, lmda, epsilon):
    X = numpy.array(Image.open(filename))

    # replacement for the loop
    X_average = numpy.mean(X)
    print('Mean: ', X_average)
    X = X - X_average

    # `su` is here the mean, instead of the sum
    contrast = numpy.sqrt(lmda + numpy.mean(X**2))

    X = s * X / max(contrast, epsilon)

    # scipy can handle it
    scipy.misc.imsave('result.jpg', X)


global_contrast_normalization("cat.jpg", 1, 10, 0.000000001)

PS:X_prime = X会做X_prime参考X所以变X_prime也会变X