目录
1. 实验目的
①了解数字图像基本属性;
②掌握Pillow图像处理库的基本操作。
2. 实验内容
①使用Pillow库对图像进行图像色彩模式转换、颜色通道的分离与合并、转化为数组、缩放、旋转、镜像和裁剪等操作;
②将图像转化为多维数组;
③下载MNIST数据集,访问并以图片形式显示数据集中的样本。
3. 实验过程
题目一:
下载lena.tiff图像,将R、G、B三通道分离,采用灰度图表示颜色的亮度,并分别对各个通道按要求进行处理。
要求:
(1)将R通道的图像缩小为50×50,显示在子图1中,子标题为:“R-缩放”,字体大小为14;
(2)将G通道的图像先水平镜像,再顺时针旋转90度,显示在子图2中,子标题为:“G-镜像+旋转”,字体大小为14,并显示坐标轴;
(3)对B通道的图像进行裁剪,裁剪位置:左上角(0, 0) 右下角(300,300),显示在子图3中,子标题为:“B-裁剪”,字体大小为14;
(4)将原始的R、G、B通道的图像合并,显示在子图4中,子标题显示图像的色彩模式,字体大小为14;
(5)将要求(4)的处理结果保存为PNG格式的图片,路径为当前工作目录,文件名为“test.png”,如图1所示;
(6)将以上生成的4幅图像显示在2×2的画布中,全局标题为“图像基本操作”,标题字体大小为20,颜色为蓝色,如图2所示。
图1 图像保存
图2 图像显示
① 代码
from PIL import Image
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False ## 设置正常显示符号
img = Image.open("lena.tiff")
img_r,img_g,img_b = img.split() #将彩色图像分离为R,G,B三个颜色通道。
plt.figure(figsize=(5,5)) #整体画布大小5*5
# (1)将R通道的图像缩小为50×50,显示在子图1中,子标题为:“R-缩放”,字体大小为14;
plt.subplot(221) #两行两列第1个图
plt.axis("off") #不显示坐标轴
img_small = img_r.resize((50,50)) #缩放50*50
plt.imshow(img_small,cmap="gray") #灰度图
plt.title("R-缩放",fontsize = 14)
# (2)将G通道的图像先水平镜像,再顺时针旋转90度,显示在子图2中,子标题为:“G-镜像+旋转”,字体大小为14,并显示坐标轴;
plt.subplot(222)
plt.axis('on')#显示坐标轴
img_gr = img_g.transpose(Image.ROTATE_270)#逆时针270 = 顺时针90
plt.imshow(img_gr,cmap="gray")
plt.title("G--镜像+旋转",fontsize = 14)
# (3)对B通道的图像进行裁剪,裁剪位置:左上角(0, 0) 右下角(150, 150),显示在子图3中,子标题为:“B-裁剪”,字体大小为14;
plt.subplot(223)
img_region = img_b.crop((0,0,150,150))
plt.imshow(img_region)
plt.title("B-裁剪",fontsize = 14)
# (4)将原始的R、G、B通道的图像合并,显示在子图4中,子标题显示图像的色彩模式,字体大小为14;
img_rgb = Image.merge("RGB",[img_r,img_g,img_b]) #将所有通道合并,得到BGR彩色图像
plt.subplot(224)
plt.axis("off")
plt.imshow(img_rgb)
plt.title("rgb",fontsize = 14)
# (5)将要求(4)的处理结果保存为PNG格式的图片,路径为当前工作目录,文件名为“test.png”,如图2所示;
img_rgb.save('test.png')
#(6)将以上生成的4幅图像显示在2×2的画布中,全局标题为“图像基本操作”,标题字体大小为20,颜色为蓝色。
plt.suptitle("图像基本操作",fontsize = 20,color = 'b')
plt.show()
② 实验结果
题目二:
按下列要求完成程序,随机显示MNIST数据集中的样本,效果如下图所示。
要求:
(1)下载手写数字数据集,读取训练集和测试集数据,放在NumPy数组train_x、train_y、test_x、test_y中;(train_x:训练集图像,train_y:训练集标签,test_x:测试集图像,test_y:测试集标签)
(2)随机从所有测试集数据中显示16幅数字图像;
(3)16幅图像按照4×4方式排列在一张画布中,每幅图像的子标题为该图像的标签值,字体大小为14,全局标题为“MNIST测试集样本”,字体大小为20,颜色为红色。
① 代码
# (1)下载手写数字数据集,读取训练集和测试集数据,放在NumPy数组train_x、train_y、test_x、test_y中;(train_x:训练集图像,train_y:训练集标签,test_x:测试集图像,test_y:测试集标签)
# (2)随机从所有测试集数据中显示16幅数字图像;
# (3)16幅图像按照4×4方式排列在一张画布中,每幅图像的子标题为该图像的标签值,字体大小为14,全局标题为“MNIST测试集样本”,字体大小为20,颜色为红色。
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'SimHei' #防止中文乱码
plt.rcParams['axes.unicode_minus'] = False #设置正常显示符号
mnist = tf.keras.datasets.mnist
(train_x,train_y),(test_x,test_y) = mnist.load_data()
plt.suptitle("MNIST测试集样本",fontsize = 20,color = 'r') #总标题
for i in range(16):
num = np.random.randint(1,50000)
plt.subplot(4,4,i+1)
plt.axis("off") #不显示坐标轴
plt.imshow(train_x[num])
plt.title("标签值:"+str(train_y[num])) #train_y[num]是手写数字值
plt.show()
# print(train_x[0])
# print(train_y[0])
② 实验结果
4. 实验小结&讨论题
① 实验过程中遇到了哪些问题,你是如何解决的?
这次的题目有点难,问了很多同学才得以解决,刚开始图片存储位置不对,不能正常运行,我就把图片存储到我的这个代码的项目文件中,就可以正常显示了。类似于波士顿房价集和鸢尾花,对图片进行处理的时候对一些函数不是很熟练,导致运行会出错。
② 你知道Keras中还集成了哪些其他的数据集吗?请列举一二,并下载出来。除了Keras,你知道其他下载数据集的方式吗?
MNIST数字分类数据集 CIFAR10小图像分类数据集 CIFAR100小图像分类数据集 IMDB电影评论情感分类数据集
1.使用urllib下载cifar-10数据集,并读取再存为图片
2.按BATCH_SIZE读取二进制文件中的图片数据,并存放为jpg
③ 在题目基本要求的基础上,你对每个题目做了那些扩展和提升?或者你觉得在编程实现过程中,还有哪些地方可以进行优化?
每个题目要实现的功能很多,可以使用自定义函数是代码看着简便一点。