前言
本教程介绍使用Pillow库进行图像处理的基础知识。阅读本书后,你应该能够创建Python程序来读取、写入和处理图像。
本教程针对希望学习Python图像处理者。不需要任何图像处理知识,但如果有处理图像数据的经验会更佳。
本教程假定你有Python的基本,但所有的例子都有充分的解释,并没有使用任何高级语言特性。
简介
本教程使用Pillow 9.3.0版和Python 3.10版来介绍Python中的位图。它分为两个部分。
- 位图图像
介绍位图一些重要概念,包括颜色表示、像素数据模型、图像压缩、文件格式和元数据。
- Pillow库
Python Pillow成像库的详细教程,它是最流行的Python图像库之一。
1位图简介
本章将介绍什么是位图图像的基本知识。后面的章节将介绍。
1.1 什么是位图图像?
你在网上看到的几乎所有图像都是位图图像,它又名光栅图像,或像素图像。
位图是由像素构成的--它们可以被认为是构成图像的微小彩色方块。
1.2空间采样
真实世界的场景几乎有无限的细节。位图图像的细节是有限的。相机会把场景转换成像素阵列。每个像素代表图像的一小部分。
如果分辨率搞,我们就无法区分个体,而图像看起来与实际场景相似。
在实践中,在40厘米的观察距离上,眼睛可以分辨出相距约0.1毫米的物体。因此一张纸上画有两条相距0.1毫米的细线。如果你把纸拿在离你脸40厘米的地方,假设你有正常的视力,你可能刚好能看到有两条独立的线。再远一点,它们就会看起来像一条线了。
如果你想在页面上打印图像,使眼睛无法看到单个像素,你的目标应该是每毫米10像素(约每英寸250像素)或更高的像素分辨率。因此,对于一张15厘米×10厘米的打印照片,你希望图像的分辨率至少为1500×1000像素。这将是一个150万像素(MP)的图像。
在现实中,你可能会想要比这更高的分辨率。
- 打印更大的照片。
- 裁剪照片,只显示主题。
大多数现代数码相机支持600万像素或更高的像素。
高像素尺寸并不总是像它们看起来那样有用。
对于打印非常大的图像,如海报,它们通常是从40厘米以上的地方看的,所以没有必要有0.1毫米的空间分辨率。
在非常高的分辨率下,相机抖动等因素会使图像模糊,因此,如果没有非常牢固的三脚架,拍摄非常高的分辨率的照片就没有什么意义。
1.3 颜色表示
位图图像中的每个像素都有特定的颜色。我们可以用各种方式在图像中表示一种颜色。
最常见的方式是将颜色表示为三个独立的部分,即构成颜色的红、绿、蓝光的数量。正如我们将看到的,这是基于人眼对颜色的感知方式。然而,我们有时也会使用其他的方法,包括。
- CMYK:用于表示印刷的颜色。
- HSL--在艺术和设计中作为一种直观的方式来选择相关颜色。
- 感知性色彩空间,如CieLAB,用于创造非常精确的色彩。
我们需要多精确地表示图像中的每种颜色。作为一个粗略的经验法则,我们可以检测到大约1%的颜色变化。大多数现代系统每通道使用8比特(例如,在0和255之间的三个整数来存储红、绿和蓝的值)。这提供了一个优于0.5%的精度,这对大多数用途来说是足够的。
一些图像格式使用较少或较多的比特来存储数据,所以了解不同的格式是很有用的。
计算机系统无法捕捉或显示现实世界中的全部颜色,尤其是颜色强度。我们可能会遇到太阳的全部光亮或深山洞穴的完全黑暗。在电脑显示器上不可能复制这种强度范围,而在电脑打印件上复制的可能性就更小。打印机不可能创造出比纸张本身更亮的东西,也不可能创造出更暗的东西。
撇开强度不谈,许多自然色彩太过纯粹和鲜艳,无法通过屏幕或打印机准确再现。我们只能在电脑上对它们进行近似的处理。
1.4 文件格式
图像数据通常非常大,所以许多文件格式支持数据压缩。所有文件格式都支持元数据。
元数据是关于其他数据的数据,用于在图像文件中描述图像数据的额外信息。这可以从最基本的信息(如图像尺寸和颜色类型)一直到关于拍摄图像时使用的相机设置的高度详细的信息。每种格式都有一套不同的功能。
现在最流行的格式是:
- 用于摄影图像的JPEG格式:
因为它支持一种非常有效的有损压缩形式,在照片中效果良好。
- PNG格式用于图表和标志:
它支持非常有效的无损压缩形式,在人工图像中效果很好。
- GIF格式:
它不怎么用于普通图像,但有一个独特的功能,即支持简单的动画,这使它对某些网页很有用。
- TIFF格式:
主要用于专业打印应用。它是一种能力很强的格式,支持大量的数据类型、压缩方案和元数据,但它也相当复杂,所以不被浏览器支持。
还有许多其他文件类型,特别是像图标这样的小文件,因为它们很小,所以不需要复杂的压缩。它们通常是针对特定的操作系统或软件类型的。
1.5 矢量图像
存储图像数据的另一种方法是使用矢量格式。在矢量图像中,图像不是以像素形式存储。相反,它被存储为一组形状的数学定义。矢量图像本质上是线条、矩形、圆形和其他形状的列表。它定义了每个形状的确切尺寸、位置和颜色,通常是人类可读的文本。
要查看矢量图像,首先必须进行渲染,也就是说,通过绘制每个形状,将其转换为位图。这个过程通常是高度优化的。
矢量图像的优点是。
- 文件大小通常比同等的位图图像小得多。
- 图像可以在任何分辨率下呈现,因为每个形状的准确位置都被储存起来。你几乎可以无限放大图像,它仍然有完美的边缘。
- 图像中的单个形状可以被编辑。
缺点:
- 图像在显示前必须进行渲染,这比简单的位图需要更多的处理能力。
- 可能存在兼容性问题。由于格式通常比较复杂,出错的方式也比较多。
- 它只适用于人工图像(图表、文本文件等),你无法有效地将自然照片储存在矢量格式中。
知名的矢量格式有SVG、PDF和PostScript等。
参考资料
- 本文涉及的python测试开发库 谢谢点赞!
- 本文相关海量书籍下载