Tensorflow2.0的学习之路之——数字图像基础、pillow图像处理库

学习记录

序言:这一章主要记录一下对数字图像基础的学习

数字图像基本概念

人类肉眼可以观察到连续的图像,但是对于计算机来说不可以。
因此计算机将连续的图像数字化、离散化之后,变成一种数字图像,可近似于连续图像。


数字图像是一个点阵图,由一格一格的像素组成

首先了解一下:

  • 像素:是图像中的一个最小单位
  • 位图:通过记录每一个像素值来存储盒表达的图像
  • 色彩深度/位深度:位图中每个像素点要用多少个二进制来表示
  • BMP格式:Windows系统的标准位图格式

二值图像

每个像素只有两种可能的取值,使用1位二进制来表示,位深度为1.

在这里插入图片描述
如图“你”字,可以看到每一个像素小格子里只有一位二进制,每一位二进制的可能取值只为0或者1。
这个“你”字图总共是16位*16位,也就是总共有32个字节。

在对图像处理分析时,我们常常对图像进行二值化处理,可凸显感兴趣的目标,有效减小数据量。

这些都叫做二值图像:
在这里插入图片描述


灰度图像

每个像素使用1个字节表示,位深为8,可以表示256中级别的灰度。0表示黑色(最深色),255表示白色(最浅色)

为什么是256种级别的灰度呢?
因为每一位有两种可能,一个字节有8位,28=256

若一副灰度图像:
存储512512像素的图像,占据的字节数
本身512
512=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

虽然有瑕疵但是我觉得真的不错。因为现在还是学生党,以后会补票的。乔尔冲冲冲!艾莉冲冲冲!

感谢观看

欢迎各位批评指正 😉

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值