我将一个numpy数组保存到图像,如下所示:
plt.imshow(xNext[0,:,:,0]) #xNext has shape (1,64,25,1)
print(xNext[0,:,:,0].shape) #outputs (64,25)
plt.savefig(os.path.join(root,filename)+'.png')
np.save(os.path.join(root,filename)+'.npy',xNext[0,:,:,0])
如何从.png保存的图像中获取相同的numpy数组?如果我另存为.jpg图片,还可以告诉我吗?
我尝试了以下操作,并与3D数组(v1)一起使用,其中生成的图像接近原始numpy数组生成的图像(原始)。
image = Image.open(imageFilename) #brings in as 3D array
box = (315,60,500,540)
image = image.crop(box)
image = image.resize((25,64)) #to correct to desired shape
arr = np.asarray(image)
plt.imshow(arr)
plt.savefig('v1.png')
plt.close()
但是,当我将3D数组转换为2D数组时,生成的图像是不同的(v1b和v1c)。
arr2 = arr[:,:,0]
plt.imshow(arr2)
plt.savefig('v1b.png')
plt.close()
arr3 = np.dot(arr[...,:3],[0.299,0.587,0.11])
plt.imshow(arr3)
plt.savefig('v1c.png')
plt.close()
如何将3D正确转换为2D?感谢您的帮助。
原始版本v1(从3D阵列保存)
v1b,v1c(从2D数组保存)
原始尺寸(具有原始尺寸)
答案 0 :(得分:1)
from scipy.misc import imread
image_data = imread('test.jpg').astype(np.float32)
这应该给你numpy数组(我建议使用scipy中的imread)
答案 1 :(得分:1)
如果您的目标是将一个numpy数组另存为图像,则您的方法有问题。函数plt.savefig
保存图的图像,而不是数组。同样,将数组转换为图像可能会带来一些精度损失(从float64
或float32
转换为uint16
时)。话虽如此,我建议您使用 skimage 和 imageio :
import imageio
import numpy as np
from skimage import img_as_uint
data = np.load('0058_00086_brown_2_recording1.wav.npy')
print("original", data.shape)
img = img_as_uint(data)
imageio.imwrite('image.png', img)
load = imageio.imread('image.png')
print("image", load.shape)
此脚本加载您提供的数据并打印形状以进行验证
data = np.load('0058_00086_brown_2_recording1.wav.npy')
print("original", data.shape)
然后将data
转换为uint
,将图像另存为png并加载:
img = img_as_uint(data)
imageio.imwrite('image.png', img)
load = imageio.imread('image.png')
脚本的输出为:
original (64, 25)
image (64, 25)
即图像加载的形状与数据相同。一些注意事项:
imageio.imwrite('image.jpg', img)
3.890e-06
(可以使用np.abs(img_as_float(load) - data).sum() / data.size
进行验证)有关skimage和imageio的信息可以在各自的网站上找到。可以在以下答案中找到有关将numpy数组另存为图像的更多信息:[1],[2],[3]和[4]。