1. 数字图像基础
人眼直接感受到的图像是连续的模拟图像,为了计算机对图像进行加工,需要把连续的图像数字化、离散化,加工后的图像就是数字图像。
属性 | 说明 |
---|---|
像素 | 图像中最小的单位 |
位图 | 通过记录每一个像素值来存储和表达的图像 |
色彩深度(位深度) | 位图中每个像素点要用多少个二进制位来表示 |
BMP格式 | Windows系统标准位图格式 |
图像种类
- 二值图像(Binary Image):每个像素只有2种可能,使用1位二进制来表示,位深度位1。即只有两种颜色的图像都称之为二值图像。图像处理分析前对图像进行二值化处理能突出目标并有效减小数据量
- 灰度图像(Gray Image):每个像素使用1个字节表示,位深度为8,可以表示256种级别的灰度,0表示黑色,255表示白色。
- 彩色图像(RGB):每个像素都有红、绿、蓝三个分量,1个像素点使用三个字节,位深度为24位,可表示256×256×256=16777216种颜色。又称为24位真彩色图像。
- RGBA图像:RGB图像+8位透明度信息Alpha,又称为32位真彩色图像,即一个像素点使用4个字节,位深度为32位。
- 256色彩色图像:每个像素用8位二进制表示,是调色板种的索引值。对于不同的图像,对应的256种颜色的集合是不一样的,所以在保存和加载这种类型的位图时,需要将调色板和图像以统保存和加载。
图像格式
- 图像压缩:降低图像质量来减小所占存储空间,不同的图像压缩算法对应不同的图像格式
- BMP格式:占用存储空间大,不支持文件压缩,不适用于网页。
- JPEG格式:常用的有损压缩图片格式,保证图像质量的前提下去除冗余的图像和色彩数据,压缩率高,所占空间小。适用于色彩丰富、细节清晰细腻的大图像。不适用于颜色种类少、图片种大块颜色相近,或亮度差异明显的简单图片。该格式图像每次编辑都会降低图像质量,不适合需要多次编辑的图像。
- PNG格式:无损压缩,社和与有规律渐变色彩的图像。
- GIF格式:支持静态格式和动态格式,动态格式的图片由多幅图片保存为一幅图像循环显示。GIF格式支持256色,适用于色彩简单种类较少的小图像。
- TIFF格式:图像格式中最复杂的一种,TIFF格式又有二值图像(TIFF-8)、黑白灰度图像(TIFF-G)、带调色板的彩色图像(TIFF-P)、RGB真彩色图像(TIFF-R)四种不同类型的格式,TIFF格式支持
RGB
、JPEG
等多种编码方法,具有良好的扩展性、方便些、可改变性,常用于印刷行业。Web浏览器不支持此格式。
色彩模型
- 二值图像:黑、白
- 灰度图像:黑、白、灰
- RGB图像:红、绿、蓝
- RGBA图像:红、绿、蓝、8位透明度信息Alpha
- CMYK图像(印刷色):青色(Cyan)、洋红色(Magenta)、黄色(Yellow)、黑色(Black)
- YCbCr图像:亮度(Y)、蓝色色度(Cb)、红色色度(Cr)分量
- HSI图像色彩模型:色调(H)、饱和度(S)、亮度(I)
图像类型
- 序列图像:时间上有一定的顺序和间隔,内容上相关的一组图像。其中的每幅图像称为帧图像,帧图像之间的时间间隔固定。
- 深度图像:一种三维场景信息的表达方式,每个像素点的取值代表这个点离摄像机的距离。通常采用灰度图来表示,每个像素点由一个字节表示,但深度图像中像素点的取值并不代表实际的距离,颜色的深浅只是代表相对距离的远近。
2. Pillow图像处理库
基本操作
- 导入PIL.image模块,后续操作中还需要matplotlib库中的pyplot模块显示图片
from PIL import image
import matplotlib.pyplot as plt
Image.open()
函数打开图像
Image.open(文件路径)
path='./pic/lena512color.tiff'
img=Image.open(path)
save()
方法保存图像:保存时可以改变文件名后缀来转换图像格式
面向对象.save(文件路径)
img.save('./pic/lena.tiff')
img.save('./pic/lena.jpg')
- 图像对象属性
属性 | 说明 |
---|---|
图像对象.format | 图像格式 |
图像对象.size | 图像尺寸 |
图像对象.mode | 色彩模式 |
print(img.format) #TIFF
print(img.size) #(512, 512)
print(img.mode) #RGB
- 显示图像:
imshow()
函数负责对图像进行处理并显示其格式,但是不能显示图片,show()
函数显示处理后的图像
plt.imshow(img)
plt.show()
输出函数图像:
- 色彩模式转换
取值 | 色彩模式 | 取值 | 色彩模式 |
---|---|---|---|
1 | 1位二值图像 | L | 8位灰度图像 |
P | 8位彩色图像 | ||
RGB | 24位彩色图像 | RGBA | 32位彩色图像 |
CMYK | CMYK(32位)彩色图像 | YCbCr | YCbCr(24位)彩色图像 |
I | 32位整型灰度图像 | F | 32位浮现灰度图像 |
图像对象.convert(色彩模式)
img_gray=img.convert("L")
- 颜色通道的分离与合并
#分离图像
图像对象.split()
#合并图像
Image.merge(色彩模式,图像列表)
img=Image.open('./pic/lena.tiff')
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)
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()
输出图像如下:
- 数组转化
np.array(图像对象)
将灰度图像转化为数组:
img_gray=Image.open('./pic/lena512.bmp')
arr_img_gray=np.array(img_gray)
print('shape:',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]]
3. 手写数据集MNIST
#随机显示4幅手写数字图片
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
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()