正确地将png转换为npy numpy数组(Image to Array)

时间:2017-12-17 20:09:52

标签: python arrays python-2.7 numpy image-processing


大家好: - )


当我生成一个图像然后从中生成一个numpy数组时,原始的npy与新的不同。

new-array.npy 文件应与 original-array.npy 文件完全相同 因为它们来自相同的图像......但不一样:-o

对于那个例子,我使用了一个4 * 4像素的小图像:
original-image.png (tiny 4*4 pixel image)

这里有一个更大的代表(不是我正在使用的那个): enter image description here

代码的最后一部分是将 .png转换为.npy 的代码。我认为问题来自那里......

image-to-array.py:

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) 

和整个代码:
我不知道,但我这样做,非常简单:
1)生成随机rgb数组并将其保存为.npy
2)从那个numpy数组中保存一个png文件。
3)加载.png文件并将其保存回.npy

generateArray-to-image-to-arrayBack.py

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")


如果您使用Copypast代码,您可以尝试自己:-) 看看结果: enter image description here

哼......让我们更详细地看一下......
有趣的是,当我从 new-array.npy 重新生成图像时,我得到与 original-image.png 完全相同的图像: - Ø enter image description here

非常感谢您的关注:-)
希望也能帮助其他人。情况

1 个答案:

答案 0 :(得分:1)

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

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

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