pyimagesearch-1 我最喜欢的9个用于构建图像搜索引擎的Python库

原文链接

八年多来,当我第一次对计算机视觉和图像搜索引擎产生兴趣时,我不知道从哪里开始。我不知道使用哪种语言,我不知道要安装哪些库,以及我发现的库我不知道如何使用。我希望有一个这样的列表,详细介绍了用于图像处理,计算机视觉和图像搜索引擎的最佳库。

这份清单并非完整或详尽无遗。它只是我最喜欢的Python库,我每天都使用它们,每天都用于计算机视觉和图像搜索引擎。如果您认为我已经离开了重要的一个,请在评论中给我留言或发送电子邮件给我。

对于初学者:

  1. NumPy
    NumPy是Python编程语言的库,(除其他外)提供对大型多维数组的支持。为什么这很重要?使用NumPy,我们可以将图像表达为多维数组。例如,假设我们从Google下载了我们最喜欢的脾气暴躁的猫图像,现在我们想用NumPy将其表示为数组。该图像在RGB颜色空间中为452×589像素,其中每个像素由三个分量组成:红色值,绿色值和蓝色值。每个像素值p在0 <= p <= 255的范围内。然后我们具有452×589这样的像素的矩阵。使用NumPy,我们可以方便地将此图像存储在(452,593,3)数组中,其中包含452行,593列和3个值,RGB颜色空间中的每个像素对应一个值。将图像表示为NumPy阵列不仅具有计算和资源效率,而且许多其他图像处理和机器学习库也使用NumPy阵列表示。此外,通过使用NumPy内置的高级数学函数,我们可以快速对图像进行数值分析。
  2. SciPy
    与NumPy携手共进,我们也有SciPy。SciPy进一步增加了对科学和技术计算的支持。我最喜欢的SciPy子包之一是空间包,其中包括大量的距离函数和kd-tree实现。为什么距离函数很重要?当我们“描述”图像时,我们执行特征提取。通常在特征提取之后,图像由数字的向量(列表)表示。为了比较两个图像,我们依赖于距离函数,例如欧氏距离。为了比较两个任意特征向量,我们简单地计算它们的特征向量之间的距离。在欧几里德距离的情况下,距离越小,两个图像越“相似”。
  3. matpotlib
    简而言之,matplotlib是一个绘图库。如果你以前曾经使用过MATLAB,你可能会对matplotlib环境感到非常舒服。在分析图像时,我们将使用matplotlib,无论是绘制搜索系统的整体精确度还是仅查看图像本身,matplotlib都是您工具箱中的绝佳工具。
  4. PIL和Pillow
    我没有任何反对PIL或Pillow的东西,不要误会我的意思,他们非常善于做什么:简单的图像处理,如调整大小,旋转等等。总的来说,我只是发现语法笨拙。话虽这么说,许多非科学的Python项目都使用PIL或Pillow。例如,Python Web框架Django使用PIL来表示数据库中的ImageField。如果你需要做一些快速而肮脏的图像操作,PIL和Pillow就有它们的位置,但如果你认真学习图像处理,计算机视觉和图像搜索引擎,我强烈建议你花时间玩OpenCV和SimpleCV相反。
  5. OpenCV
    如果NumPy的主要目标是大型,高效,多维的阵列表示,那么到目前为止,OpenCV的主要目标是实时图像处理。这个库自1999年以来一直存在,但直到2009年的2.0发布才能看到令人难以置信的NumPy支持。库本身是用C / C ++编写的,但在运行安装程序时提供了Python绑定。OpenCV是我最喜欢的计算机视觉库,但确实有学习曲线。准备花费相当多的时间来学习图书馆的复杂性并浏览文档(现在已经添加了NumPy支持,这些文档已经变得更好)。如果您仍在测试计算机视觉水域,您可能需要查看下面提到的SimpleCV库,它具有明显更小的学习曲线。
  6. SimpleCV
    SimpleCV的目标是让您尽快参与图像处理和计算机视觉。而且他们做得很好。学习曲线远远小于OpenCV的学习曲线,正如他们的标语所说,“它的计算机视觉变得简单”。总而言之,因为学习曲线较小,所以您无法访问OpenCV提供的许多原始,强大的技术。如果您只是在测试水域,请务必尝试使用此库。但是,作为公平警告,本博客中95%以上的代码示例都将使用OpenCV。不过不用担心,在文档方面我非常细致,我将为您提供完整而简洁的代码解释。
  7. mahotas
    Mahotas,就像OpenCV和SimpleCV一样,依赖于NumPy阵列。Mahotas中实现的大部分功能都可以在OpenCV和/或SimpleCV中找到,但在某些情况下,Mahotas界面更易于使用,特别是在功能包方面。
  8. scikit-learn
    好吧,你难住我了,Scikit-learn不是图像处理或计算机视觉库 - 它是一个机器学习库。也就是说,没有某种机器学习,你无法拥有先进的计算机视觉技术,无论是聚类,矢量量化,分类模型等.Scikit-learn还包括一些图像特征提取功能。
  9. ilastik
    我会说实话。我从未使用过ilastik。但是通过我在计算机视觉会议上的经验,我遇到了相当数量的人,所以我觉得不得不把它放在这个列表中。Ilastik主要用于图像分割和分类,尤其适用于科学界。

这里有三个我一直使用的优秀库:

  1. pprocess
    从图像中提取特征本质上是可并行化的任务。您可以使用多处理库减少从整个数据集中提取要素所需的时间。我最喜欢的是pprocess,由于我需要它的简单性,但你可以使用你最喜欢的。
  2. h5py
    h5py库是Python中存储大型数值数据集的事实标准。它的优点是为NumPy阵列提供支持。因此,如果你有一个表示为NumPy数组的大型数据集,并且它不适合内存,或者你想要NumPy数组的高效,持久存储,那么h5py就是你要走的路。我最喜欢的技术之一是将我提取的特征存储在h5py数据集中,然后应用scikit-learn的MiniBatchKMeans来对特征进行聚类。整个数据集永远不必一次完全从磁盘上加载,内存占用空间非常小,即使对于数千个特征向量也是如此。
  3. scikit-image
    在这篇博文的初稿中,我完全忘记了scikit-image。太蠢了。无论如何,scikit-image非常棒,但是你必须知道你正在做些什么来有效地使用这个库 - 我并不是说这是一种“有一种陡峭的学习曲线”的方式。学习曲线实际上非常低,特别是如果你看看他们的画廊。scikit-image中包含的算法(我认为)更接近于计算机视觉中的最新技术。学术论文中的新算法可以在scikit-image中找到,但为了(有效地)使用这些算法,您需要在计算机视觉领域中形成一些严谨和理解。如果您已经拥有计算机视觉和图像处理方面的经验,请务必查看scikit-image;否则,我会继续使用OpenCV和SimpleCV开始。

综上所述:

NumPy为您提供了一种将图像表示为多维数组的方法。许多其他图像处理,计算机视觉和机器学习库都使用NumPy,因此安装它(和SciPy)是至关重要的。虽然PIL和Pillow非常适合简单的图像处理任务,但如果您认真考虑测试计算机视觉水域,那么花在使用SimpleCV上的时间更长。一旦你确信计算机视觉很棒,安装OpenCV并重新学习你在SimpleCV中所做的事情。我将在本博客中向您展示的95%以上代码示例都将在OpenCV中。最后,安装scikit-learn和h5py。你现在还不需要它们。但是一旦我告诉你他们能做什么,你就会爱上他们。

你可能感兴趣的:(翻译)