0%

TensorFlow实践之数字图像处理基础

计算机视觉是人工智能的大门,其已成为人工智能应用方向的领头羊。故掌握数字图像处理的基础十分必要。本文主要介绍了导入Pillow库中的Image对图像进行简单处理的方法。

图像的打开与保存

  • 导入模块from PIL import Image

  • 打开图像Image.open()#返回图像对象

  • 保存图像Image.save(文件路径)#改变文件名后缀,就可以转换图像格式

  • 图像对象的主要属性

    属性 说明
    图像对象.format 图像格式
    图像对象.size 图像尺寸
    图像对象.mode 色彩模式
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    import matplotlib.pyplot as plt
    from PIL import Image
    #打开图像
    img=Image.open("lena.tiff")
    #保存图像
    img.save("test.tiff")
    img.save("lena.jpg")
    img.save("lena.bmp")
    #查看图像对象的主要属性
    img1=Image.open("lena.jpg")
    img2=Image.open("lena.bmp")
    print("The format:",img2.format)
    print("The size:",img2.size)
    print("The mode:",img2.mode)

    结果如下:

    image-20221028221253149

显示图像

  • plt.imshow(image对象/Numpy数组)#对图像进行处理并显示其格式

  • plt.show()#将处理后的图像显示

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    #显示图像
    #设置画布尺寸
    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()

    结果如下:

    image-20221028221709477


转换图像的色彩模式

  • 图像对象.convert(色彩模式)

    取值 色彩模式
    1 二值图像(仍是8位数据,0x00与0xFF)
    L 灰度图像
    P 8位彩色图像
    RGB 24位彩色图像
    RGBA 32位彩色图像
    CMYK CMYK彩色图像
    YCbCr YCbCr彩色图像
    I 32位整数灰度图像
    F 32位浮点灰度图像
    1
    2
    3
    4
    #转换图像的色彩模式
    img_convert=img.convert("L")
    print("The convert mode:",img_convert.mode)#img_convert是一个新的图像对象
    img_convert.save("img_Gray.bmp")

    结果如下:

    image-20221028222519861

    image-20221028222455045


颜色通道的分离与合并

  • 分离图像对象.split()

  • 合并Image.merge(色彩模式,图像列表)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    #颜色通道的分离与合并
    #1.分离
    img_r,img_g,img_b=img.split()

    #显示分离后的效果
    plt.figure(figsize=(10,10))
    plt.subplot(221)
    plt.axis("off")
    plt.imshow(img_r,cmap="gray")
    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)

    #2.合并
    img_rgb=Image.merge("RGB",[img_r,img_g,img_b])
    plt.subplot(224)
    plt.axis("off")
    plt.imshow(img_rgb)
    plt.title("RGB",fontsize=20)

    #显示处理后的图像
    plt.show()

    结果如下:

    image-20221028222912075

将图像数据转化为数组

  • np.array(图像对象)

    1
    2
    3
    4
    #将图像数据转化为数组
    import numpy as np
    img_array=np.array(img)
    print("The shape:",img_array.shape)

    结果如下:

    image-20221028223116921

图像的缩放、旋转和裁剪

  • 缩放

    • 图像对象.resize((width,height))
    • 图像对象.thumbnail((width,height))#其返回值是None,也就是直接对图像对象进行了缩放
  • 旋转、镜像

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

    • 旋转方式:

      操作 对应旋转方式
      Image.Transpose.FLIP_LEFT_RIGHT 水平翻转
      Image.Transpose.FLIP_TOP_BOTTOM 上下翻转
      Image.Transpose.ROTATE_90 逆时针旋转90
      Image.Transpose.ROTATE_180 逆时针旋转180
      Image.Transpose.ROTATE_270 逆时针旋转270
      Image.Transpose.TRANSPOSE 将图像进行转置
      Image.Transpose.TRANSVERSE 将图像进行转置,再水平翻转
  • 裁剪:在图像上指定的位置裁剪出一个矩形区域

    • 图像对象.crop((x0,y0,x1,y1))
    • x0,x0对应左上角坐标;x1,y1对应右下角坐标
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#对图像进行缩放和旋转和裁剪
#1.缩放图像
img_resize=img.resize((64,64))
#2.旋转图像
img_transpose=img.transpose(Image.Transpose.ROTATE_90)
#3.裁剪图像
img_crop=img.crop((100,100,400,400))
#显示图像
plt.figure(figsize=(10,10))
plt.subplot(221)
plt.axis("off")
plt.imshow(img)
plt.title("img",fontsize=20)

plt.subplot(222)
plt.axis("off")
plt.imshow(img_resize)
plt.title("img_resize",fontsize=20)

plt.subplot(223)
plt.axis("off")
plt.imshow(img_transpose)
plt.title("img_transpose",fontsize=20)

plt.subplot(224)
plt.axis("off")
plt.imshow(img_crop)
plt.title("img_crop",fontsize=20)

plt.show()

结果如下:

image-20221028224240134

实例分析:手写数字数据集MNIST

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
#下载MNIST数据集
mnist=tf.keras.datasets.mnist
(train_x,train_y),(test_x,test_y)=mnist.load_data(path="D:\App_Data_File\Anaconda_data\jupyter\image\mnist.npz")

#随机显示四幅手写图
for i in range(4):
num=np.random.randint(1,50000)
plt.subplot(1,4,i+1)
plt.axis("off")
plt.imshow(train_x[num],cmap="gray")
plt.title(train_y[num])

plt.show()

结果如下:

image-20221028224752246
欢迎来到ssy的世界