OpenCV图像处理基础

578 阅读7分钟

「这是我参与2022首次更文挑战的第1天,活动详情查看:2022首次更文挑战

图像处理中的主要问题

我们看可以把图像看作是三维世界的二维视图,那么数字图像作为2D图像,可以使用称为像素的有限数字集进行表示(像素的概念将在像素、颜色、通道、图像和颜色空间部分中详细解释)。我们可以,将计算机视觉的目标定义为将这些2D数据转换为以下内容:

  1. 新的数据表示(例如,新图像)
  2. 决策目标(例如,执行具体决策任务)
  3. 目标结果(例如,图像的分类)
  4. 信息提取(例如,目标检测)

在进行图像处理时,经常会遇到以下问题:

  1. 图像的模糊性,由于受到透视的影响,从而会导致图像视觉外观的变化。例如,从不同的角度看同一个物体会产生不同的图像;
  2. 图像通常会受许多自然因素的影响,如光照、天气、反射和运动;
  3. 图像中的一部分对象也可能会被其他对象遮挡,使得被遮挡的对象难以检测或分类。随着遮挡程度的增加,图像处理的任务(例如,图像分类)可能非常具有挑战性。

为了更好的解释上述问题,我们假设需要开发一个人脸检测系统。该系统应足够鲁棒,以应对光照或天气条件的变化;此外,该系统应该可以处理头部的运动——用户头部可以在坐标系中每个轴上进行一定程度的动作(抬头、摇头和低头,用户可以离相机稍近或稍远的情况)。而许多人脸检测算法在人脸接近正面时表现出良好的性能,但是,如果一张脸不是正面的(例如,侧面对着镜头),算法就无法检测到它。此外,算法需要即使在用户戴着眼镜或太阳镜时,也可能需要检测面部(即使这会在眼睛区域产生遮挡)。综上所述,当开发一个计算机视觉项目时,我们必须综合考虑到所有这些因素,一种方法是有使用大量测试图像来验证算法。我们也可以根据测试图像的不同困难程度来对它们进行分类,以便于检测算法的弱点,提高算法的鲁棒性。

图像处理流程

完整的图像处理程序通常可以分为以下三个步骤:

  1. 读取图像,图像的获取可以有多种不同的来源(相机、视频流、磁盘、在线资源),因此图像的读取可能涉及多个函数,以便可以从不同的来源读取图像;
  2. 图像处理,通过应用图像处理技术来处理图像,以实现所需的功能(例如,检测图像中的猫);
  3. 显示结果,将图像处理完成后的结果以人类可读的方式进行呈现(例如,在图像中绘制边界框,有时也可能需要将其保存到磁盘)。

此外,上述第2步图像处理可以进一步分为三个不同的处理级别:

  1. 低层处理(或者在不引起歧义的情况下可以称为预处理),通常将一个图像作为输入,然后输出另一个图像。可在此步骤中应用的步骤包括但不限于以下方法:噪声消除、图像锐化、光照归一化以及透视校正等;
  2. 中层处理:是将预处理后的图像提取其主要特征(例如采用 DNN 模型得到的图像特征),输出某种形式的图像表示,它提取了用于图像进一步处理的主要特征。
  3. 高层处理:接受中层处理得到的图像特征并输出最终结果。例如,处理的输出可以是检测到的人脸.

像素、颜色、通道、图像和颜色空间

在表示图像时,有多种不同的颜色模型,但最常见的是红、绿、蓝 (RGB) 模型。

RGB 模型是一种加法颜色模型,其中原色 (在RGB模型中,原色是红色 R、绿色 G 和蓝色 B) 混合在一起就可以用来表示广泛的颜色范围。

每个原色 (R, G, B) 通常表示一个通道,其取值范围为[0, 255]内的整数值。因此,每个通道有共256个可能的离散值,其对应于用于表示颜色通道值的总比特数 (282562^8=256)。此外,由于有三个不同的通道,使用 RGB 模型表示的图像称为24位色深图像:

加色法

在上图中,可以看到 RGB 颜色空间的“加法颜色”属性:

  1. 红色加绿色会得到黄色
  2. 蓝色加红色会得到品红
  3. 蓝色加绿色会得到青色
  4. 三种原色加在一起得到白色

因此,如前所述,RGB 颜色模型中,特定颜色可以由红、绿和蓝值分量合成表示,将像素值表示为 RGB 三元组 (r, g, b)。典型的 RGB 颜色选择器如下图所示:

颜色选择器

分辨率为 800×1200 的图像是一个包含800列和1200行的网格,每个网格就是称为一个像素,因此其中包含 800×1200=96 万像素。应当注意,图像中有多少像素并不表示其物理尺寸(一个像素不等于一毫米)。相反,像素的大小取决于为该图像设置的每英寸像素数 (Pixels Per Inch, PPI)。图像的 PPI 一般设置在 [200-400] 范围内。 计算PPI的基本公式如下:

  1. PPI=宽度(像素) / 图像宽度(英寸)
  2. PPI=高度(像素) / 图像高度(英寸)

例如,一个4×6英寸图像,图像分辨率为 800×1200,则PPI是200。

图像描述

图像可以描述为2D函数 f(x,y)f(x, y),其中 (x,y)(x, y) 是空间坐标,而 f(x,y)f(x, y) 是图像在点 (x,y)(x, y) 处的亮度或灰度或颜色值。另外,当 f(x,y)f(x, y)(x,y)(x, y) 值都是有限离散量时,该图像也被称为数字图像,此时:

  1. x[0,h1]x∈ [0, h-1],其中 hh 是图像的高度
  2. y[0,w1]y∈ [0, w-1],其中 ww 是图像的宽度
  3. f(x,y)[0L1]f(x, y)∈ [0,L-1],其中 L=256L=256 (对于8位灰度图像)

彩色图像也可以用同样的方式表示,只是我们需要定义三个函数来分别表示红色、绿色和蓝色值。这三个单独的函数中的每一个都遵循与为灰度图像定义的 f(x,y)f(x, y) 函数相同的公式。我们将这三个函数的子索引 R、G 和 B 分别表示为 fR(x,y)f_R(x, y)fG(x,y)f_G(x, y)fB(x,y)f_B(x, y)

同样,黑白图像也可以表示为相同的形式,其仅需要一个函数来表示图像,且 f(x,y)f(x, y) 只能取两个值。通常,0 表示黑色、1 表示白色。

下图显示了三种不同类型的图像(彩色图像、灰度图像和黑白图像):

不同类型图像示例

数字图像可以看作是真实场景的近似,因为 f(x,y)f(x, y) 值是有限的离散量。此外,灰度和黑白图像每个点只对应有一个值,彩色图像每个点需要三个函数对应于图像的红色、绿色和蓝色分量。

图像文件类型

尽管在 OpenCV 中处理的图像时,可以将图像看作 RGB 三元组的矩阵(在 RGB 图像模型情况下),但它们不一定是以这种格式创建、存储或传输的。有许多不同的文件格式,如 GIF、PNG、位图或 JPEG,使用不同形式的压缩(无损或有损)来更有效地表示图像。

下表列示了 OpenCV 支持的文件格式及其关联的文件扩展名:

文件格式文件扩展名
Windows bitmaps*.bmp和*.dib
JPEG files*.JPEG、*.jpg 和 *.jpe
JPEG 2000 files*.jp2
Portable Network Graphics*.png
Portable image format*.pbm、*.pgm 和 *.ppm
TIFF files*.TIFF 和 *.tif

对图像应用无损或有损压缩算法,可以得到比未压缩图像占据存储空间小的图像。其中,在无损压缩算法中,得到的图像与原始图像等价,也就是说,经过反压缩过程后,得到的图像与原始图像完全等价(相同);而在有损压缩算法中,得到的图像并不等同于原始图像,这意味着图像中的某些细节会丢失,在许多有损压缩算法中,压缩级别是可以调整的。