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 = 65535min = 0,此公式等效于您的第二种方法。

好的,你已经透露你正在使用来自光谱仪的数据!还记得我说过最重要的事情是考虑您的数据吗?

我们知道您需要规范化数据,因为网络收敛速度会更快。理想情况下,我们希望它们呈正态分布。

频谱图的一个巨大问题是标准归一化技术没有用,因为数据非常重尾。

您可能需要对您的值进行调整后的对数:在调整 c 的位置采用 log(x + c),直到您看到高斯分布。一种更高级的技术是使用 Box-Cox 变换。

现在,为了按最小值和最大值进行标准化,您可能希望使用 minimum and maximum values for a spectrogram 而不是数据显示的内容。


这个问题的答案取决于您输入数据的性质。请注意,下面的答案适用于分类任务和回归任务。

  1. 从 16 位颜色转到 8 位颜色,除非您真的相信 16 位颜色中有值得捕捉的信息。 (我对此表示怀疑。)
  2. 您要标准化图像的颜色 brightness/saturation 吗?使用 min/max 定标器。这将防止饱和度对分类产生影响。
  3. 您是否认为 saturation/brightness 是一个特征并且您的数据应该跨越整个颜色 space?然后坚持 [0, 255] 或 [0, 635535].
  4. 只是一个附录:对于某些分类器,Transformed = (I - I.mean) / I.std 也值得研究,因为它们需要高斯数据。

请记住,规范化的目标是将域缩小到 [0, 1]。您应该始终考虑转换将如何影响样本和可能的样本图像。你会教模型什么?是否有样本图像属于同一图像 space?哪些可能的转换最能将训练图像和样本外图像映射到相似的域?