>>> from env_helper import info; info()
页面更新时间: 2023-12-13 10:51:32
运行环境:
    Linux发行版本: Debian GNU/Linux 12 (bookworm)
    操作系统内核: Linux-6.1.0-15-amd64-x86_64-with-glibc2.36
    Python版本: 3.11.2

3.1. 数字图像处理的基本概念

图像处理技术是用计算机对图像信息进行处理,以达到所需结果的技术。 数字图像是指用工业相机、摄像机、扫描仪等设备经过拍摄得到的一个大的二维数组,该数组的元素称为像素,其值称为灰度值。图像处理技术一般包括图像压缩,增强和复原,匹配、描述和识别3个部分。

3.1.1. 图像的类型

灰度图像

灰度图像矩阵元素的取值范围通常为 [0,255] 。因此其数据类型一般为8位无符号整数的(int8),这就是人们经常提到的256灰度图像。 0 表示纯黑色, 255 表示纯白色,中间的数字从小到大表示由黑到白的过渡色。 在某些软件中,灰度图像也可以用双精度数据类型(double)表示,像素的值域为 [0,1]0 代表黑色, 1 代表白色, 01 之间的小数表示不同的灰度等级。 二值图像可以看成是灰度图像的一个特例。

>>> from PIL import Image, ImageFilter, ImageEnhance, ImageOps
>>> from matplotlib import pyplot as plt
>>> img = Image.open('L1020120.JPG')
>>> img1 = img.convert("L")
>>> plt.subplot(121),plt.imshow(img)
>>> plt.subplot(122),plt.imshow(img1)
>>> plt.show()
_images/sec01_intro_3_0.png

下面代码进行转换:

>>> im = Image.open("L1020120.JPG").convert("L")
>>> plt.imshow(im)
>>> plt.show()
_images/sec01_intro_5_0.png

二值图像

一幅二值图像的二维矩阵仅由0、1两个值构成,“0”代表黑色,“1”代白色。由于每一像素(矩阵中每一元素)取值仅有0、1两种可能,所以计算机中二值图像的数据类型通常为1个二进制位。二值图像通常用于文字、线条图的扫描识别(OCR)和掩膜图像的存储。

>>> img2 = img1.point(lambda i: 255 if i > 252 else 0)
>>> plt.subplot(121),plt.imshow(img1)
>>> plt.subplot(122),plt.imshow(img2)
>>> plt.show()
_images/sec01_intro_7_0.png

索引图像

索引图像的文件结构比较复杂,除了存放图像的二维矩阵外,还包括一个称之为颜色索引矩阵MAP的二维数组。MAP的大小由存放图像的矩阵元素值域决定,如矩阵元素值域为 [0,255] ,则MAP矩阵的大小为256x3,用 MAP=[RGB] 表示。MAP中每一行的三个元素分别指定该行对应颜色的红、绿、蓝单色值,MAP中每一行对应图像矩阵像素的一个灰度值,如某一像素的灰度值为64,则该像素就与MAP中的第64行建立了映射关系,该像素在屏幕上的实际颜色由第64行的 [RGB] 组合决定。也就是说,图像在屏幕上显示时,每一像素的颜色由存放在矩阵中该像素的灰度值作为索引通过检索颜色索引矩阵MAP得到。索引图像的数据类型一般为8位无符号整形(int8),相应索引矩阵MAP的大小为256x3,因此一般索引图像只能同时显示256种颜色,但通过改变索引矩阵,颜色的类型可以调整。索引图像的数据类型也可采用双精度浮点型(double)。索引图像一般用于存放色彩要求比较简单的图像,如Windows中色彩构成比较简单的壁纸多采用索引图像存放,如果图像的色彩比较复杂,就要用到RGB真彩色图像。

RGB彩色图像

RGB图像与索引图像一样都可以用来表示彩色图像。与索引图像一样,它分别用红(R)、绿(G)、蓝(B)三原色的组合来表示每个像素的颜色。但与索引图像不同的是,RGB图像每一个像素的颜色值(由RGB三原色表示)直接存放在图像矩阵中,由于每一像素的颜色需由R、G、B三个分量来表示,M、N分别表示图像的行列数,三个M x N的二维矩阵分别表示各个像素的R、G、B三个颜色分量。RGB图像的数据类型一般为8位无符号整形,通常用于表示和存放真彩色图像,当然也可以存放灰度图像。

数字化图像数据有两种存储方式:位图存储(Bitmap)和矢量存储(Vector)

我们平常是以图像分辨率(即像素点)和颜色数来描述数字图象的。例如一张分辨率为 640*480 ,16位色的数字图片,就由 2^16=65536 种颜色的 307200(=640*480) 个素点组成。

3.1.2. 图像处理的方法

  • 图像变换:由于图像阵列很大,直接在空间域中进行处理,涉及计算量很大。因此,往往采用各种图像变换的方法,如傅立叶变换、沃尔什变换、离散余弦变换等间接处理技术,将空间域的处理转换为变换域处理,不仅可减少计算量,而且可获得更有效的处理(如傅立叶变换可在频域中进行数字滤波处理)。目前新兴研究的小波变换在时域和频域中都具有良好的局部化特性,它在图像处理中也有着广泛而有效的应用。

  • 图像编码压缩:图像编码压缩技术可减少描述图像的数据量(即比特数),以便节省图像传输、处理时间和减少所占用的存储器容量。压缩可以在不失真的前提下获得,也可以在允许的失真条件下进行。编码是压缩技术中最重要的方法,它在图像处理技术中是发展最早且比较成熟的技术。

  • 图像增强和复原:图像增强和复原的目的是为了提高图像的质量,如去除噪声,提高图像的清晰度等。图像增强不考虑图像降质的原因,突出图像中所感兴趣的部分。如强化图像高频分量,可使图像中物体轮廓清晰,细节明显;如强化低频分量可减少图像中噪声影响。图像复原要求对图像降质的原因有一定的了解,一般讲应根据降质过程建立“降质模型”,再采用某种滤波方法,恢复或重建原来的图像。

  • 图像分割:图像分割是数字图像处理中的关键技术之一。图像分割是将图像中有意义的特征部分提取出来,其有意义的特征有图像中的边缘、区域等,这是进一步进行图像识别、分析和理解的基础。虽然目前已研究出不少边缘提取、区域分割的方法,但还没有一种普遍适用于各种图像的有效方法。因此,对图像分割的研究还在不断深入之中,是目前图像处理中研究的热点之一。

  • 图像描述:图像描述是图像识别和理解的必要前提。作为最简单的二值图像可采用其几何特性描述物体的特性,一般图像的描述方法采用二维形状描述,它有边界描述和区域描述两类方法。对于特殊的纹理图像可采用二维纹理特征描述。随着图像处理研究的深入发展,已经开始进行三维物体描述的研究,提出了体积描述、表面描述、广义圆柱体描述等方法。

  • 图像分类(识别):图像分类(识别)属于模式识别的范畴,其主要内容是图像经过某些预处理(增强、复原、压缩)后,进行图像分割和特征提取,从而进行判决分类。图像分类常采用经典的模式识别方法,有统计模式分类和句法(结构)模式分类,近年来新发展起来的模糊模式识别和人工神经网络模式分类在图像识别中也越来越受到重视。

3.1.3. 图像分析

时下最火热的人工智能,深度学习等,都离不开图像的分析,从图像中抽取某些有用的度量、数据或信息。目的是得到某种数值结果,而不是产生另一个图像。图像分析的内容和模式识别、人工智能的研究领域有交叉,但图像分析与典型的模式识别有所区别。图像分析不限于把图像中的特定区域按固定数目的类别加以分类,它主要是提供关于被分析图像的一种描述。为此,既要利用模式识别技术,又要利用关于图像内容的知识库,即人工智能中关于知识表达方面的内容。图像分析需要用图像分割方法抽取出图像的特征,然后对图像进行符号化的描述。这种描述不仅能对图像中是否存在某一特定对象作出回答,还能对图像内容作出详细描述。

图像处理的各个内容是互相有联系的。一个实用的图像处理系统往往结合应用几种图像处理技术才能得到所需要的结果。图像数字化是将一个图像变换为适合计算机处理的形式的第一步。图像编码技术可用以传输和存储图像。图像增强和复原可以是图像处理的最后目的,也可以是为进一步的处理作准备。通过图像分割得出的图像特征可以作为最后结果,也可以作为下一步图像分析的基础。 图像匹配、描述和识别对图像进行比较和配准,通过分制提取图像的特征及相互关系,得到图像符号化的描述,再把它同模型比较,以确定其分类。图像匹配试图建立两张图片之间的几何对应关系,度量其类似或不同的程度。匹配用于图片之间或图片与地图之间的配准,例如检测不同时间所拍图片之间景物的变化,找出运动物体的轨迹。

从图像中抽取某些有用的度量、数据或信息称为图像分析。图像分析的基本步骤是把图像分割成一些互不重叠的区域,每一区域是像素的一个连续集,度量它们的性质和关系,最后把得到的图像关系结构和描述景物分类的模型进行比较,以确定其类型。识别或分类的基础是图像的相似度。一种简单的相似度可用区域特征空间中的距离来定义。另一种基于像素值的相似度量是图像函数的相关性。最后一种定义在关系结构上的相似度称为结构相似度。 以图片分析和理解为目的的分割、描述和识别将用于各种自动化的系统,如字符和图形识别、用机器人进行产品的装配和检验、自动军事目标识别和跟踪、指纹识别、X光照片和血样的自动处理等。在这类应用中,往往需综合应用模式识别和计算机视觉等技术,图像处理更多的是作为前置处理而出现的。 多媒体应用的掀起,对图像压缩技术的应用起了很大的推动作用。图像,包括录像带一类动态图像将转为数字图像,并和文字、声音、图形一起存储在计算机内,显示在计算机的屏幕上。它的应用将扩展到教育、培训和娱乐等新的领域

3.1.4. Python 处理图像的工具

Pillow

Pillow 是 PIL 的替代版本,这个库提供了广泛的文件格式支持、高效的内部表示和相当强大的图像处理功能。 核心图像库是为快速访问以几种基本像素格式存储的数据而设计的。

OpenCV

OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和Mac OS操作系统上。OpenCV致力于高效运算和即时应用开发。因其是用优化的C/C++编写的,故其可以充分利用多核处理优势。并且还启用了OpenSL,它可以利用底层异构计算平台的硬件加速。广泛运用在世界各地,从互动艺术、矿山检查、网络地图到先进的机器人技术都有OpenCV的身影。

SimpleCV

SimpleCV是用于构建计算机视觉应用程序的开源框架。有了它,可以访问几个高性能的计算机视觉库,例如OpenCV,而无需首先了解位深度,文件格式,颜色空间,缓冲区管理,特征值或矩阵与位图存储。

Mahotas

Mahotas是Python中另一个计算机视觉和图像处理库,含有过滤和形态学操作这类的传统图像处理功能和兴趣点检测、局部描述符等用于特征计算的现代化计算机视觉功能。接口使用了Python,适合快速开发,但算法是由C ++实现的,并对速度进行了调整。Mahotas库因代码简单且依赖性最小而快速。

SimpleITK

Insight Segmentation and Registration Toolkit (ITK)是一个开源、跨平台的框架,可以提供给开发者增强功能的图像分析和处理套件。其中最为著名的就是SimpleITK,是一个简化版的、构建于ITK最顶层的模块,旨在方便它在快速成型、教育、解释语言中的应用。SimpleITK是一个具有大量组件的图像分析工具包,支持一般过滤操作、图像分割和图像配准。SimpleITK本身是用C ++编写的,但可用于包括Python在内的多种编程语言。

pgmagick

Pgmagick是GraphicsMagick库基于Python的包装器。GraphicsMagick图像处理系统有时也被称为图像处理的瑞士军刀。它提供了强大高效的工具集和库集,这些集合支持读取、写入和操作的图像格式超过88种,其中包括DPX,GIF,JPEG,JPEG-2000,PNG,PDF,PNM和TIFF等重要格式。

Pycairo

Pycairo是一组用于图形库cairo的python包。Cairo是一个用于绘制矢量图形的2D图形库。矢量图形很有趣,在调整大小或变换时它们的清晰度不会受到影响。Pycairo可从Python中调用cairo命令用于cairo。

3.1.5. 使用numpy与scipy处理图像

NumPy(Numerical Python)是Python的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(nested list structure)结构要高效的多(该结构也可以用来表示矩阵(matrix)),支持大量的维度数组与矩阵运算,针对数组运算提供大量的数学函数库,图像本质上是包含数据像素点的标准Numpy数组。因此,通过使用基本的NumPy操作,例如切片、掩膜和匹配索引,以修改图像的像素值。也可以用skimage加载图像,用matplotlib显示图像。