首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >正确地将png转换为npy numpy数组(图像转换为Array)

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

Stack Overflow用户
提问于 2017-12-17 20:09:51
回答 1查看 24.6K关注 0票数 15

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

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

original-image.png

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

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

代码语言:javascript
运行
复制
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
代码语言:javascript
运行
复制
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完全相同的图像

EN

回答 1

Stack Overflow用户

发布于 2020-02-26 21:23:58

由于数组有不同的数据类型,所以文件是不同的。

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47858996

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档