首页 > 教程 > python计算机视觉学习笔记——PIL库的用法

python计算机视觉学习笔记——PIL库的用法

时间:2024-05-18 | 来源: | 阅读:166

话题: T Pi 计算机 视觉 Python

如果需要处理的原图及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice 这个是之前的笔记,自己看到了就顺带发出来,也是温习一下,内容可能不太全,算是入门贴吧。 前言:PIL 图

如果需要处理的原图及代码,请移步小编的GitHub地址

传送门: 请点击我

如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice

这个是之前的笔记,自己看到了就顺带发出来,也是温习一下,内容可能不太全,算是入门贴吧。

前言:PIL

图像处理是计算机视觉领域中不可或缺的一部分,而PIL(Python Imaging Library)库和OpenCV(Open Source Computer Vision Library)是两个常用的工具。今天这里主要学习以下PIL库,PIL 是一个用于图像处理的 Python 库,提供了丰富的图像处理功能。它包含了处理图像的各种工具和算法,可以进行图像的打开、保存、剪裁、旋转、缩放等操作。

PIL(Python Imaging Library)和 OpenCV 都是用于图像处理的强大库,它们各自有着不同的优势和适用场景。以下是一些导致 PIL 仍然被使用的原因:

1,PIL的优点

  1. 文字和绘图功能:PIL允许在图像上添加文字、绘制几何图形和绘制曲线,这对于图像注释和标记非常有帮助。
  2. 扩展功能:PIL还支持各种扩展功能,如图像滤波、直方图均衡化和颜色空间转换等。

2,PIL 的缺点

3,PIL 库和OpenCV的区别

  1. 编程语言:PIL库是用纯Python编写的,而OpenCV主要是用C++编写的,并提供了Python的接口。如果您更熟悉Python,并且希望使用Python进行图像处理,那么PIL可能更适合您。并且PIL 的接口相对较为简单,特别适合一些简单的图像处理任务。对于一些不需要太多高级功能的应用,PIL 提供了直观的方法和易于使用的 API。
  2. 功能和算法:OpenCV提供了更丰富和先进的图像处理算法和函数,涵盖了从基本操作到高级计算机视觉任务的各个方面。而PIL 在功能上相对轻量,适合一些小型项目或者只需要进行基本图像处理的场景。如果你的需求主要是一些简单的图像操作,PIL 可能是更轻便的选择。
  3. 性能:由于OpenCV是用C++编写的,因此在处理大型图像和复杂计算任务时具有较高的性能优势。PIL库在处理大型图像时可能效率稍低。
  4. 生态系统:OpenCV拥有庞大的社区支持和丰富的文档资源,可以帮助您解决问题和学习。而PIL库的社区活动相对较少,文档资源相对较少。

4,如何使用PIL库

首先是安装,比较简单:

下面是一个简单的示例,演示了如何使用PIL库来打开一个图像文件,然后将图像转换为灰度图,并保存到新的文件中:

虽然 OpenCV 在计算机视觉和更复杂的图像处理任务中表现得非常强大,但选择使用哪个库通常取决于具体的需求和项目特点。在一些情况下,PIL 可能更为合适,而在其他情况下,特别是涉及到计算机视觉领域的任务,OpenCV 可能更具优势。

总体来说,网上开源的一些计算机视觉中也使用PIL加载图像,所以有不得不学习的理由,话不多说,开干:

一:pillow模块的基本概念

Pillow的官网地址:https://pillow.readthedocs.io/en/stable/,其实打开后,什么都有,只是都是英文,对于部分同学不方面而已。

PIL:Python Imaging Library,已经是Python平台上的图像处理标准库了。由于PIL仅支持到Python2.7 ,加上年久失修,于是一群志愿者在PIL的基础上创建了兼容的版本,名字叫Pillow,支持最新版本的Python3.X,又加了许多新特性。因此,我们可以直接安装使用Pillow。

PIL中所涉及的基本概念有如下几个:通道(bands)、模式(mode)、尺寸(size)、坐标系统(coordinate system)、调色板(palette)、信息(info)和滤波器(filters)。

1.1? 通道——Image.getbands

每张图片都是由一个或者多个数据通道构成。PIL允许在单张图片中合成相同维数和深度的多个通道。

以RGB图像为例,每张图片都是由三个数据通道构成,分别为R、G和B通道。而对于灰度图像,则只有一个通道。

对于一张图片的通道数量和名称,可以通过方法getbands()来获取。方法getbands()是Image模块的方法,它会返回一个字符串元组(tuple)。该元组将包括每一个通道的名称。

Python的元组与列表类似,不同之处在于元组的元素不能修改,元组使用小括号,列表使用方括号,元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可。

方法getbands()的使用如下:

1.2? 模式——Image.mode

图像的模式定义了图像的类型和像素的位宽。当前支持如下模式:

可以通过mode属性读取图像的模式。其返回值是包括上述模式的字符串。

属性mode的使用如下:

1.3? 尺寸——Image.size

通过size属性可以获取图片的尺寸。这是一个二元组,包含水平和垂直方向上的像素数。

属性mode的使用如下:

1.4? 坐标系统

在PIL(或Pillow)中,图像的坐标系统遵循常见的数学坐标系,其中左上角是原点(0, 0),x轴向右增长,y轴向下增长。这意味着图像的左上角具有坐标 (0, 0) ,而右下角的坐标是 (width-1, height-1)

以下是一个简单的示例说明PIL的坐标系统:

输出图像:

1.5? 调色板 ——Image.palette

在PIL(Python Imaging Library)中,调色板(Palette)是一种用于存储和管理颜色映射的机制。调色板通常与图像的索引颜色模式一起使用,这意味着图像的每个像素值不直接表示颜色,而是作为索引来查找调色板中的实际颜色。

以下是有关调色板的一些重要概念和说明:

  1. 索引颜色模式:

    • 在索引颜色模式中,图像的每个像素值都是一个索引,该索引对应于调色板中的颜色。
    • 通常,索引颜色模式用于节省存储空间,特别是对于包含有限颜色集的图像。
  2. 调色板的组成:

    • 调色板是一个包含颜色信息的数据结构,通常由颜色元组组成。颜色元组可以是RGB(红、绿、蓝)格式,也可以是其他颜色表示格式。
    • 对于每个索引,调色板中都有一个与之对应的颜色。
  3. 使用调色板的图像格式:

    • 一些常见的使用调色板的图像格式包括GIF和PNG-8。这些格式在保存图像时使用调色板,而不是直接存储每个像素的完整颜色信息。
  4. 图像的调色板属性:

    • PIL中的图像对象具有调色板属性,通过该属性可以获取和设置图像的调色板。
    • 使用 image.getpalette() 方法可以获取图像的调色板,而 image.putpalette() 方法可以设置调色板。

以下是一个简单的示例,演示如何使用PIL中的调色板:

这个例子创建了一个调色板,然后使用索引颜色模式创建了一个8x8的图像,并通过设置像素值(索引)来使用调色板中的颜色。

1.6? 信息 ——Image.info

使用info属性可以为一张图片添加一些辅助信息。这个是字典对象。加载和保存图像文件时,多少信息需要处理取决于文件格式。

属性info的使用如下:

1.7? 滤波器

对于将多个输入像素映射为一个输出像素的几何操作,PIL提供了四个不同的采样滤波器。

Image模块中的方法 resize() 和 thumbnail()用到了滤波器。

方法resize() 的使用如下:

对参数filter不赋值的话,方法resize()默认使用NEAREST滤波器。如果要使用其他滤波器可以通过下面的方法来实现:

2,Image对象

2.1? 实例化对象

直接读取图片

2.2 格式转换——save方法

save方法用于保存图像,当不指定文件格式时,它会以默认的图片格式来存储;如果指定图片格式,则会以指定的格式存储图片,语法如下:

2.3? 格式转换——Convert方法

注意: 并非所有的图片格式都可以用 save() 方法转换完成,比如将 PNG 格式的图片保存为 JPG 格式,如果直接使用 save() 方法就会出现错误,引发错误的原因是由于 PNG 和 JPG 图像模式不一致导致的。其中 PNG 是四通道 RGBA 模式,即红色、绿色、蓝色、Alpha 透明色;JPG 是三通道 RGB 模式。因此要想实现图片格式的转换,就要将 PNG 转变为三通道 RGB 模式。

Image 类提供的 convert() 方法可以实现图像模式的转换。该函数提供了多个参数,比如 mode、matrix、dither 等,其中最关键的参数是 mode,其余参数无须关心

语法:

2.4? 图像缩放

在图像处理过程中经常会遇到缩小或放大图像的情况,Image 类提供的 resize() 方法能够实现任意缩小和放大图像

语法:

2.5? 图像的分离和合并

图像(指数字图像)由许多像素点组成,像素是组成图像的基本单位,而每一个像素点又可以使用不同的颜色,最终呈现出了绚丽多彩的图像 ,而图像的分离与合并,指的就是图像颜色的分离和合并

图像分离:split方法

示例:

图像合并:merge方法

Image 类提供的 merge() 方法可以实现图像的合并操作。注意,图像合并,可以是单个图像合并,也可以合并两个以上的图像

示例:

图像合并:blend方法

Image 类也提供了 blend() 方法来混合 RGBA 模式的图片(PNG 格式)

语法:

2.6? 图像裁剪

Image 类提供的 crop() 函数允许我们以矩形区域的方式对原图像进行裁剪

语法:

box 是一个有四个数字的元组参数 (x_左上,y_左下,x1_右上,y1_右下),分别表示被裁剪矩形区域的左上角 x、y 坐标和右下角 x,y 坐标。默认 (0,0) 表示坐标原点,宽度的方向为 x 轴,高度的方向为 y 轴,每个像素点代表一个单位

3,代码实战

3.1 图像的属性的打印示例

注意:源文件的文件格式。如果是由PIL创建的空图像,则其文件格式为None,即?im.format ? string or None

示例代码如下:

3.2? 使用PIL进行灰度化+二值化

代码如下:

原图图片效果展示:

灰度化图片效果展示:

二值化图片效果展示:

3.2? 图像转换示例

代码如下:


湘ICP备2022002427号-10湘公网安备:43070202000427号
© 2013~2019 haote.com 好特网