知乎/回答
2 分钟

如何在自己计算机上以图搜图?

作者

创建于

修改于

发布于知乎/回答

。。。。。。。。。

想了想,没有想到有类似的软件,要不我给你讲讲如何自己写一个吧

几个关键的步骤:

  1. 搜索本地所有图片
  2. 为所有图片抽取特征,建立索引
  3. 抽取所要查询图片的特征
  4. 搜索

稍微详细一点的解释:

  • 图片,太复杂了,所以我们的思路是把它转化为一个更简单的东西来搜索——向量。
  • 我们只使用颜色特征。简单。
  • 对于一个图,我们可以考虑其RGB值。比如其中一个点的RGB为(100,50,255)。它有很多各种各样的点。
  • 颜色直方图(color histogram)统计其中所有点的颜色的分布。同时,我们可以做一些降维处理。
  • 比如,我们将R.G.B(0-255)各分成两份(0-127,128-255)则我们可以有:

R G B PixelCount

0 0 0 44

0 0 1 21

0 1 0 42

0 1 1 80

1 0 0 29

1 0 1 30

1 1 0 20

1 1 1 40

  • 则此时,我们可以用一个向量(44,21,42,80,29,30,20,40)来表示这个图,完成了特征的抽取!
  • 我们为每一张图片进行特征的抽取,得到了一堆向量B。同时我们对查询的图片进行特征抽取,得到了一个向量,比如A.
  • 则此时,我们需要在B中找到最“接近”A的向量,此处的“接近”你可以用欧式距离即可。
  • 此时,在B中暴力搜索就可以啦!已经很简单啦!
  • 考虑到图片数量众多,以后可能还会查询,建议可以建立一个索引树,使用Rtree比较好。

我以Python为例,说下比较重要的技术问题

  1. 搜索本机所有图片:这个。。听起来比较简单,以“python+查找文件夹下所有文件”之类的关键词可以很容易找到。
  2. 为图片抽取特征:考虑到最简单的特征,我们只抽取颜色直方图(color histogram),python有图像库Image,其中可以直接调用histogram来获取颜色直方图。你可以进一步将其处理为一个向量。
  3. 为向量建立索引:Rtree是一个不错的索引结构,我看了看此处有已经实现了的(http://pypi.python.org/pypi/Rtree/),直接使用即可。
  4. 抽取所要查询的特征:见第2步
  5. 搜索:在Rtree上搜索向量即可,也应该没什么问题。

————————

嗯,自己动手,丰衣足食!