图像处理中的归一化
normalization in image processing
图像处理中归一化的正确含义是什么?我用谷歌搜索,但我有不同的定义。我将尝试详细解释每个定义。
核矩阵的归一化
如果归一化是指矩阵(例如卷积滤波器的核矩阵),通常矩阵的每个值除以矩阵值的总和,以便得到值的总和矩阵等于一(如果所有值都大于零)。这很有用,因为图像矩阵和我们的内核矩阵之间的卷积给出了一个输出图像,其值介于 0 和原始图像的最大值之间。但是如果我们使用 sobel 矩阵(有一些负值),这就不再正确了,我们必须拉伸输出图像以使所有值都在 0 和最大值之间。
图像标准化
我基本上找到了规范化的两个定义。第一个是 "cut" 值太高或太低。即,如果图像矩阵具有负值,则将它们设置为零,如果图像矩阵的值高于最大值,则将它们设置为最大值。第二个是线性拉伸所有值,以便将它们放入区间 [0,最大值]。
在数据科学中,有两种广泛使用的归一化类型:
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
我将扩展@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
相反。通常,a
和 b
的值计算为百分比阈值。 a
= 分隔底部 1% 数据的阈值和 b
= 分隔顶部 1% 数据的阈值。通过这样做,您将从图像中删除 outliers (noise)。
这类似于(更简单)histogram equalization,这是另一个使用的预处理步骤。
数据归一化,也可以指向量相对于范数(l1 norm or l2/euclidean norm)的归一化。这在实践中被翻译为:
Inew = I / ||I||
其中 ||I||
指的是 I
的 norm。
如果范数选择l1
范数,图像将除以其绝对值之和,使整幅图像之和等于1
。如果范数选择l2
(或欧氏),则图像除以I
的平方值之和,使得I
的平方值之和等于1
.
前 3 个广泛用于图像(不是其中 3 个,因为 缩放 和 标准化 不兼容,但其中 1 个它们或缩放+拉伸或标准化+拉伸),最后一个不是那么有用。它通常用作某些统计工具的预处理,但如果您打算处理单个图像则不会。
@Imanol 的回答很棒,我只想添加一些示例:
标准化输入 像素 或 数据集。常见的三种归一化方案:
- 标准化 0 和 1 之间的像素值:
img /= 255.0
- 标准化介于 -1 和 1 之间的像素值(如 Tensorflow 所做的):
img /= 127.5
img -= 1.0
- 根据数据集均值和标准差进行归一化(如 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]
图像处理中归一化的正确含义是什么?我用谷歌搜索,但我有不同的定义。我将尝试详细解释每个定义。
核矩阵的归一化
如果归一化是指矩阵(例如卷积滤波器的核矩阵),通常矩阵的每个值除以矩阵值的总和,以便得到值的总和矩阵等于一(如果所有值都大于零)。这很有用,因为图像矩阵和我们的内核矩阵之间的卷积给出了一个输出图像,其值介于 0 和原始图像的最大值之间。但是如果我们使用 sobel 矩阵(有一些负值),这就不再正确了,我们必须拉伸输出图像以使所有值都在 0 和最大值之间。
图像标准化
我基本上找到了规范化的两个定义。第一个是 "cut" 值太高或太低。即,如果图像矩阵具有负值,则将它们设置为零,如果图像矩阵的值高于最大值,则将它们设置为最大值。第二个是线性拉伸所有值,以便将它们放入区间 [0,最大值]。
在数据科学中,有两种广泛使用的归一化类型:
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
我将扩展@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
相反。通常,a
和b
的值计算为百分比阈值。a
= 分隔底部 1% 数据的阈值和b
= 分隔顶部 1% 数据的阈值。通过这样做,您将从图像中删除 outliers (noise)。 这类似于(更简单)histogram equalization,这是另一个使用的预处理步骤。数据归一化,也可以指向量相对于范数(l1 norm or l2/euclidean norm)的归一化。这在实践中被翻译为:
Inew = I / ||I||
其中
||I||
指的是I
的 norm。如果范数选择
l1
范数,图像将除以其绝对值之和,使整幅图像之和等于1
。如果范数选择l2
(或欧氏),则图像除以I
的平方值之和,使得I
的平方值之和等于1
.
前 3 个广泛用于图像(不是其中 3 个,因为 缩放 和 标准化 不兼容,但其中 1 个它们或缩放+拉伸或标准化+拉伸),最后一个不是那么有用。它通常用作某些统计工具的预处理,但如果您打算处理单个图像则不会。
@Imanol 的回答很棒,我只想添加一些示例:
标准化输入 像素 或 数据集。常见的三种归一化方案:
- 标准化 0 和 1 之间的像素值:
img /= 255.0
- 标准化介于 -1 和 1 之间的像素值(如 Tensorflow 所做的):
img /= 127.5
img -= 1.0
- 根据数据集均值和标准差进行归一化(如 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]