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

Posted

技术标签:

【中文标题】如何标准化图像中的像素值并保存【英文标题】:How to normalize pixel values in an image and save it 【发布时间】:2020-07-07 21:09:48 【问题描述】:

我正在尝试规范化我的数据以准备将其作为this 模型的输入。我尝试遵循this 指南,但遇到了问题。

首先,我的最小值和最大值不是从 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: uint8
Min: 8.000, Max: 216.000
Min: 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)

输出sn-p

Min: 2.000, Max: 223.000
Min: 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]]]

【问题讨论】:

【参考方案1】:

您可以做的是计算数据集的实际最小值和最大值,然后再进行自己的 minmax 归一化。

这可能是这样的:

import sys
from PIL import Image
import numpy as np

image_paths = ['image_path1.jpg', 'image_path2.jpg', 'image_path3.jpg']
min = sys.maxsize
max = -sys.maxsize

for 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,您现在可以使用它们在 0 和 1 之间进行归一化,而不是 /= 255!

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

如果有帮助,请告诉我!

【讨论】:

嗨@relh!这很好用。我相应地更新了我的答案。感谢您的帮助! :) 您好,快速提问。我正在检查并更新我的代码,以便能够迭代多个文件,并更改了您提供的代码。我想知道 min max 和 if 语句的 sys.maxsize 代码是否是必要的。我把它们拿出来,只留下 min= np_image.min() 和 max 相同,标准化工作得很好,给我 0 到 1.0 之间的值作为输出。你能解释一下为什么包含它吗?

以上是关于如何标准化图像中的像素值并保存的主要内容,如果未能解决你的问题,请参考以下文章

Opencv读取图片像素值并保存为txt文件

OpenCV:标准化图像的像素值

numpy.ndarray 如何标准化?

如何逐像素分析python中的图像

翻译:神经网络 为什么要通过减去数据集的图像均值来标准化图像,而不是深度学习中的当前图像均值?

标准化 0 到 1 之间的像素值