如何标准化图像的像素值并保存它

我正在尝试标准化我的数据,以便将其作为这个模型的输入。我尝试按照这个指南进行操作,但遇到了问题。

首先,我的最小值和最大值并不是从0和255开始的,最终结果也没有标准化在0到1之间。

这是我的函数

def process_image(image_path):    image = Image.open(image_path)    new_image = image.resize((224,224))        pixels = asarray(new_image)    # confirm pixel range is 0-255    print('Data Type: %s' % pixels.dtype)    print('Min: %.3f, Max: %.3f' % (pixels.min(), pixels.max()))    # convert from integers to floats    pixels = pixels.astype('float32')    # normalize to the range 0-1    pixels /= 255.0    # confirm the normalization    print('Min: %.3f, Max: %.3f' % (pixels.min(), pixels.max()))    new_image.save("result.jpg")        return new_image

这是我的输出结果

Data Type: uint8Min: 8.000, Max: 216.000Min: 0.031, Max: 0.847

为什么会这样?另外,如何保存这些标准化后的图像结果?目前的代码中,像素值没有被更改,因为我只是从new_image中复制了像素值。

感谢提供的任何帮助。

更新后的代码

感谢@relh的帮助!我实现了他的代码,现在运行得很好

代码如下

def process_image(image_path):    min = sys.maxsize    max = -sys.maxsize    image = Image.open(image_path)    new_image = image.resize((224,224))        np_image = asarray(image)    if min > np_image.min():        min = np_image.min()    if max < np_image.max():        max = np_image.max()        np_image = np_image.astype('float32')    print("BEGINNING PIXEL VALUES", np_image)    print('Data Type: %s' % np_image.dtype)    print('Min: %.3f, Max: %.3f' % (np_image.min(), np_image.max()))    np_image -= min    np_image /= (max - min)    print('Min: %.3f, Max: %.3f' % (np_image.min(), np_image.max()))    print(np_image)

输出片段

Min: 2.000, Max: 223.000Min: 0.000, Max: 1.000[[0.22171946 0.4162896  0.37104073]  [0.23076923 0.42533937 0.3846154 ]  [0.18099548 0.37556562 0.33484164]  ...  [0.12217195 0.51583713 0.47511312]  [0.15837105 0.54751134 0.50678736]  [0.16742082 0.5565611  0.51583713]]]

回答:

你可以先计算数据集的真实最小值和最大值,然后再进行自己的最小-最大标准化。

这可能看起来像这样:

import sysfrom PIL import Imageimport numpy as npimage_paths = ['image_path1.jpg', 'image_path2.jpg', 'image_path3.jpg']min = sys.maxsizemax = -sys.maxsizefor image_path in image_paths:    image = Image.open(image_path)    np_image = np.asarray(image)    if min > np_image.min():        min = np_image.min()    if max < np_image.max():        max = np_image.max()

这将为你提供min和max变量,现在你可以用它们来代替你之前的/= 255,来将像素值标准化到0和1之间!

    ...    pixels -= min    pixels /= (max - min)    ...

希望这对你有帮助!

Related Posts

如何对SVC进行超参数调优?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

如何在初始训练后向模型添加训练数据?

我想在我的scikit-learn模型已经训练完成后再…

使用Google Cloud Function并行运行带有不同用户参数的相同训练作业

我正在寻找一种方法来并行运行带有不同用户参数的相同训练…

加载Keras模型,TypeError: ‘module’ object is not callable

我已经在StackOverflow上搜索并阅读了文档,…

在计算KNN填补方法中特定列中NaN值的”距离平均值”时

当我从头开始实现KNN填补方法来处理缺失数据时,我遇到…

使用巨大的S3 CSV文件或直接从预处理的关系型或NoSQL数据库获取数据的机器学习训练/测试工作

已关闭。此问题需要更多细节或更清晰的说明。目前不接受回…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注