Python 正确地将png转换为npy numpy数组(图像到数组)

Python 正确地将png转换为npy numpy数组(图像到数组),python,arrays,python-2.7,numpy,image-processing,Python,Arrays,Python 2.7,Numpy,Image Processing,当我生成一个图像,然后从中生成一个numpy数组时,原始的.npy文件与新文件不同。我原以为新数组.npy将与原始数组.npy完全相同,因为它们来自同一个图像 例如,我使用了这个4*4像素的小图像: 这是一个更大的版本(不是我正在使用的版本): 代码的最后一部分将.png转换为.npy。我想问题就在这里的某个地方 import numpy as np from PIL import Image from matplotlib import pyplot as plt filename =

当我生成一个图像,然后从中生成一个numpy数组时,原始的
.npy
文件与新文件不同。我原以为
新数组.npy
将与
原始数组.npy
完全相同,因为它们来自同一个图像

例如,我使用了这个4*4像素的小图像:

这是一个更大的版本(不是我正在使用的版本):

代码的最后一部分将
.png
转换为
.npy
。我想问题就在这里的某个地方

import numpy as np
from PIL import Image
from matplotlib import pyplot as plt

filename = 'image-test'

img = Image.open( filename + '.png' )
data = np.array( img, dtype='uint8' )

np.save( filename + '.npy', data)

# visually testing our output
img_array = np.load(filename + '.npy')
plt.imshow(img_array) 
我的简单算法:

  • 生成随机rgb数组并将其另存为
    .npy
  • 从该numpy数组保存
    .png
    文件
  • 加载
    .png
    文件并将其保存回
    .npy
  • 结果如下:

    当我从
    new array.npy
    重新生成图像时,我得到的图像与
    original image.png
    完全相同:

    由于阵列具有不同的数据类型,因此文件不同

    第一次保存数据是在保存阵列CXY时。此数组的类型为
    np.float64
    ,因为这是
    np.zeros
    返回的默认数据类型


    第二个数组是通过加载原始图像而不是保存的npy文件创建的。这就是不一致的地方,因为PNG数据的类型是
    np.uint8
    (并且在下一行中再次转换为
    np.uint8
    )。这是一种较小的数据类型,因此总体文件大小较小。

    正如您所知,PNG文件中的像素数据是压缩的。数据中的微小变化,以及不同的压缩算法,可能会改变文件大小。要比较实际数据,请对解压缩后的像素进行比较。感谢您的回答,但问题是,我的想法是能够将该数组用于机器学习算法,并且在转换后必须相同。我该怎么做?我的意思是,由于这个微小的变化,我得到了一个错误:当我将2400*1400 png转换为numpy数组并尝试使用它时,索引器:索引2323超出了大小为1400的轴0的界限。这并不奇怪,因为文件似乎有不同的边界。PNG文件格式将像素存储为整数。您不能将浮点数组(如
    CXY
    img\u数组
    )中的数据保存到PNG文件,并期望读回相同的值。您的数组
    CXY
    包含范围为0..1的浮点数。PNG文件只能存储整数,因此无法存储浮点值。
    import numpy as np
    from matplotlib import pyplot as plt
    import matplotlib
    
    from PIL import Image                                                                                
    
    
    ####create a matrix of random colors
    filename = "original-array"
    
    matrix=np.random.random((4,4,3))
    nx,ny,nz=np.shape(matrix)
    CXY=np.zeros([ny, nx])
    for i in range(ny):
        for j in range(nx):
            CXY[i,j]=np.max(matrix[j,i,:])
    
    #Save binary data
    np.save(filename + '.npy', CXY)
    print(filename + " was saved")
    
    #Load npy
    img_array = np.load(filename + '.npy')
    plt.imshow(img_array)
    
    
    ####Save npy as png
    filename = "original-image"
    
    img_name = filename +".png"
    matplotlib.image.imsave(img_name, img_array)
    print(filename + " was saved")
    
    
    #### Convert that png back to numpy array
    
    img = Image.open( filename + '.png' )
    data = np.array( img, dtype='uint8' )
    
    #Convert the new npy file to png
    filename = "new-array"
    
    np.save( filename + '.npy', data)
    print(filename + " was saved")
    
    
    #Load npy
    img_array = np.load(filename + '.npy')
    
    filename = "new-image"
    #Save as png
    img_name = filename +".png"
    matplotlib.image.imsave(img_name, img_array)
    print(filename + " was saved")