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


目标
我们的目标是建立一个个人图像搜索引擎 。给定我们的度假照片数据集,我们希望通过创建一个"更像这样"的功能使这个数据集"可搜索"——这将是一个"示例搜索"图像搜索引擎 。例如,如果我提交一张帆船划过河流的照片,我们的图像搜索引擎应该能够找到并检索我们在游览码头和码头时的度假照片 。
请看下面的例子,我提交了一张水上船只的照片,并在我们的度假照片收藏中找到了相关的图片:

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

文章插图
 
Figure 9: 我们的图像搜索引擎的一个例子 。我们提交了一个包含海上船只的查询图像 。返回给我们的结果是相关的,因为它们也包括船只和大海 。
为了构建这个系统,我们将使用一个简单但有效的图像描述符: 颜色直方图 。通过使用颜色直方图作为图像描述符,我们将依赖于图像的颜色分布 。因此,我们必须对我们的图像搜索引擎做出一个重要的假设:
假设: 具有相似颜色分布的图像将被认为彼此相关 。即使图像的内容有很大的不同,只要它们的颜色分布也相似,它们仍然会被认为是"相似的" 。这是一个非常重要的假设,但是当使用颜色直方图作为图像描述符时,这通常是一个公平合理的假设 。
步骤1: 定义图像描述符
我们不使用标准的颜色直方图,而是使用一些技巧,使它更加健壮和强大 。
我们的图像描述符将是HSV颜色空间(色调、饱和度、值)中的三维颜色直方图 。通常,图像表示为红、绿和蓝(RGB)的三元组 。我们经常把RGB颜色空间想象成"立方体",如下图所示:
用Python和OpenCV构建属于自己的图像搜索引擎

文章插图
 
Figure 10: RGB立方体的例子
然而,虽然RGB值很容易理解,但是RGB颜色空间不能模拟人类感知颜色的方式 。相反,我们将使用HSV颜色空间,它将像素强度映射到一个圆柱体:
用Python和OpenCV构建属于自己的图像搜索引擎

文章插图
 
Figure 11: HSV圆柱体的例子
还有其他一些颜色空间在模仿人类感知颜色方面做得更好,比如CIE L*a*b*和CIE XYZ空间,但是让我们在第一个图像搜索引擎实现中保持颜色模型相对简单 。
现在我们已经选择了一个颜色空间,现在我们需要为直方图定义方柱的数量 。直方图是用来给一个(粗略)的感觉像素强度的密度在一个图像 。本质上,我们的直方图将估计底层函数的概率密度,在本例中,是图像i中出现像素颜色


推荐阅读