当我生成一个图像,然后从中生成一个 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)
我的简单算法:.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")
结果如下:当我从
new-array.npy
重新生成图像时我得到的图像与 original-image.png
完全相同:最佳答案
这些文件是不同的,因为数组具有不同的数据类型。
第一次保存数据是在保存数组 CXY 时。该数组的类型为 np.float64
,因为这是 np.zeros
返回的默认数据类型.
第二个数组是通过加载原始图像创建的,而不是保存的 npy 文件。这是引入不一致的地方,因为 PNG 数据的类型是 np.uint8
(并在下一行再次转换为 np.uint8
)。这是一种较小的数据类型,因此整体文件大小较小。
关于python - 正确将 png 转换为 npy numpy 数组(图像到数组),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47858996/