图像处理中的归一化

11

在图像处理中,规范化的正确含义是什么?我通过谷歌搜索得到了不同的定义。我将尝试详细解释每个定义。

卷积核矩阵的规范化

如果规范化是指矩阵(例如卷积滤波器的卷积核矩阵),通常将矩阵的每个值除以矩阵值的总和,以使矩阵值之和等于 1(如果所有值都大于零)。这很有用,因为图像矩阵与我们的卷积核矩阵之间的卷积会产生一个输出图像,其值介于 0 和原始图像的最大值之间。但是,如果我们使用 Sobel 矩阵(具有一些负值),这就不再成立了,我们必须拉伸输出图像,以使所有值介于 0 和最大值之间。

图像的规范化

我基本上发现了两种对规范化的定义。第一个是“剪切”太高或太低的值,即如果图像矩阵具有负值,则将其设置为零,并且如果图像矩阵的值大于最大值,则将其设置为最大值。第二个是线性拉伸所有值,以适应区间 [0, 最大值]。


这更适合于计算机科学。 - r2_d2
我怎样在计算机科学领域获得更好的发展? - gvgramazio
3个回答

25

我会稍微扩展一下 @metsburg 的回答。有几种归一化图像(通常是数据向量)的方法,针对不同情况方便地使用:

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

    Inew = (I - I.min) * (newmax - newmin)/(I.max - I.min)  + newmin
    
  • 数据标准化是规范化数据的另一种方式(在机器学习中经常使用),其中将平均值从图像中减去并除以其标准偏差。如果您打算将图像用作某些机器学习算法的输入,则它特别有用,因为其中许多算法会假定特征具有高斯形式,其mean=0、std=1。可以轻松执行如下:

  • Inew = (I - I.mean) / I.std
    
  • 数据拉伸(当您处理图像时也称为直方图拉伸),被称为选项2。通常,图像会被夹在最小值和最大值之间,并设置:

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

    这里,低于a的图像值被设置为a,高于b的图像值也同样被处理。通常,ab的值是按照百分比阈值计算得出的。其中,a表示数据最底部1%的阈值,b表示数据最顶部1%的阈值。通过这样做,可以从图像中删除异常值(噪点)。

    这与直方图均衡化类似(更简单),后者也是一种预处理步骤。

  • 数据归一化也可以理解为向量相对于范数(L1范数L2/Euclidean范数)进行归一化。在实践中,这被解释为:

  • Inew = I / ||I||
    

    其中||I||指的是I范数

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

    前三种通常在图像处理中使用(不能同时使用这三种,因为缩放标准化不兼容,但可以选择其中一种或缩放+拉伸标准化+拉伸),而最后一种并不是那么有用。它通常作为一些统计工具的预处理,但如果你打算使用单张图片,则没有太大意义。


我有一个问题,人们是如何想出这个线性函数来进行数据归一化的?还有其他线性函数可以达到相同的效果吗?谢谢。 - andres.santana
@andres.santana 任何线性函数都可以将您的图像映射,如果您将其视为灰度/颜色值数组。 - Imanol Luengo
2
这是正确的吗?Inew = (I - I.min) * (newmax - newmin) / (I.max - I.min) + newmin - jakeoung
@jakeoung,是的,你说得对。我把它搞反了(从维基百科上糟糕地复制过来)。已经在帖子中修正了,谢谢! - Imanol Luengo

3

@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]

2

那么这三个变量都是真实存在且被使用的吗? - gvgramazio
是的,它们都被使用了,但每个都有自己的属性。请查看@imaluengo的答案以获取详细信息。 - metsburg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接