Image processing 图像处理中的归一化

Image processing 图像处理中的归一化,image-processing,normalization,Image Processing,Normalization,在图像处理中,标准化的正确含义是什么?我在谷歌上搜索过,但我有不同的定义。我将尝试详细解释每个定义 内核矩阵的标准化 如果规范化指的是矩阵(例如卷积滤波器的核矩阵),则通常将矩阵的每个值除以矩阵值之和,以使矩阵值之和等于一(如果所有值均大于零)。这是很有用的,因为图像矩阵和我们的核矩阵之间的卷积给出的输出图像的值介于0和原始图像的最大值之间。但是,如果我们使用sobel矩阵(有一些负值),这不再是真的,我们必须拉伸输出图像,以便所有值都在0和最大值之间 图像的标准化 我基本上找到了规范化的两个定

在图像处理中,标准化的正确含义是什么?我在谷歌上搜索过,但我有不同的定义。我将尝试详细解释每个定义

内核矩阵的标准化

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

图像的标准化


我基本上找到了规范化的两个定义。第一种方法是“削减”过高或过低的值。i、 e.如果图像矩阵有负值,则将其设置为零;如果图像矩阵的值高于最大值,则将其设置为最大值。第二种方法是对所有值进行线性拉伸,以便将它们拟合到区间[0,最大值]。

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

1) 我们尝试移动数据,使总和为一个特定值,通常为1()


2) 将数据标准化,使其在一定范围内(通常为0到1):

我将对@metsburg的答案进行一点扩展。有几种标准化图像(通常为数据向量)的方法,可方便地用于不同情况:

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

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

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

    Inew = I
    Inew[I < a] = a
    Inew[I > b] = b
    
    其中
    |I | |
    引用了
    I
    中的一个

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


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

由@Imanol提供的答案非常好,我只想添加一些示例:

将输入标准化为像素方向或数据集方向。通常可以看到三种标准化方案:

  • 规范化0和1之间的像素值:
  • 规范化-1和1之间的像素值(如下所示):
  • 根据数据集的平均值和标准偏差进行标准化(如有):

  • 这在计算机科学中更合适。我怎样才能在计算机科学中提出这个问题呢?所以这三个问题都是正确的和实际使用的?是的,它们都被使用了,但每个都有自己的属性。查看@imaluengo的答案了解详细信息。我有一个问题,人们是如何想出这个用于数据规范化的线性函数的?还有其他线性函数也会这样做吗?Thanks@andres.santana如果您将is视为灰度/颜色值数组,则任何线性函数都会映射图像。是否正确<代码>Inew=(I-I.min)*(newmax-newmin)/(I.max-I.min)+newmin@jakeoung-yup你是对的。我确实换了个说法(从维基百科抄袭的内容很糟糕)。修正后的帖子,谢谢!
    Inew = I / ||I||
    
    img /= 255.0
    
    img /= 127.5
    img -= 1.0
    
    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]