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

sat*_*las 15 python arrays numpy image-processing python-2.7

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

例如,我使用了这个 4*4 像素的小图像:
original-image.png

这是一个更大的版本(不是我正在使用的版本): 在此处输入图片说明

代码的最后一部分是将 转换.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) 
Run Code Online (Sandbox Code Playgroud)

我的简单算法:

  1. 生成随机rgb数组并将其保存为 .npy
  2. .png从该 numpy 数组中保存一个文件。
  3. 加载该.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")
Run Code Online (Sandbox Code Playgroud)

结果如下: 在此处输入图片说明

当我重新生成图像时,new-array.npy我得到与以下完全相同的图像original-image.png
在此处输入图片说明

Jgg*_*aut 1

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

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

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