从.jpg图像转换回2D numpy数组

时间:2018-08-15 03:41:50

标签: python arrays numpy python-imaging-library

我将一个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阵列保存)

original v1

v1b,v1c(从2D数组保存)

v1b v1c

原始尺寸(具有原始尺寸)

enter image description here

2 个答案:

答案 0 :(得分:1)

link

 from scipy.misc import imread
 image_data = imread('test.jpg').astype(np.float32)

这应该给你numpy数组(我建议使用scipy中的imread)

答案 1 :(得分:1)

如果您的目标是将一个numpy数组另存为图像,则您的方法有问题。函数plt.savefig保存图的图像,而不是数组。同样,将数组转换为图像可能会带来一些精度损失(从float64float32转换为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)

即图像加载的形状与数据相同。一些注意事项:

  • image.png 被另存为灰度图像
  • 要保存为 .jpg ,只需更改为imageio.imwrite('image.jpg', img)
  • 对于 .png ,与原始图像的绝对平均距离为3.890e-06(可以使用np.abs(img_as_float(load) - data).sum() / data.size进行验证)

有关skimageimageio的信息可以在各自的网站上找到。可以在以下答案中找到有关将numpy数组另存为图像的更多信息:[1][2][3][4]