0
点赞
收藏
分享

微信扫一扫

Python-pillow库显示MNIST图片的方法


文章目录

  • ​​写在前面​​
  • ​​示例代码​​
  • ​​另一种办法​​
  • ​​小结​​
  • ​​参考​​

写在前面

之前一直在看MLP的手写数字识别问题,看的书是迈克尔·尼尔森的深度学习入门书《神经网络与深度学习》(​​《Neural networks and deep learning》​​​,老师推荐的,讲得很不错,数学不多,适合入门),目前中文版已在Github开源(​​网址在这里​​),有兴趣的朋友可以去学习。

本文讲一下如何用Python的图片处理库pillow(PIL)显示MNIST(手写数字数据集)里面的图片(否则训练半天模型都对这个数据集没个直观的理解)。。

数据(mnist.pkl.gz文件)的下载地址在​​这里​​​,网不好的朋友可以移步。

示例代码

# 导入解压及数据读取库(系统自带)
import gzip, pickle
# 导入图形处理库
from PIL import Image
# 导入矩阵处理库
import numpy as np
# pyplot用于显示图形
# (如果使用Image内置的`.show()`方法会使用系统默认的图形查看器打开,速度较慢)
import matplotlib.pyplot as plt

# 首先进行解压,以字节形式读取
f = gzip.open('mnist.pkl.gz', 'rb')
# 读取pkl文件(Python特有的的数据形式)
# 需要设定编码,否则会报错
# 数据集中有三个部分,分别是训练集、验证集和测试集,本示例程序以a,b,c代替
a,b,c = pickle.load(f, encoding='latin1')
f.close()

# 选择打开第几(n)个图片
n=1
# 根据索引选择图片,并改变形状(图片的原始形状为784*1)
arr = a[0][n].reshape(28,28)
# 使用Image的`.fromarray()`方法读入图片矩阵
# 注意这里图片的灰度值是以0-1之间的float32类型存储的,需要先转换成RGB数值(0-255)
# 再对已读入的图片进行转换(否则会显示为彩色)
img = Image.fromarray(np.uint8(arr*255)).convert("1")
# 使用`pyplot`的函数显示图像
plt.imshow(img)
plt.show()
# print(img.mode)
print("图片上的数字是:%s"%(a[1][n]))

运行结果:

Python-pillow库显示MNIST图片的方法_python

图片上的数字是:0

另一种办法

import gzip
import pickle
import pylab

# 以二进制只读格式读取图片及索引文件
with gzip.open('data/mnist.pkl.gz', 'rb') as f:
# f.seek(0)
img = pickle.load(f, encoding='latin1')

i = 0
j = 10
# 输出第j张图片
# i={0,1,2},i=0时为50000个数据的训练集
# i=1时为10000个数据的验证集
# i=2时为10000个数据的测试集
img_x = img[i][0][j].reshape(28, 28)
img_id = img[i][1][j]

print(img_id)
pylab.imshow(img_x)
pylab.gray()
pylab.show()

这种方法使用了matplotlib库的pylab模块,比上一种方法更加简洁。

小结

  1. ​PIL.Image​​​所需的数据是 ​​uinit8​​ 型的,范围是​​0-255​​,所以在读取MNIST数据的时候需要进行转换;
  2. 需要知道PIL导入图片时候有以下几种格式,本例中的图片对应模式​​"1"​​,可以通过​​img.mode​​来查看图片对应的模式,具体可以参看​​1​​

模式
1 1位像素,黑和白,存成8位的像素
L 8位像素,黑白
P 8位像素,使用调色板映射到任何其他模式
RGB 3×8位像素,真彩
RGBA 4×8位像素,真彩+透明通道
CMYK 4×8位像素,颜色隔离
YCbCr 3×8位像素,彩色视频格式
I 32位整型像素
F 32位浮点型像素

参考

  1. ​​python PIL 图像处理​​​; ​​↩︎​​


举报

相关推荐

0 条评论