学习记录
序言:这一章主要记录一下对数字图像基础的学习
数字图像基本概念
人类肉眼可以观察到连续的图像,但是对于计算机来说不可以。
因此计算机将连续的图像数字化、离散化之后,变成一种数字图像,可近似于连续图像。
数字图像是一个点阵图,由一格一格的像素组成
首先了解一下:
- 像素:是图像中的一个最小单位
- 位图:通过记录每一个像素值来存储盒表达的图像
- 色彩深度/位深度:位图中每个像素点要用多少个二进制来表示
- BMP格式:Windows系统的标准位图格式
二值图像
每个像素只有两种可能的取值,使用1位二进制来表示,位深度为1.
如图“你”字,可以看到每一个像素小格子里只有一位二进制,每一位二进制的可能取值只为0或者1。
这个“你”字图总共是16位*16位,也就是总共有32个字节。
在对图像处理分析时,我们常常对图像进行二值化处理,可凸显感兴趣的目标,有效减小数据量。
这些都叫做二值图像:
灰度图像
每个像素使用1个字节表示,位深为8,可以表示256中级别的灰度。0表示黑色(最深色),255表示白色(最浅色)
为什么是256种级别的灰度呢?
因为每一位有两种可能,一个字节有8位,28=256
若一副灰度图像:
存储512512像素的图像,占据的字节数
本身512512=262144Byte=262144/1024=256K Byte
这些都叫做灰度图像.
彩色图像(RGB)
每个像素都有红(R)、绿(G)、蓝(B)三个分量。
-
那么每个分量需要1个字节,一个像素需要三个分量即3个字节,那么一个像素就需要24位,位深度为24位。
-
产生的图像也可以叫24位真彩色图像
-
通常把RGB三个分量称为色彩通道(红色通道、绿色通道……)
RGBA图像
是由RGB图像+8位透明度信息Alpha
- 当Alpha=255时,为全显,Alpha=0时,为全透明。
- 产生的图像也叫作32位真彩色图像。位深为32位
256色彩色图像
- 图像格式
BMP格式:占用存储空间大,不支持文件压缩,不适用于网页 - 图像压缩
适当降低图像质量来减小所占的空间
不通的图像压缩算法对应不同的图像格式
JPEG格式:
- 是一种有损压缩
- 压缩率高,可达到100:1,所占空间小图片质量也不会有明显下降
- 适用于色彩丰富、细节清晰细腻的大图像
- 每次编辑都会降低图像质量,不适合进行多次编辑
PNG格式:
- 是无损压缩的位图图像格式
- 适合有规律渐变色彩的图像
GIF格式:
- 支持静态格式和动态格式
- 动态图片由多副图片保存为一个图片,循环显示,形成动画效果
- 只支持256色,适用色彩简单、颜色较少的小图像
TIFF格式:
- 定义了四类不同类型的格式:
- 二值图像(TIFF-B)
- 黑白灰度图像(TIFF-G)
- 带调色板的彩色图像(TIFF-P)
- RGB真彩图像(TIFF-R)
- 支持RGB、JPEG等多种编码方法
- 具有非常好的扩展性、方便些、可改性、是印刷行业中最常用的格式
色彩模式:
图像类型
序列图像:
- 时间上有一定顺序和间隔、内容上相关的一组图像
- 其中的每副图像称为帧图像
- 帧图像之间的时间间隔是固定的
- 视频就是序列图像
深度图像: - 是一种三维场景信息的表达方式
- 每个像素点的取值,代表这个点离摄像机的距离
- 采用灰度图表示,每个像素点由一个字节表示
- 深度图像中,像素点的取值并不代表实际的距离。颜色的深浅只代表相对距离的远近。
Pillow图像处理库
准备工作
导入PIL.Image模块
from PIL import Image
导入matplotlib.pyplot模块
import matplotlib.pyplot as plt
图像
打开图像——Image.open()函数
Image.open(路径)
#返回一个Image对象
保存图像——save()方法
图像对象.save(文件路径)
并且改变文件名就可以转换图像格式
示例:
从网上下载一幅格式为jpg的图片,将图片保存在当前工作目录中。
#运行代码
from PIL import Image
import matplotlib.pyplot as plt
img=Image.open("the_last_of_us.jpg")
img.save("test.Ellie.bmp")
得到结果:
对应文件夹中确实可以找到新保存的格式为bmp的图片,在vscode中也有显示并可以直接打开。
图像对象的主要属性:
属性 | 说明 |
---|---|
图像对象.format | 图像格式 |
图像对象.size | 图像尺寸 |
图像对象.mode | 色彩模式 |
示例:
from PIL import Image
import matplotlib.pyplot as plt
picture1=Image.open("the_last_of_us.jpg")
picture2=Image.open("test.Ellie.bmp")
print( "picture1:",picture1.format )
print( "picture2'size:" , picture2.size )
print( "picture1's mode:" , picture1.mode )
#得到结果
picture1: JPEG
picture2'size: (1200, 630)
picture1's mode: RGB
显示图像
plt.imshow( image对象/numpy数组 )
那么我们可以利用这个函数将自己的图像显示在画布上。
在pillow库中,还提供转换图像色彩模式的功能
利用:
图像对象.convert(色彩模式)
其中,可转换为9种色彩模式
需要知道的是,虽然的确可以相互转换,但是经过一系列转换再变回原来的色彩模式时,或许得到的图像质量会略差些。
picture1=Image.open("the_last_of_us.jpg")
pic = picture2.convert("P")
plt.figure()
plt.imshow(pic)
plt.show()
可以看到很明显的色块,不像原图一样那么逼近真实色彩
颜色通道的分离与合并:
分离:图像对象.split()
合并:Image.merge(色彩模式,图像列表)
picture1=Image.open("the_last_of_us.jpg")
pic_R,pic_G,pic_B = picture1.split() #分离色彩通道
plt.figure(figsize=(12,6)) #创建画布
plt.subplot(221) #分别在四个区域填充画布
plt.axis("off")
plt.imshow(pic_R, cmap="gray")
plt.subplot(222)
plt.axis("off")
plt.imshow(pic_G, cmap="gray")
plt.subplot(223)
plt.axis("off")
plt.imshow(pic_B, cmap="gray")
final=Image.merge( "RGB",[pic_R,pic_G,pic_B] ) #合并通道
plt.subplot(224)
plt.axis("off")
plt.imshow(final)
plt.show()
plt.subplot(221) #分别在四个区域填充画布
plt.axis("off")
plt.imshow(pic_R, cmap="gray")
plt.subplot(222)
plt.axis("off")
plt.imshow(pic_G, cmap="gray")
plt.subplot(223)
plt.axis("off")
plt.imshow(pic_B, cmap="gray")
final=Image.merge( "RGB",[pic_R,pic_G,pic_B] ) #合并通道
plt.subplot(224)
plt.axis("off")
plt.imshow(final)
plt.show()
得到结果:
将图像转换为数组
将图像转换为数组有时候或许更方便我们对图像的处理。
我们需要导入numpy库,利用 np.array(图像对象) 进行转换
from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
ellie = Image.open("the_last_of_us.jpg") #打开图像
arr_img = np.array(ellie)
arr_img_new = 100-arr_img #直接利用图像数组进行处理
plt.figure()
plt.subplot(121) #展示原图
plt.axis("off")
plt.imshow( arr_img )
plt.subplot(122) #展示处理图片
plt.axis("off")
plt.imshow( arr_img_new )
print("shape:",arr_img.shape,"\n") #输出图像数组的形状及具体像素情况
print(arr_img)
plt.show()
得到结果:
shape: (630, 1200, 3)
[[[28 33 27]
[28 33 27]
[28 33 27]
...
[71 83 71]
[71 83 71]
[71 83 71]]
[[28 33 27]
[28 33 27]
[28 33 27]
...
[70 82 70]
[70 82 70]
[70 82 70]]
[[28 33 27]
[28 33 27]
[28 33 27]
...
[69 81 69]
[69 81 69]
[69 81 69]]
...
[[ 5 10 4]
[ 5 10 4]
[ 5 10 4]
...
[42 52 25]
[43 53 26]
[43 53 26]]
[[ 4 9 3]
[ 4 9 3]
[ 4 9 3]
...
[42 52 25]
[42 52 25]
[42 52 25]]
[[ 4 9 3]
[ 4 9 3]
[ 4 9 3]
...
[41 51 24]
[41 51 24]
[41 51 24]]]
对图像的缩放、旋转和镜像
使用的原图:
像素:1608*1908, RGB
格式:JPG
缩放
图像对象.resize((width,height))
或者是
图像对象.thumbnail((width,height))
值得注意的是后者方法是直接对图像对象进行变换。
plt.figure()
ellie = Image.open("happy_Ellie1.jpg")
small = ellie.resize( (460,360) )
plt.imshow(small)
plt.show()
可以看到被我缩小并且拉长了
旋转、镜像
裁剪图像
最后生还者2
虽然有瑕疵但是我觉得真的不错。因为现在还是学生党,以后会补票的。乔尔冲冲冲!艾莉冲冲冲!
感谢观看
欢迎各位批评指正 😉