import numpy as np
import scipy.misc
import scipy.io
from PIL import Image
# 92 18 57分别对应着三个通道上的
# 92 66 46 25 70 56 47 12 对应着一个通道的第一行,可以确定图片的width为8
# 92 45 65 233 42 59 对应着一个通道的第一列,可以确定图片的height为6
list_image = [
[[[92, 18, 57],
[66, 28, 38],
[46, 29, 46],
[25, 23, 90],
[70, 13, 27],
[56, 75, 20],
[47, 21, 31],
[12, 52, 98]],
[[45, 18, 57],
[66, 28, 38],
[46, 29, 46],
[25, 23, 90],
[170, 13, 27],
[56, 375, 20],
[147, 21, 31],
[12, 52, 98]],
[[65, 18, 57],
[66, 28, 211],
[16, 29, 21],
[25, 23, 90],
[60, 13, 27],
[56, 375, 20],
[47, 201, 31],
[45, 52, 98]],
[[233, 34, 75],
[15, 264, 52],
[42, 62, 14],
[31, 39, 59],
[59, 20, 82],
[61, 66, 22],
[100, 34, 37],
[15, 264, 52]],
[[42, 62, 14],
[31, 39, 59],
[59, 20, 82],
[61, 66, 22],
[100, 34, 37],
[15, 164, 52],
[42, 62, 14],
[31, 30, 54]],
[[59, 20, 82],
[61, 6, 22],
[43, 12,90],
[76,28,10],
[87,21,199],
[90,87,122],
[98,124,211],
[10,89,20]]
]
]
# 四维矩阵维度确定例子:
# 第一个维度中我们拆解最外面的中括号,其中包含一个元素,所以第一个维度长度为1
'''
[[[92, 18, 57],
[66, 28, 38],
[46, 29, 46],
[25, 23, 90],
[70, 13, 27],
[56, 75, 20],
[47, 21, 31],
[12, 52, 98]],
[[45, 18, 57],
[66, 28, 38],
[46, 29, 46],
[25, 23, 90],
[170, 13, 27],
[56, 375, 20],
[147, 21, 31],
[12, 52, 98]],
[[65, 18, 57],
[66, 28, 211],
[16, 29, 21],
[25, 23, 90],
[60, 13, 27],
[56, 375, 20],
[47, 201, 31],
[45, 52, 98]],
[[233, 34, 75],
[15, 264, 52],
[42, 62, 14],
[31, 39, 59],
[59, 20, 82],
[61, 66, 22],
[100, 34, 37],
[15, 264, 52]],
[[42, 62, 14],
[31, 39, 59],
[59, 20, 82],
[61, 66, 22],
[100, 34, 37],
[15, 164, 52],
[42, 62, 14],
[31, 30, 54]],
[[59, 20, 82],
[61, 6, 22],
[43, 12,90],
[76,28,10],
[87,21,199],
[90,87,122],
[98,124,211],
[10,89,20]],
]
'''
# 第二个维度拆解两个中括号,里面有5个逗号分隔,包含6个大的元素,所以维度是6
'''
[[92, 18, 57],
[66, 28, 38],
[46, 29, 46],
[25, 23, 90],
[70, 13, 27],
[56, 75, 20],
[47, 21, 31],
[12, 52, 98]],
[[45, 18, 57],
[66, 28, 38],
[46, 29, 46],
[25, 23, 90],
[170, 13, 27],
[56, 375, 20],
[147, 21, 31],
[12, 52, 98]],
[[65, 18, 57],
[66, 28, 211],
[16, 29, 21],
[25, 23, 90],
[60, 13, 27],
[56, 375, 20],
[47, 201, 31],
[45, 52, 98]],
[[233, 34, 75],
[15, 264, 52],
[42, 62, 14],
[31, 39, 59],
[59, 20, 82],
[61, 66, 22],
[100, 34, 37],
[15, 264, 52]],
[[42, 62, 14],
[31, 39, 59],
[59, 20, 82],
[61, 66, 22],
[100, 34, 37],
[15, 164, 52],
[42, 62, 14],
[31, 30, 54]],
[[59, 20, 82],
[61, 6, 22],
[43, 12,90],
[76,28,10],
[87,21,255],
[90,87,122],
[98,124,211],
[10,89,20]]
'''
# 第三个维度拆解三个中括号,里面有7个逗号分隔,包含8个元素,所以第三个维度长度为8
'''
[92, 18, 57],
[66, 28, 38],
[46, 29, 46],
[25, 23, 90],
[70, 13, 27],
[56, 75, 20],
[47, 21, 31],
[12, 52, 98]
'''
# 第三个维度拆解四个中括号,其中有2个逗号,3个元素,所以第四个维度长度为3
'''
92, 18, 57
'''
array_y = np.array(list_image)
print(array_y.shape) # (1, 6, 8, 3) 在这样的矩阵里面1表示一张图片,6代表行 8代表列 3表示通道数
# 在tensorflow中,我们通常使用的图片维度应该是(?,height,width,channels)
# 将第一个维度缩减,变成(6, 8, 3)
array_image = np.squeeze(array_y,axis=0)
# 获取第一个通道
a = array_image[:,:,0]
### 2 使用自建矩阵实验,使用scipy模块
# scipy.misc.imsave('outfile.jpg', array_image)
# 注意:上面的scipy版本会标准化所有图像,以便min(数据)变成黑色,max(数据)变成白色。
# 如果数据应该是精确的灰度级或准确的RGB通道,则解决方案为:
# 此时保存的图片样式与上面的方法有所区别
scipy.misc.toimage(array_image, cmin=0.0, cmax=255.0).save('outfile.jpg')
#接下来读取该图片,并得到其中的数据值,看与保存时的矩阵是否一致,此时在读取的时候发现内部还是做了标准化
image_pth = './outfile.jpg'
out_image = scipy.misc.imread(image_pth)
print(out_image.shape) # (6, 8, 3)
print(out_image)
print("*"*50)
### 2 使用自建矩阵实验,使用PIL模块
# img如果是uint16的矩阵而不转为uint8的话,Image.fromarray这句会报错TypeError: Cannot handle this data type
array_image = array_image.astype("uint8")
print(array_image)
im = Image.fromarray(array_image)
im.save('./outfile.jpg')
# 发现通过这种方法读取恢复与原始数据保持一致
im1 = Image.open('./outfile.jpg')
im1_array = np.array(im1)
print(im1_array)
下面是该矩阵保存下来的图片: