首页 > 解决方案 > 对 uint16 图像的重新缩放/归一化感到困惑?

问题描述

我有 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

所有方法都应该提供相同的性能,但事实并非如此。这就是让我感到困惑的地方。

标签: pythonimage-processingconv-neural-networkimage-scalinguint16

解决方案


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

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

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

您可能希望对您的值取一个调整后的对数:取 log(x + c) 调整 c 的位置,直到看到高斯值。更高级的技术是使用 Box-Cox 变换。

现在,为了通过最小值和最大值进行标准化,您可能希望使用频谱图的最小值和最大值,而不是数据显示的值。


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

  1. 从 16 位颜色变为 8 位颜色,除非您真的相信 16 位颜色中值得捕获的信息。(我对此表示怀疑。)
  2. 您想对图像的颜色亮度/饱和度进行标准化吗?使用最小/最大缩放器。这将防止饱和对分类产生影响。
  3. 你认为饱和度/亮度是一个特征,你的数据应该跨越整个色彩空间吗?然后坚持 [0, 255] 或 [0, 635535]。
  4. 只是一个附录:对于某些分类器,它也值得研究,Transformed = (I - I.mean) / I.std因为它们需要高斯数据。

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


推荐阅读