第三章 图像基础

3.1 像素

3.1.1 像素和颜色

像素是图像的构成元素,每个图片都是由一系列像素组成。一个图片的像素数量=长像素数*宽像素数。

大多数像素可以分成两类:

  1. 灰度/单通道
  2. 彩色通道

灰通道的像素是一个标量,它的取值在0~255之间,其中0表示黑色,255表示白色。

彩色通道的像素是一个三元组,三元组中的值表示红、绿、蓝颜色的数量,它们的范围都在0~255之间。我们通常用8位int表示0~255之间的数。

但是,通常情况下,我们并不会将图片的像素数据直接放入神经网络中进行训练,其中都要进行一个数据转化的过程,即使用一些加载方式(例如OpenCV)将像素int数据转成float类型的数据。

由于RGB颜色范围包含255的三次方,也就是16777216种颜色,所以绝大多数的数据集中图片的颜色都可以使用RGB颜色来进行表示。

3.1.2 构成图片数据

我们知道,RBG颜色是红绿蓝三个通道,因此,一张图片可以由三个部分组成,每个部分表示一个颜色通道。而对于每个部分是一个矩阵,又可以用W*H来表示。因此,一张彩色图片是由W*H*D来组成的,W是宽度,H是高度,D是通道数。对于RGB颜色区域来说,D=3.

彩色图如何计算像素点与像素点之间的色差python 像素与颜色数量_深度学习

3.1.3 像素的坐标系

 像素的坐标表示和一般的数学坐标系不太一样,它是从0开始,并且左上角为(0,0),如图所示。

彩色图如何计算像素点与像素点之间的色差python 像素与颜色数量_数据_02

3.1.4 使用Numpy数组表示图片

height在width前面,原因是像素在图片中用坐标表示的形式是 (y, x).

import cv2
image = cv2.imread("img.png")
print(image.shape)
cv2.imshow("Image",image)
cv2.waitKey(0)

值得注意的是,OpenCV对于RGB的排序方式是BGR

3.2 缩放图片(scaling)

在缩放图片时,我们通常会固定图片的纵横比,这样能保证图片不会被过于压缩或者拉伸。但是,固定纵横比的操作并不适用于深度学习,因为神经网络的输入通常要求所有图片为一个固定的尺寸。通常,深度学习所需要的尺寸为:

32✖️32,64✖️64,224✖️224, 227✖️227, 256✖️256, 299✖️299.

因此,我们仍然需要对图片进行横向压缩或者纵向压缩。具体使用什么压缩方式,是需要具体情况进行分析的。对于一些数据集,可以不需要考虑压缩的影响;对于另一些数据集,则需要在变换尺寸前先做一些处理。对于具体的方式将在后面的章节中详细介绍。


第四章 图像分类基础

对于人类来说,图片是非常好识别的,大家一眼就能看出一张图片的内容。但对于计算机来说,图片是由一个个矩阵组成的。想要让计算机知道一张图片在表示什么内容,就需要应用图像分类任务了,图像分类是计算机视觉的一个子课题。

什么是图像识别?

举个例子。我们假设我们的图片数据集中包含三个类别:{猫,狗,熊猫}

然后,我们将一张图片放入到识别系统中,将会得到这样的结果:狗:95%,猫:4%,熊猫:1%。

一个语义鸿沟

下面展示了两张不同的图片,他们在计算机的眼中,即两个不同的矩阵。

彩色图如何计算像素点与像素点之间的色差python 像素与颜色数量_计算机视觉_03

一开始,计算机并不能分辨出每张图片的内容。 但是,我们可以从三个角度分解这张图片:

1. 位置:上面是天空,下面是湖水;

2. 颜色:天空是蓝色,湖水是绿色;

3. 纹理:天空是非常均匀的图案,湖水是较为粗糙的图案;

计算机如何描述这些信息呢?方式就是特征提取,将数据提取成特征向量。有一些传统的人工设计的特征,如HOG、LBP;另一个方式就是在深度学习中自动提取特征了。

4.1 图像识别的挑战

图像识别会遇到多种挑战。一个目标在不同的因素下都会有不同的变化,主要分类如下:

  1. 角度变化:不同角度下,一个物品的样子是不同的;
  2. 尺寸变化:一个物品会有多种不同的尺寸,例如大杯中杯小杯;
  3. 变形:物品产生形变;
  4. 遮挡:目标物品被其他物品遮挡;
  5. 照明, 例如强光弱光的影响;
  6. 背景杂波的影响;
  7. 类别内部的变化,例如椅子里有沙发,高脚椅,矮凳;

我们的图像识别系统要足够识别以上多种变化,甚至是组合变化。这个难度是很大的。或许可以将识别的对象范围进行缩小,使用具体的任务;例如识别冰箱来代替识别所有厨房物品。(Frame your problem