①了解数字图像基本属性;
②掌握Pillow图像处理库的基本操作。
①使用Pillow库对图像进行图像色彩模式转换、颜色通道的分离与合并、转化为数组、缩放、旋转、镜像和裁剪等操作;
②将图像转化为多维数组;
③下载MNIST数据集,访问并以图片形式显示数据集中的样本。
下载lena.tiff图像(见7.2小节课件),将R、G、B三通道分离,采用灰度图表示颜色的亮度,并分别对各个通道按要求进行处理。
要求:
(1)将R通道的图像缩小为50×50,显示在子图1中,子标题为:“R-缩放”,字体大小为14;
(2)将G通道的图像先水平镜像,再顺时针旋转90度,显示在子图2中,子标题为:“G-镜像+旋转”,字体大小为14,并显示坐标轴;
(3)对B通道的图像进行裁剪,裁剪位置:左上角(0, 0) 右下角(150, 150),显示在子图3中,子标题为:“B-裁剪”,字体大小为14;
(4)将原始的R、G、B通道的图像合并,显示在子图4中,子标题显示图像的色彩模式,字体大小为14;
(5)将要求(4)的处理结果保存为PNG格式的图片,路径为当前工作目录,文件名为“test.png”,如图1所示;
(6)将以上生成的4幅图像显示在2×2的画布中,全局标题为“图像基本操作”,标题字体大小为20,颜色为蓝色,如图2所示。
在此之前我先上传一张lena的图片供各位下载
当然各位也可以在官网进行下载
lena官网需要各位
源码
import matplotlib.pyplot as plt
from PIL import Image
plt.rcParams["font.family"] = "SimHei"
img1 = Image.open("D:\WorkSpace\VScodeproject01\muqi\lena.tiff")
#分离R,G,B三个通道
img_r,img_g,img_b = img1.split()
plt.figure(figsize=(8,8))
#将R通道的图像缩小为50×50,显示在子图1中,子标题为:“R-缩放”,字体大小为14
imgr = img_r.resize((50,50))
plt.subplot(221)
plt.axis("off")
plt.imshow(imgr,cmap="gray")# cmap是以灰度的方式显示
plt.title("R-缩放",fontsize = 14)
#将G通道的图像先水平镜像,再顺时针旋转90度,显示在子图2中,子标题为:“G-镜像+旋转”,字体大小为14,并显示坐标轴
imgg1 = img_g.transpose(Image.FLIP_LEFT_RIGHT)
imgg2 = imgg1.transpose(Image.ROTATE_270)
plt.subplot(222)
plt.imshow(imgg2,cmap = "gray")
plt.title("G-镜像+旋转",fontsize = 14)
#对B通道的图像进行裁剪,裁剪位置:左上角(0, 0) 右下角(150, 150),显示在子图3中,子标题为:“B-裁剪”,字体大小为14
imgb = img_b.crop((0,0,150,150))
plt.subplot(223)
plt.axis("off")
plt.imshow(imgb,cmap = "gray")
plt.title("B-裁剪",fontsize = 14)
#将原始的R、G、B通道的图像合并,显示在子图4中,子标题显示图像的色彩模式,字体大小为14
imgrgb = Image.merge("RGB",[img_r,img_g,img_b])
plt.subplot(224)
plt.axis("off")
plt.imshow(imgrgb)
plt.title(imgrgb.mode,fontsize = 14)
#将要求(4)的处理结果保存为PNG格式的图片,路径为当前工作目录,文件名为“test.png”
imgrgb.save(r"D:\WorkSpace\VScodeproject01\muqi\test.png")
#将以上生成的4幅图像显示在2×2的画布中,全局标题为“图像基本操作”,标题字体大小为20,颜色为蓝色
plt.suptitle("图像基本操作",fontsize = 20,color= "b")
plt.tight_layout(rect=[0,0,1,0.9])
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,颜色为红色。
源码
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams["font.family"] = "SimHei"
#下载手写数字数据集
mnist = tf.keras.datasets.mnist
(train_x,train_y),(test_x,test_y) = mnist.load_data()
#随机从所以测试集中显示16张数字图像
#plt.figure(figsize=(12,12))
for i in range(16):
num = np.random.randint(1,50000)
#16幅图像按照4×4方式排列在一张画布中,每幅图像的子标题为该图像的标签值,字体大小为14
plt.subplot(4,4,i+1)
plt.axis("off")
plt.imshow(train_x[num],cmap="gray")
plt.title("标签值" + str(train_y[num]),fontsize = 14)
# 全局标题为“MNIST测试集样本”,字体大小为20,颜色为红色。
plt.suptitle("MNIST测试集样本",fontsize = 20,color = "r")
plt.tight_layout(rect=[0,0,1,0.9])
plt.show()
① 实验过程中遇到了哪些问题,你是如何解决的?
图片导入失败,发现是路径出错。
② 你知道Keras中还集成了哪些数据集吗?请列举1-2个例子,并进行简单介绍。
③ 在题目基本要求的基础上,你对每个题目做了那些扩展和提升?或者你觉得在编程实现过程中,还有哪些地方可以进行优化?
完全按照题目的要求来做的。