图像处理中的归一化

时间:2015-11-09 14:00:37

标签: image-processing normalization

图像处理中标准化的正确平均值是多少?我用谷歌搜索,但我有不同的定义。我将尝试详细解释每个定义。

核矩阵规范化

如果归一化是指矩阵(例如卷积滤波器的核矩阵),通常矩阵的每个值除以矩阵值的总和,以便得到矩阵值的总和等于一(如果所有值都大于零)。这很有用,因为图像矩阵和我们的核矩阵之间的卷积给出的输出图像的值介于0和原始图像的最大值之间。但是如果我们使用sobel矩阵(具有一些负值),那就不再适用了,我们必须拉伸输出图像,以使所有值都在0和最大值之间。

图像规范化

我基本上找到了两个规范化的定义。第一个是" cut"值太高或太低。即,如果图像矩阵具有负值,则将它们设置为零,并且如果图像矩阵具有高于最大值的值,则将它们设置为最大值。第二个是线性拉伸所有值,以使它们适合区间[0,max value]。

3 个答案:

答案 0 :(得分:13)

我将从@metsburg得到一些答案。有几种方法可以对图像进行标准化(通常是数据向量),这些方法可以方便地用于不同的情况:

  • Data normalization或数据(重新)缩放:将数据投影到预定义范围(即通常为[0, 1][-1, 1])。当您拥有来自不同格式(或数据集)的数据并希望对所有数据进行规范化以便您可以对它们应用相同的算法时,这非常有用。通常按如下方式执行:

    Inew = (I - I.min) * (newmax - newmin)/(I.max - I.min)  + newmin
    
  • Data standarization是规范化数据的另一种方式(在机器学习中大量使用),其中均值被减去图像并被其标准差分开。如果您要将图像用作某些机器学习算法的输入,则它特别有用,因为它们中的许多都表现得更好,因为它们假设具有mean=0,std=1的高斯形式的特征。它可以很容易地执行:

    Inew = (I - I.mean) / I.std
    
  • Data stretching或(使用图像时的直方图拉伸)被视为您的选项2.通常将图像钳制到最小值和最大值,设置:

    Inew = I
    Inew[I < a] = a
    Inew[I > b] = b
    

    此处,低于a的图片值设置为a,同样与b成反比。通常,ab的值计算为百分比阈值。 a =分隔底部1%数据的阈值和b =分隔前1%数据的thredhold。通过这样做,您将从图像中删除outliers noise )。  这类似于( simpler )到histogram equalization,这是另一个使用的预处理步骤。

  • 数据规范化,也可以参考关于规范(l1 norml2/euclidean norm)的向量的归一化。实际上,这被翻译为:

    Inew = I / ||I||
    

    其中||I||提交I l1

    如果选择范数为1范数,则图像将除以其绝对值之和,使整个图像的总和等于l2。如果选择范数为I(或欧几里得),则将图像除以I的平方值之和,使1的平方值之和等于MailAddress

前3个广泛用于图像(不是其中3个,因为缩放标准化不兼容,但其中1个或缩放+拉伸标准化+拉伸),最后一个没那么有用。它通常用作某些统计工具的预处理,但如果您打算使用单个图像则不能。

答案 1 :(得分:2)

在数据科学中,有两种广泛使用的规范化类型:

1)我们试图将数据移位以使得和是特定值,通常为1(https://stats.stackexchange.com/questions/62353/what-does-it-mean-to-use-a-normalizing-factor-to-sum-to-unity

2)规范化数据以使其适合某个范围(通常为0到1):https://stats.stackexchange.com/questions/70801/how-to-normalize-data-to-0-1-range

答案 2 :(得分:1)

@Imanol的回答很棒,我只想添加一些示例:

将输入标准化为像素数据集。经常看到三种归一化方案:

  1. 归一化0到1之间的像素值
img /= 255.0
  1. 对-1和1之间的像素值进行归一化(如Tensorflow所做的那样):
img /= 127.5
img -= 1.0
  1. 根据数据集的平均值和标准差归一化(如Torch一样):
img /= 255.0
mean = [0.485, 0.456, 0.406] # Here it's ImageNet statistics
std = [0.229, 0.224, 0.225]

for i in range(3): # Considering an ordering NCHW (batch, channel, height, width)
    img[i, :, :] -= mean[i]
    img[i, :, :] /= std[i]