uint16 图像的 Rescaling/normalization 混淆?
Confusion in Rescaling/normalization of uint16 image?
我有 15000 张 uint 图像,我已将它们矢量化以将其作为我的卷积神经网络的输入。[15000x8192] 我的问题是关于缩放,就像我像下面那样缩放我得到了好的结果
scaler= MinMaxScaler()
x_train= scaler.transform(x_train)
但如果我执行以下操作,我不会
x_train= xtrain./65535
我的图像的最大和最小像素值为 31,238 和 16841。处理图像时第一种方法是否正确?
我找到了下面的第三种方法,看起来比较合理
X_set_uint8 = cv2.normalize(X_set_16, None, 0, 255, cv2.NORM_MINMAX, dtype=cv2.CV_8U)
# Normalize pixel values to be between 0 and 1
X_set_scaled= X_train_uint8/255
所有方法都应该提供相同的性能,但它们不是。这就是让我感到困惑的地方。
MinMaxScaler 将(默认情况下)将每个特征(在本例中为像素)转换为范围 [0,1]
。
而在第二种方法中,您只需将所有值转换到 [0.257,0.477]
范围内,独立于它们所属的特征。
由于您处理的是图像,因此无论特征如何,都可以进行简单的最小-最大缩放,因为您希望保持像素之间的强度差异:
x_train = (x_train - x_train.min())/(x_train.max() - x_train.min())
如果您的图像数据 max = 65535
和 min = 0
,此公式等效于您的第二种方法。
好的,你已经透露你正在使用来自光谱仪的数据!还记得我说过最重要的事情是考虑您的数据吗?
我们知道您需要规范化数据,因为网络收敛速度会更快。理想情况下,我们希望它们呈正态分布。
频谱图的一个巨大问题是标准归一化技术没有用,因为数据非常重尾。
您可能需要对您的值进行调整后的对数:在调整 c 的位置采用 log(x + c),直到您看到高斯分布。一种更高级的技术是使用 Box-Cox 变换。
现在,为了按最小值和最大值进行标准化,您可能希望使用 minimum and maximum values for a spectrogram 而不是数据显示的内容。
这个问题的答案取决于您输入数据的性质。请注意,下面的答案适用于分类任务和回归任务。
- 从 16 位颜色转到 8 位颜色,除非您真的相信 16 位颜色中有值得捕捉的信息。 (我对此表示怀疑。)
- 您要标准化图像的颜色 brightness/saturation 吗?使用 min/max 定标器。这将防止饱和度对分类产生影响。
- 您是否认为 saturation/brightness 是一个特征并且您的数据应该跨越整个颜色 space?然后坚持 [0, 255] 或 [0, 635535].
- 只是一个附录:对于某些分类器,
Transformed = (I - I.mean) / I.std
也值得研究,因为它们需要高斯数据。
请记住,规范化的目标是将域缩小到 [0, 1]。您应该始终考虑转换将如何影响样本和可能的样本图像。你会教模型什么?是否有样本图像属于同一图像 space?哪些可能的转换最能将训练图像和样本外图像映射到相似的域?
我有 15000 张 uint 图像,我已将它们矢量化以将其作为我的卷积神经网络的输入。[15000x8192] 我的问题是关于缩放,就像我像下面那样缩放我得到了好的结果
scaler= MinMaxScaler()
x_train= scaler.transform(x_train)
但如果我执行以下操作,我不会
x_train= xtrain./65535
我的图像的最大和最小像素值为 31,238 和 16841。处理图像时第一种方法是否正确?
我找到了下面的第三种方法,看起来比较合理
X_set_uint8 = cv2.normalize(X_set_16, None, 0, 255, cv2.NORM_MINMAX, dtype=cv2.CV_8U)
# Normalize pixel values to be between 0 and 1
X_set_scaled= X_train_uint8/255
所有方法都应该提供相同的性能,但它们不是。这就是让我感到困惑的地方。
MinMaxScaler 将(默认情况下)将每个特征(在本例中为像素)转换为范围 [0,1]
。
而在第二种方法中,您只需将所有值转换到 [0.257,0.477]
范围内,独立于它们所属的特征。
由于您处理的是图像,因此无论特征如何,都可以进行简单的最小-最大缩放,因为您希望保持像素之间的强度差异:
x_train = (x_train - x_train.min())/(x_train.max() - x_train.min())
如果您的图像数据 max = 65535
和 min = 0
,此公式等效于您的第二种方法。
好的,你已经透露你正在使用来自光谱仪的数据!还记得我说过最重要的事情是考虑您的数据吗?
我们知道您需要规范化数据,因为网络收敛速度会更快。理想情况下,我们希望它们呈正态分布。
频谱图的一个巨大问题是标准归一化技术没有用,因为数据非常重尾。
您可能需要对您的值进行调整后的对数:在调整 c 的位置采用 log(x + c),直到您看到高斯分布。一种更高级的技术是使用 Box-Cox 变换。
现在,为了按最小值和最大值进行标准化,您可能希望使用 minimum and maximum values for a spectrogram 而不是数据显示的内容。
这个问题的答案取决于您输入数据的性质。请注意,下面的答案适用于分类任务和回归任务。
- 从 16 位颜色转到 8 位颜色,除非您真的相信 16 位颜色中有值得捕捉的信息。 (我对此表示怀疑。)
- 您要标准化图像的颜色 brightness/saturation 吗?使用 min/max 定标器。这将防止饱和度对分类产生影响。
- 您是否认为 saturation/brightness 是一个特征并且您的数据应该跨越整个颜色 space?然后坚持 [0, 255] 或 [0, 635535].
- 只是一个附录:对于某些分类器,
Transformed = (I - I.mean) / I.std
也值得研究,因为它们需要高斯数据。
请记住,规范化的目标是将域缩小到 [0, 1]。您应该始终考虑转换将如何影响样本和可能的样本图像。你会教模型什么?是否有样本图像属于同一图像 space?哪些可能的转换最能将训练图像和样本外图像映射到相似的域?