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

标签 python arrays python-2.7 numpy image-processing

当我生成一个图像,然后从中生成一个 numpy 数组时,原始 .npy文件与新文件不同。我以为new-array.npy将与 original-array.npy 完全相同因为它们来自同一个图像。
例如,我使用了这个 4*4 像素的小图像:
original-image.png
这是一个更大的版本(不是我正在使用的版本):
enter image description here
代码的最后一部分是转换 .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
  • 保存 .png来自那个 numpy 数组的文件。
  • 加载该 .png文件并将其保存回 .npy
  • 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")
    
    结果如下:
    enter image description here
    当我从 new-array.npy 重新生成图像时我得到的图像与 original-image.png 完全相同:
    enter image description here

    最佳答案

    这些文件是不同的,因为数组具有不同的数据类型。

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

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

    关于python - 正确将 png 转换为 npy numpy 数组(图像到数组),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47858996/

    相关文章:

    python - Numpy 选择具有多列的行作为条件

    python - "print x,"相当于 Python3

    python - Tensorflow 导入元图占位符未提供

    python - numpy 数组的奇怪复制构造

    python - 使用 format() 迷你语言将 float 与 Python 2.7 中的小数点对齐

    python - 按公共(public)列合并两个表

    python - 使用通配符搜索元组列表?

    javascript - 将对象数组分类为新数组

    arrays - Array 与 ArraySeq 比较

    google-app-engine - ndb.BlobProperty 与 BlobStore : which is more private and more secure