Lesson7---数字图像基础

news2024/11/15 16:46:53

7.1 数字图像基本概念

  • 有人说:计算机视觉是人工智能的大门
  • 计算机视觉成为人工智能应用方面的领头羊
  • 本课实例都是与图像有关的

7.1.1 图像的离散化

7.1.1.1 连续图像和数字图像
  • 连续图像:人眼直接感受到的图像
  • 数字图像:把连续的图像数字化、离散化之后的图像,它是对连续图像的一种近似
7.1.1.2 像素、位图、色彩深度/位深度、BMP格式

图像是如何被离散化的?

  • 像素(pixel):是图像中的一个最小单位
  • 位图(bitmap):通过记录每一个像素值来存储和表达的图像
  • 色彩深度/位深度:位图中每个像素点要用多少个二进制位来表示
  • BMP格式:Windows系统的标准位图格式,他能够很好的兼容各种windows程序
    可以通过windows图片属性查看位深度,决定存储的字节数,这里称为24位真彩色

在这里插入图片描述

7.1.1.3 色彩模式

为什么称为真彩色,除了24位,还有那些喃?

7.1.1.3.1 二值图像(Binary Image)

  1. 每个像素只有2种可能的取值,使用1位二进制来表示,位深度为1;最简单的图像表示方式
    在这里插入图片描述
  2. 在图像处理和分析时,常常首先对图像进行二值化处理
    凸显出感兴趣的目标,有效的减少数据量
  3. 只要是仅有两种颜色的图像,都可以被称为二进制图像

7.1.1.3.2 灰度图像(Gray Image)

  • 每个像素使用1个字节表示,位深度为8,可以表示256种级别的灰度;
  • 0表示黑色;255表示白色 ;1-254表示不同级别的灰色
  • 其他任何一种单一颜色不同亮度的图像都可以称为灰度图像
    在这里插入图片描述
    7.1.1.3.3 彩色图像(RGB)
  • 每个像素都有红(R)、绿(G)、蓝(B)三个分量
  • 1个像素点使用3个字节,位深度为24位
  • 可以表示256×256×256=16777216种颜色
  • 对于人眼,已经可以反映出真实世界,所以称为24位真彩色
  • 通常讲RGB三种分量称为通道,如红色通道

在这里插入图片描述
7.1.1.3.4 RGBA图像

  • RGB图像+8位透明度信息Alpha
  • 这个透明度称为透明度通道,或者Alpha通道
    在这里插入图片描述
    7.1.1.3.5 256色彩色图像
  • 每个像素用8位二进制表示,是调色版中的索引值
    二进制数并不代表确定的颜色,而是调色板中的索引值,对应的颜色是按照索引值在调色板中查询出来的
  • 对于不同的图像,所对应的这256种颜色的集合是不一样的
  • 在保存和加载这种类型的位图时,需要将调色板和图像一同保存和加载

7.1.1.3.6 CMYK-印刷四粉色

  • 每个像素用32位二进制表示
  1. C:Cyan = 青色
  2. M:Magenta = 洋红色
  3. Y:Yellow = 黄色
  4. K:black = 黑色

7.1.1.3.7 YCbCr

  • 是DVD、摄像机、数字电视等消费类视频产品中色彩编码方案
  1. Y:亮度分量
  2. Cb:蓝色亮度分量
  3. Cr:红色亮度分量

7.1.1.3.8 HSI 色彩模型

  • 用H、S、I三个分量来描述
  1. H:色调
  2. S:饱和度
  3. I:亮度
7.1.1.4 图像格式
  • BMP格式:占用存储空间大,不支持文件压缩,不适用于网页
7.1.1.5 图像压缩
  • 适当降低图像质量减小它所占用的空间
  • 不同的图像压缩算法,对应不同得图像格式

7.1.1.5.1 JPEG格式

  • 它是一种有损压缩方案
  • 可以在保证高质量得前提下去除冗余的色彩和图像数据
  • 压缩率高,所占空间小
  • 可以压缩到原图的1/20大小,而图片的质量不会有明显的下降,非常适合存储照片以及在网页中显示照片
  • 适合于色彩丰富、细节清晰细腻得大图像
  • 不适合所含颜色较少,具有大块颜色相近得区域,或亮度差异十分明显的简单图片
  • 每次编辑都会降低图像质量,不适合需要进行多次编辑的情况

7.1.1.5.2 PNG格式(Portable Network Graphics,PNG)

  • 无损压缩,对图像本身质量的减损非常低,逐渐流行起来
  • 适合于有规律渐变色彩的图像
  • 对于色彩丰富,细节清晰细腻的大图表现效果不如JPEG格式

7.1.1.5.3 GIF格式(Graphics Interchange Format)

  • 支持静态格式动态格式
  • 静态格式于JPEG格式的图片类似
  • 动态图片由多幅图片保存为一个图片,循环显示,形成动画效果
  • 只支持256色,适用于色彩简单、颜色较少的小图像

7.1.1.5.4 TIFF格式(Tag Image File Format)

  • 是最复杂的一种图像格式
  • 定义了4类不同类型的格式
  1. 二值图像(TIFF-B)
  2. 黑白灰度图像(TIFF-G)
  3. 带调色板的彩色图像(TIFF-P)
  4. RGB真彩图像(TIFF-R)
  • 支持RGB、JPEG等多种编码方法
  • 具有非常好的扩展性、方便性、可改性,是印刷行业中最常用的格式
  • Web浏览器不支持TIFF格式
7.1.1.6 图像类型

7.1.1.6.1 平面二维图像

  • 前面介绍的所有图像都是平面二维图像

7.1.1.6.2 序列图像

  • 序列图像时间上有一定顺序间隔、内容上相关的一组图像
  1. 视频图像就是一种特殊的序列图像
  2. 其中的每幅图像称为帧图像
  3. 帧图像之间的时间间隔是固定的

7.1.1.6.3 深度图像(Depth Map):

  • 是一种三维场景信息的表达方式
  • 每个像素点的取值,代表这个点离摄像机的距离
  • 采用灰度图表示,每个像素点由一个字节表示
  • 深度图像中,像素点的取值并不代表实际的距离,颜色的深浅只是代表相对距离的远近

7.2 Pillow图像处理库

上节回顾

  • 位图:通过记录每一个像素的颜色值,来存储和表达图像
  • 图像格式:BMP、JPEG、PNG、GIF、TIFF
  • 色彩模式:二值图像、灰度图像、RGB图像、RGBA图像、256色图像、CMYK、YCbCr、HSI

7.2.1 一些图像处理库

7.2.1.1 matplotlib.image方式
  • 仅支持导入PBG格式的图像,且功能有限
7.2.1.2 PIL(Python Imaging Library)
  • 功能丰富,且简单易用
  • 但是仅支持Python2.x版本,且已经停止更新

7.2.2 Pillow库

  • 在PIL的基础上发展而成的兼容版本
  • 支持python 3
7.2.2.1 安装和导入包/模块

7.2.2.1.1 Pillow的安装

  • 使用Anaconda已经安装好
  • 使用pip命令安装
pip install pillow

7.2.2.1.2 导入PIL.image模块

  • pillow的核心仍是PIL,所以在使用之前仍要导入PIL中image模块
from PIL import Image
  • iamge模块中有一个image类,通过image类的函数和方法和属性完成对图像的读取、显示和简单的操作

7.2.2.1.3 导入matplotlib.pyplot模块

  • 要使用matplotlib.pyplot来显示图片
import matplotlib.pyplot as plt
7.2.2.2 打开图像–Image.open()函数
Image.open(路径)# 返回image对象

有一个经常使用的图像叫做lena.tiff可以在网上下载,网址为http://www.lenna.org/
然后可以在该文件目录下打开

img = Image.open('lena.tiff')

得到图像对象img

7.2.2.3 保存图像-save()方法
图像对象.save(文件路径)
  • 参数是被保存的文件路径
  • 对于上述lena.tiff图片就是
img.save('test.tiff')
  • save()方法不仅能够保存图像,还可以改变文件名的后缀,就可以转换图像格式
img.save('lena.jpg') # 将原图存储为jpg格式
img.save('lena.bmp') # 将原图存储为bpm格式
7.2.2.4 图像对象的主要属性
属性说明
图像对象.format图像格式
图像对象.size图像尺寸
图像对象.mode色彩模式

例如:

>>> from PIL import Image 
>>> import matplotlib.pyplot as plt

>>> img = Image.open('lena.tiff') 
>>> img.save('test.tiff') 
>>> img.save('test.jpg')  
>>> img.save('test.bmp') 
>>> img1 = Image.open("test.jpg") 
>>> img2 = Image.open("test.bmp") 


>>> print("image:",img.format) 
image: TIFF
>>> print("image1:",img1.format) 
image1: JPEG
>>> print("image2:",img2.format) 
image2: BMP



>>> print("size:",img.size) 
size: (512, 512)
>>> print("mode:",img.mode) 
mode: RGB

7.2.2.5 显示图像
  • 可以使用matpltlib.pyplot模块中的 imshow()函数show()函数显示图像

  • plt.figure()首先创建画布

  • imshow()函数负责对图像进行处理,并且显示它的格式

  1. 参数cmap=“gray”;意思是图像都是以灰度图像显示的
plt.imshow(image对象/Numpy数组) 
  • 然后调用show()函数显示出来
>>> plt.figure(figsize=(5,5))
<Figure size 500x500 with 0 Axes>
>>> plt.imshow(img)   
<matplotlib.image.AxesImage object at 0x0000022508D1B908>
>>> plt.show()

运行结果为:

在这里插入图片描述

7.2.2.6 分别显示不同类别的图像
from PIL import Image 
import matplotlib.pyplot as plt

img = Image.open('lena.tiff') 
img.save('test.tiff') 
img.save('test.jpg')
img.save('test.bmp')
img = Image.open("test.tiff")
img1 = Image.open("test.jpg")
img2 = Image.open("test.bmp")

plt.figure(figsize=(15,5))

plt.subplot(131)
plt.axis("off")
plt.imshow(img)
plt.title(img.format)

plt.subplot(132)
plt.axis("off")
plt.imshow(img1)
plt.title(img1.format)

plt.subplot(133)
plt.axis("off")
plt.imshow(img2)
plt.title(img2.format)

plt.show()

结果输出为:

在这里插入图片描述

7.2.2.7 转换图像的色彩模式
取值色彩模式
1二值图像(每个像素8位二进制)
L灰度图像
P8位彩色图像
RGB24位彩色图像
RGBA32位彩色图像
CMYKCMYK彩色图像
YCbCrYCbCr彩色图像
I32位整型灰度图像
F32位浮点灰度图像
图像对象.convert(色彩模式)

例如:

img_gray = img.convert("L")
print("mode=",img_gray.mode)

plt.figure(figsize=(5,5))
plt.imshow(img_gray)
plt.show()

输出结果为:
在这里插入图片描述
本来我寻思着为啥我这个还带点青色,难道我运行错了,本来想留着这个疑问,但是当我存储以后,发现是这样的:

在这里插入图片描述
还可以使用save()方法将其存储为新的文件

img_gray.save("lena_gray.bmp")
  • 虽然使用convert()函数也可以把灰度图像转换为彩色图像,但是实际上很难恢复到原来的样子
7.2.2.8 颜色通道的分离与合并
图像对象.split()
Image.merge(色彩模式,图像列表)

例如:

from PIL import Image 
import matplotlib.pyplot as plt

img = Image.open('lena.tiff') 
img_r,img_g,img_b = img.split()

plt.figure(figsize=(8,8))

plt.subplot(221)
plt.axis("off")
plt.imshow(img_r,cmap="gray")# cmap是以灰度的方式显示
plt.title("R",fontsize=20)

plt.subplot(222)
plt.axis("off")
plt.imshow(img_g,cmap="gray")
plt.title("G",fontsize=20)

plt.subplot(223)
plt.axis("off")
plt.imshow(img_b,cmap="gray")
plt.title("B",fontsize=20)

img_rgb = Image.merge("RGB",[img_r,img_g,img_b])
# 使用merge方法将所有的通道合并
plt.subplot(224)
plt.axis("off")
plt.imshow(img_rgb)
plt.title("RGB",fontsize=20)

plt.show()

输出结果为:

在这里插入图片描述

  • RGB通道采用灰度图表示颜色的亮度,R图R通道中,颜色越浅,表示红色越亮,颜色越深,表示红色越暗
7.2.2.9 转化为数组
  • 计算机处理图象时,有时候会先把转化为数组
  • 数组中的元素对应像素中的各个像素点,然后再逐像素的进行计算和处理
  • 将图像对象转化为numpy数组
np.array(图像对象)
import numpy as np
arr_img = np.array(img)
print("shape:",arr_img.shape,"\n")
print(arr_img)

输出结果为

shape: (512, 512, 3)

[[[226 137 125]
  [226 137 125]
  [223 137 133]
  ...
  [230 148 122]
  [221 130 110]
  [200  99  90]]

 [[226 137 125]
  [226 137 125]
  [223 137 133]

 ...


 [[ 82  22  57]
  [ 82  22  57]
  [ 96  32  62]
  ...
  [179  70  79]
  [181  71  81]
  [185  74  81]]]

7.2.2.9.1 将灰度图像lena_gray.bmp转化为数组(反色)

from PIL import Image 
import matplotlib.pyplot as plt
import numpy as np
# 已经创建了lena_gray.bmp文件

img_gray = Image.open("lena_gray.bmp")
arr_img_gray = np.array(img_gray)
print("\nshape:",arr_img_gray.shape)
print(arr_img_gray)

输出结果为:

shape: (512, 512)

[[162 162 162 ... 170 155 128]
 [162 162 162 ... 170 155 128]
 [162 162 162 ... 170 155 128]
 ...
 [ 43  43  50 ... 104 100  98]
 [ 44  44  55 ... 104 105 108]
 [ 44  44  55 ... 104 105 108]]

我们可以对这个值做一些处理:

from PIL import Image 
import matplotlib.pyplot as plt
import numpy as np

img_gray = Image.open("lena_gray.bmp")
arr_img_gray = np.array(img_gray)

# 新数组每个值都是原来的灰度值被255减去
arr_img_new = 255 - arr_img_gray

plt.figure(figsize=(10,5))

plt.subplot(221)
plt.axis("off")
plt.imshow(arr_img_gray,cmap="gray")

plt.subplot(222)
plt.axis("off")
plt.imshow(arr_img_new,cmap="gray")

plt.show()

输出结果为:

在这里插入图片描述

  • 可以看到图像中的灰度和原图正好相反
  • Image模块中还提供了很多封装好的函数,可以直接对图片进行更上层的处理,不用转换为数组,对像素进行运算
7.2.2.10 对图像的缩放、旋转和镜像

7.2.2.10.1 缩放图像

7.2.2.10.1.1 img.resize()方法

图像对象.resize((width,height))

例如

from PIL import Image 
import matplotlib.pyplot as plt
import numpy as np

img = Image.open("lena.tiff")

plt.figure(figsize=(5,5))
img_small = img.resize((64,64))

#将其保存起来
img_small.save("lena_s.jpg")

plt.imshow(img_small)
plt.show()

输出结果为:

  • 可以看到图片的质量明显下降了,出现了类似马赛克的效应,可以看到现在图片的尺寸已经变成了64*64,这个操作是一个降采样的过程

7.2.2.10.1.2 img.thumbnail()方法

  • 该方法是原地操作,返回值是none
  • 也就是说直接对img对象进行了缩放

7.2.2.10.2 旋转、镜像(即左右翻转)

图像对象.transpose(旋转方式)

通过参数选择旋转或者翻转的方式

参数说明
Image.FLIP_LEFT_RIGHT水平翻转
Image.FLIP_TOP_BOTTOM上下翻转
Image.ROTATE_90逆时针旋转90°
Image.ROTATE_180逆时针旋转180°
Image.ROTATE_270逆时针旋转270°
Image.TRANSPOSE将图像进行转置
Image.TRANSVERSE将图像进行转置,再水平翻转

例如:

img_flr = img.transpose(Image.FLIP_LEFT_RIGHT)
img_r90 = img.transpose(Image.ROTATE_90)
img_tp = img.transpose(Image.TRANSPOSE)

例如,下面将这些变换的结果分别显示在不同的子图中

from PIL import Image 
import matplotlib.pyplot as plt
import numpy as np

plt.rcParams['font.sans-serif'] = "SimHei"
img = Image.open("lena.tiff")

plt.figure(figsize=(10,10))

plt.subplot(221)
plt.axis("off")
plt.imshow(img)
plt.title("原图",fontsize=20)

plt.subplot(222)
plt.axis("off")
img_flr = img.transpose(Image.FLIP_LEFT_RIGHT)
plt.imshow(img_flr)
plt.title("左右翻转",fontsize=20)

plt.subplot(223)
plt.axis("off")
img_r90 = img.transpose(Image.ROTATE_90)
plt.imshow(img_r90)
plt.title("逆时针旋转90度",fontsize=20)

plt.subplot(224)
plt.axis("off")
img_tp = img.transpose(Image.TRANSPOSE)
plt.imshow(img_tp)
plt.title("转置",fontsize=20)

plt.show()

输出结果为:

在这里插入图片描述

7.2.2.11 裁剪图像
  • 裁剪图像:再图像上指定的位置裁剪出一个矩形区域
图像对象.crop((x0,y0,x1,y1))
  • x0,y0 为左上角
  • x1,y1 为右下角
  • 返回值:图像对象
img_region = img.crop((100,100,400,400))

例如:

from PIL import Image 
import matplotlib.pyplot as plt

img = Image.open("lena.tiff")

plt.figure(figsize=(10,5))

plt.subplot(121)
plt.imshow(img)

plt.subplot(122)
img_region = img.crop((100,100,400,400))# 注意y轴是从上往下而从小到大的
plt.imshow(img_region)

plt.show()

输出结果为:
在这里插入图片描述

7.2.3 常用的图像处理库

  • skimage
  • cv2

7.3 实例:手写数字数据集MNIST

7.3.1 图像操作汇总表

图像操作方法/函数/属性
打开图像Image.open(路径)
保存图像图像对象.save()
查看图像的属性图像对象.format、图像对象.size、图像对象.mode
显示图像plt.imshow(Image对象/Numpy数组)
转移图像的色彩模式图像对象.convert(色彩模式)
颜色通道的分离和合并图像对象.split()、Image.merge(色彩模式,图像列表)
将图像转换为数组np.array(图像对象)
图像的缩放图像对象.resize((width,height))
旋转和镜像图像对象.transpose(旋转方式)

7.3.2 MNIST数据集

  • Mixed National Institute of standards and Technology and Technology database
  • New York University, Yann LeCun
  • 60000条训练数据和10000条测试数据
  • 由250个不同的人手写而成
  • 都是28*28像素,灰度图像
  • 将每一副图片存储在28*28的二维数组中,数组中的每个元素对应着图片中的每个像素
  • MNIST数据集已经被集成在keras中了,可以使用keras中的datasets模块来访问它
7.3.2.1 下载MNIST数据集
import tensorflow as tf
mnist = tf.keras.datasets.mnist
(train_x,train_y),(test_x,test_y) = mnist.load_data()

第一次会先进行下载:

Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/mnist.npz
 11493376/11490434 [==============================] - 12s 1us/step
  • 下载路径:C:\Users\Administrator\.keras\datasets\mnist.npz
7.3.2.2 输出训练集和测试集的长度
print("Training set:",len(train_x))
print("testing set:",len(test_x))

输出结果为:

Training set: 60000
testing set: 10000
7.3.2.4 显示手写数字图片

7.3.2.4.1 输出数据集中的第1个样本

  • 这是一个28*28中的数组,数组中的每个元素对应图像的一个像素
  • 因为数字的背景为黑色,数字不为零的元素就是手写的笔画的部分
>>> train_x[0] 
array([[  0,   0,   0,   0,   0,   0,   0,   0,   
0,   0,   0,   0,   0,
          0,   0,   0,   0,   0,   0,   0,   0,   
0,   0,   0,   0,   0,
          0,   0],
       [  0,   0,   0,   0,   0,   0,   0,   0,   
0,   0,   0,   0,   0,
          0,   0,   0,   0,   0,   0,   0,   0,   
0,   0,   0,   0,   0,
          0,   0],
       [  0,   0,   0,   0,   0,   0,   0,   0,   
0,   0,   0,   0,   0,
          0,   0,   0,   0,   0,   0,   0,   0,   
0,   0,   0,   0,   0,
          0,   0],
       [  0,   0,   0,   0,   0,   0,   0,   0,   
0,   0,   0,   0,   0,
          0,   0,   0,   0,   0,   0,   0,   0,   
0,   0,   0,   0,   0,
          0,   0],
       [  0,   0,   0,   0,   0,   0,   0,   0,   
0,   0,   0,   0,   0,
          0,   0,   0,   0,   0,   0,   0,   0,   
0,   0,   0,   0,   0,
          0,   0],
       [  0,   0,   0,   0,   0,   0,   0,   0,   
0,   0,   0,   0,   3,
         18,  18,  18, 126, 136, 175,  26, 166, 255, 247, 127,   0,   0,
          0,   0],
       [  0,   0,   0,   0,   0,   0,   0,   0,  30,  36,  94, 154, 170,
        253, 253, 253, 253, 253, 225, 172, 253, 242, 195,  64,   0,   0,
          0,   0],
       [  0,   0,   0,   0,   0,   0,   0,  49, 238, 253, 253, 253, 253,
        253, 253, 253, 253, 251,  93,  82,  82,  56,  39,   0,   0,   0,
          0,   0],
       [  0,   0,   0,   0,   0,   0,   0,  18, 219, 253, 253, 253, 253,
        253, 198, 182, 247, 241,   0,   0,   0,   
0,   0,   0,   0,   0,
          0,   0],
       [  0,   0,   0,   0,   0,   0,   0,   0,  80, 156, 107, 253, 253,
        205,  11,   0,  43, 154,   0,   0,   0,   
0,   0,   0,   0,   0,
          0,   0],
       [  0,   0,   0,   0,   0,   0,   0,   0,   
0,  14,   1, 154, 253,
         90,   0,   0,   0,   0,   0,   0,   0,   
0,   0,   0,   0,   0,
          0,   0],
       [  0,   0,   0,   0,   0,   0,   0,   0,   
0,   0,   0, 139, 253,
        190,   2,   0,   0,   0,   0,   0,   0,   
0,   0,   0,   0,   0,
          0,   0],
       [  0,   0,   0,   0,   0,   0,   0,   0,   
0,   0,   0,  11, 190,
        253,  70,   0,   0,   0,   0,   0,   0,   
0,   0,   0,   0,   0,
          0,   0],
       [  0,   0,   0,   0,   0,   0,   0,   0,   
0,   0,   0,   0,  35,
        241, 225, 160, 108,   1,   0,   0,   0,   
0,   0,   0,   0,   0,
          0,   0],
       [  0,   0,   0,   0,   0,   0,   0,   0,   
0,   0,   0,   0,   0,
         81, 240, 253, 253, 119,  25,   0,   0,   
0,   0,   0,   0,   0,
          0,   0],
       [  0,   0,   0,   0,   0,   0,   0,   0,   
0,   0,   0,   0,   0,
          0,  45, 186, 253, 253, 150,  27,   0,   
0,   0,   0,   0,   0,
          0,   0],
       [  0,   0,   0,   0,   0,   0,   0,   0,   
0,   0,   0,   0,   0,
          0,   0,  16,  93, 252, 253, 187,   0,   
0,   0,   0,   0,   0,
          0,   0],
       [  0,   0,   0,   0,   0,   0,   0,   0,   
0,   0,   0,   0,   0,
          0,   0,   0,   0, 249, 253, 249,  64,   
0,   0,   0,   0,   0,
          0,   0],
       [  0,   0,   0,   0,   0,   0,   0,   0,   
0,   0,   0,   0,   0,
          0,  46, 130, 183, 253, 253, 207,   2,   
0,   0,   0,   0,   0,
          0,   0],
       [  0,   0,   0,   0,   0,   0,   0,   0,   
0,   0,   0,   0,  39,
        148, 229, 253, 253, 253, 250, 182,   0,   
0,   0,   0,   0,   0,
          0,   0],
       [  0,   0,   0,   0,   0,   0,   0,   0,   
0,   0,  24, 114, 221,
        253, 253, 253, 253, 201,  78,   0,   0,   
0,   0,   0,   0,   0,
          0,   0],
       [  0,   0,   0,   0,   0,   0,   0,   0,  23,  66, 213, 253, 253,
        253, 253, 198,  81,   2,   0,   0,   0,   
0,   0,   0,   0,   0,
          0,   0],
       [  0,   0,   0,   0,   0,   0,  18, 171, 219, 253, 253, 253, 253,
        195,  80,   9,   0,   0,   0,   0,   0,   
0,   0,   0,   0,   0,
          0,   0],
       [  0,   0,   0,   0,  55, 172, 226, 253, 253, 253, 253, 244, 133,
         11,   0,   0,   0,   0,   0,   0,   0,   
0,   0,   0,   0,   0,
          0,   0],
       [  0,   0,   0,   0, 136, 253, 253, 253, 212, 135, 132,  16,   0,
          0,   0,   0,   0,   0,   0,   0,   0,   
0,   0,   0,   0,   0,
          0,   0],
       [  0,   0,   0,   0,   0,   0,   0,   0,   
0,   0,   0,   0,   0,
          0,   0,   0,   0,   0,   0,   0,   0,   
0,   0,   0,   0,   0,
          0,   0],
       [  0,   0,   0,   0,   0,   0,   0,   0,   
0,   0,   0,   0,   0,
          0,   0,   0,   0,   0,   0,   0,   0,   
0,   0,   0,   0,   0,
          0,   0],
       [  0,   0,   0,   0,   0,   0,   0,   0,   
0,   0,   0,   0,   0,
          0,   0,   0,   0,   0,   0,   0,   0,   
0,   0,   0,   0,   0,
          0,   0]], dtype=uint8)

7.3.2.4.2 显示图片

import tensorflow as tf
import matplotlib.pyplot as plt

mnist = tf.keras.datasets.mnist
(train_x,train_y),(test_x,test_y) = mnist.load_data()

plt.axis("off")
plt.imshow(train_x[0],cmap="gray")
plt.show()

输出结果为:

在这里插入图片描述

  • 下面输出这个图片的标签
>>> train_y[0] 
5

7.3.2.4.3 随机显示4幅手写数字图片

import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np

mnist = tf.keras.datasets.mnist
(train_x,train_y),(test_x,test_y) = mnist.load_data()


for i in range(4):
	num = np.random.randint(1,60000)

	plt.subplot(1,4,i+1)
	plt.axis("off")
	plt.imshow(train_x[num],cmap="gray")
	plt.title(train_y[num])

plt.show()

输出结果为:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/360446.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【论文阅读】SSR-Net: 一个小型的 软分段回归网络 用于年龄估计

原始题目SSR-Net: A Compact Soft Stagewise Regression Network for Age Estimation中文名称SSR-Net: 一个小型的 软分段回归网络 用于年龄估计发表时间2018年7月13日平台IJCAI-18来源台湾中央研究院、国立台湾大学文章链接https://www.ijcai.org/proceedings/2018/0150.pdf开…

【LeetCode】剑指 Offer(6)

目录 写在前面&#xff1a; 题目&#xff1a;剑指 Offer 12. 矩阵中的路径 - 力扣&#xff08;Leetcode&#xff09; 题目的接口&#xff1a; 解题思路&#xff1a; 代码&#xff1a; 过啦&#xff01;&#xff01;&#xff01; 写在最后&#xff1a; 写在前面&#xff…

Java代码加密混淆工具有哪些?

在Java中&#xff0c;代码加密混淆工具可以帮助开发者将源代码进行加密和混淆处理&#xff0c;以增加代码的安全性和保护知识产权。以下是一些流行的Java代码加密混淆工具&#xff1a; 第一款&#xff1a;ProGuard&#xff1a;ProGuard      ProGuard&#xff1a;ProGuard…

Springboot接口多个DTO入参的Postman上传方式

在Java中使用Spring Boot框架时&#xff0c;可以同时使用多个DTO作为方法参数。 TO&#xff08;Data Transfer Object&#xff09;是一个常见的设计模式&#xff0c;用于封装数据传输对象。它通常用于将数据从一个层传递到另一个层&#xff0c;例如将数据从服务层传递到控制器…

2023 年 1 月区块链操作系统的开发回顾

副标题&#xff1a;查看 Cartesi Machine、Cartesi Rollups 和 Noether 的更新正在寻找区块链操作系统组件的最新进展&#xff1f;你找对地方了&#xff01;正如在我们的路线图文章中所描述的那样&#xff0c;我们一直在朝着定期且频繁的更新方向发展着&#xff0c;以便让我们的…

阅读笔记——Feature-Point Matching for Aerial and Ground Images方法

阅读笔记——Feature-Point Matching for Aerial and Ground Images 1.应用背景 在三维重建应用中&#xff0c;常用的是航空影像&#xff0c;但在城市环境中&#xff0c;面对大量的高层建筑物&#xff0c;航空影像往往不能很好的重建出完整的三维模型。因为航空影像视角约束以…

DataGear 4.5.0 发布,数据可视化分析平台

DataGear 4.5.0 发布&#xff0c;带来数据集计算属性新功能&#xff0c;具体更新内容如下&#xff1a; 新增&#xff1a;数据集属性新增计算表达式功能&#xff0c;可对原始数据进行二次计算处理&#xff1b;新增&#xff1a;HTTP接口数据集新增文本、XML请求体类型支持&#…

Hadoop HDFS的架构、高可用与容错机制

本次整理的学习笔记的是Hadoop HDFS的架构、高可用与容错机制&#xff0c;供大家参考学习&#xff0c;enjoy~~ 一、HDFS的架构 1&#xff0c;NameNode &#xff08;1&#xff09; 存储文件的metadata&#xff0c;运行时所有数据都保存到内存&#xff0c;整个HDFS可存储的文件数…

V4L2操作流程

打开设备–>获取设备capability–>选择视频输入–>设置视频制式及帧格式–>向驱动申请帧缓冲(不超过5个)–>申请物理地址–>开始视频采集–>出队列取得已经采集数据的帧缓冲&#xff0c;获得原始采集数据–>停止视频采集–>关闭视频设备。 常用数据…

轻量级SSH实现之Dropbear

轻量级SSH实现之Dropbear dropbear简介 Dropbear是一个轻量级的SSH服务器和客户端的实现。它运行在 各种 UNIX 平台。 Dropbear 是开源实现&#xff0c;MIT 分发 许可证。 Dropbear在嵌入式Linux&#xff08;或其他Unix&#xff09;系统广泛应用&#xff0c;例如无线路由器。…

蛋白质组学技术与常见分析培训班火热招生中!

什么是蛋白质组学&#xff1f; 蛋白质组学(proteomics)&#xff0c;是以蛋白质组为研究对象&#xff0c;研究细胞、组织或生物体蛋白质组成及其变化规律的科学。包括蛋白质的表达水平&#xff0c;翻译后修饰&#xff0c;蛋白与蛋白相互作用等研究内容&#xff0c;集中于动态描述…

华为机试JavaScript 字符串按次数降序排列;次数相同,按单词长度升序;排列次数和单词长度均相同,按字典升序排列

华为机试练习&#xff1a; 题目要求 1. 给定一个字符串s&#xff0c;s包括以空格分隔的若干个单词&#xff0c;请对s进行如下处理后输出:单词内部调整:对每个单词字母重新按 字典序排序 2、单词间顺序调整: 1) 统计每个单词出现的次数&#xff0c;并按次数 降序排列 …

【Kubernetes】【十四】Pod控制器详解 DaemonSet(DS) Job CronJob(CJ)

DaemonSet类型的控制器可以保证在集群中的每一台&#xff08;或指定&#xff09;节点上都运行一个副本。一般适用于日志收集、节点监控等场景。也就是说&#xff0c;如果一个Pod提供的功能是节点级别的&#xff08;每个节点都需要且只需要一个&#xff09;&#xff0c;那么这类…

05 基于STL的演讲比赛流程管理系统

文件基本上是黑马程序员的文档&#xff0c;部分添加自己需要的内容&#xff0c;仅用于自己学习&#xff01;链接&#xff1a;黑马程序视频课程GitHub:链接 演讲比赛流程管理系统 1、 演讲比赛程序需求 1.1 比赛规则 学校举行一场演讲比赛&#xff0c;共有12个人参加。比赛共…

江南爱窗帘十大品牌 | 窗帘的定做有哪些技巧和注意事项?

人们的家居空间中总是会有各式各样的窗帘存在的&#xff0c;为了使得窗帘的品质更加的过关&#xff0c;人们在选购时&#xff0c;总是会希望可以购买到高品质的。一般情况下&#xff0c;会采用定制这种方法去进行制作。那么&#xff0c;窗帘的定做有哪些注意事项?窗帘定制技巧…

PX4之启动脚本

PX4通过rcS脚本来设定需要启动的程序&#xff0c;比如设备驱动、控制模块、数据通信等。rcS脚本在项目中的文件位置 ROMFS/px4fmu_common/rcS 对应硬件平台固件上的位置 /etc/init.d/rcS 启动脚本流程如下 #!/bin/sh # PX4FMU startup script. # # 一些注释 ## 设置默认参…

【HDFS】FsDatasetImpl#convertTemporaryToRbw方法

功能: 把一个temporary副本转换成RBW副本。 方法的参数: 正在被转换成Rbw状态的的Temporary状态副本。 调用场景: datanode接收一个块的数据完成时,如果stage处于BlockConstructionStage.TRANSFER_RBW,那么就需要把temporary副本转换成RBW类型副本。 注意点: TEMPORARY副…

python 打包EXE

注&#xff1a; 从个人博客园 移植而来 环境&#xff1a; Windows7 Python 2.7 参考&#xff1a; 使用pyinstaller打包python程序 Pyinstaller 打包发布经验总结 Using PyInstaller 简介 使用python引用第三方的各种模块编写一个工具后&#xff0c;如果想发给其他人&…

Python基础-环境安装

Python安装1.下载PythonPython网址&#xff1a;https://www.python.org/进入Python官网&#xff0c;点击Downloads&#xff0c;选择自己对应的操作系统&#xff08;此处以Windows为例&#xff09;在左侧的稳定发行版中&#xff0c;选择一个3.5版本以上的&#xff0c;然后点击对…

2003-Can‘t connect to MySQL server on ‘192.168.232.128(10060 “Unknown error“)

MySQL远程连接报错2003-cant connection to mysql server on ‘IP’&#xff08;10061 unknown error&#xff09;的解决 **首先去看有没有关闭防火墙&#xff01;&#xff01;&#xff01;** 停止firewall服务 systemctl stop firewalld.service 禁止firewall开机启动 syste…