用Python和OpenCV构建属于自己的图像搜索引擎( 二 )


比如:
· 每个红、绿、蓝通道的均值和标准差
· 用图像的统计矩来表征形状 。
· 用来描述形状和纹理的梯度大小和方向 。
这里的重要结论是,图像描述符决定了如何对图像进行量化 。
另一方面,特性是图像描述符的输出 。当您将图像放入图像描述符时,您将从另一端获得特性 。特征(或特征向量)是最基本的术语,只是用于抽象地表示和量化图像的数字列表 。
形象的用下图表示:

用Python和OpenCV构建属于自己的图像搜索引擎

文章插图
 
Figure 4: 图像描述符的管道 。将输入图像呈现给描述符,应用图像描述符输出特征向量(i 。返回一个数字列表),用于量化图像的内容 。
这里向我们展示了一个输入图像,我们应用图像描述符,然后我们的输出是一个用于量化图像的特性列表 。然后利用距离度量或相似度函数对特征向量进行相似性比较 。距离度量和相似度函数将两个特征向量作为输入,然后输出一个数字,表示这两个特征向量有多"相似" 。
下图显示了比较两幅图像的过程:
用Python和OpenCV构建属于自己的图像搜索引擎

文章插图
 
Figure 5:为了比较两幅图像,我们将各自的特征向量输入距离度量/相似度函数 。输出是一个值,用于表示和量化这两幅图像彼此之间的"相似性" 。
给定两个特征向量,用距离函数来确定这两个特征向量的相似程度 。距离函数的输出是一个单浮点值,用来表示两幅图像之间的相似性 。
任意一个图像检索系统包含四步
无论你正在构建什么基于内容的图像检索系统,它们都可以归结为4个不同的步骤:
1. 定义图像描述符: 在这个阶段,您需要决定要描述图像的哪个方面 。你对图像的颜色感兴趣吗?图像中物体的形状?或者你想描述纹理?
2. 索引你的数据集: 现在,你有你的图像描述符定义,你的工作是这个图像描述符应用于每个图像数据集,从这些图像中提取的特征,编写功能存储(例CSV文件,RDBMS,redis,等等), 这样便于后续比较他们的相似性 。
3. 定义相似性度量: 现在你有了一堆特征向量 。但是你要怎么比较它们呢? 流行的选择包括欧氏距离、余弦距离和卡方距离,但实际的选择高度依赖于(1)数据集和(2)提取的特征类型 。
4. 搜索: 最后一步是执行实际的搜索 。用户提交查询图像系统(从一个上传表单或通过移动应用程序,例如),你的工作将是(1)从这个查询图像, 然后提取特征(2)应用相似性函数比较查询功能已索引的特性 。然后,根据相似性函数返回最相关的结果 。
同样,这是任何CBIR系统中最基本的4个步骤 。随着它们变得更加复杂,并利用不同的特性表示,步骤的数量会增加,您将向上面提到的每个步骤添加大量的子步骤 。但是现在,让我们保持简单,只使用这4个步骤 。
让我们看一些图形,使这些高级步骤更具体一些 。下图详细说明了步骤1和步骤2:
用Python和OpenCV构建属于自己的图像搜索引擎

文章插图
 
Figure 6: 表示从数据集中每个图像中提取特征的过程的流程图 。
我们首先获取图像数据集,从每个图像中提取特征,然后将这些特征存储在数据库中 。然后我们可以继续执行搜索(步骤3和步骤4):
用Python和OpenCV构建属于自己的图像搜索引擎

文章插图
 
Figure 7: 在CBIR系统上执行搜索 。用户提交查询,描述查询图像,将查询特性与数据库中的现有特性进行比较,根据相关性对结果进行排序,然后将结果呈现给用户 。
首先,用户必须向图像搜索引擎提交查询图像 。然后我们获取查询图像并从中提取特性 。然后将这些"查询特性"与我们已经在数据集中索引的图像的特性进行比较 。最后,根据相关性对结果进行排序并呈现给用户 。
度假照片数据库
我们将使用INRIA Holidays数据集作为我们的图像数据集 。
这个数据集包含了来自世界各地的各种度假旅行,包括埃及金字塔的照片、海底与海洋生物的潜水、山上的森林、晚餐时的酒瓶和餐盘、划船远足和大洋对岸的日落 。
以下是数据集中的一些例子:
用Python和OpenCV构建属于自己的图像搜索引擎

文章插图
 
Figure 8: 来自INRIA Holidays数据集的示例图像 。我们将使用这个数据集来构建我们的图像搜索引擎 。
一般来说,这个数据集在建模我们期望游客在风景旅游中拍摄什么方面做得非常好 。


推荐阅读