图像相似度检测

标签 image image-processing machine-learning similarity

我一直在尝试编写一个可以抓取 Deviantart.com 的抓取工具。它在本地保存新图像的副本,并在 Postgresql DB 中为该图像创建一条记录。我的问题:当新图像出现时,我如何知道这个新图像是否对应于我之前见过的图像? DA 上的欺骗行为相当罕见,但同时,从更普遍的意义上来说,这是一个有趣的问题。

对如何继续进行的想法?

现在,当我抓取图像时,Postgresql 数据库已填充,并且其中有一个如下所示的表:

CREATE TABLE Image
(
    id SERIAL PRIMARY KEY NOT NULL,
    url varchar(5000) UNIQUE NOT NULL,
    dateadded timestamp without time zone default (now() at time zone 'utc'),
    width int,
    height int
);

其中 url 是我从 DA 中抓取的图像链接(例如:http://th05.deviantart.net/fs70/PRE/f/2014/222/2/3/sketch_dump_56_by_lilaira-d7uj8pe.png),dateaddeddatetime抓取工具找到了图像,并且 width & height是图像尺寸。

我目前不将图像本身存储在数据库中,但我保留了本地镜像 - 我获取图像的 URL 和 wget -r -nc文件。所以对于一个网址:http://th05.deviantart.net/fs70/PRE/f/2014/222/2/3/sketch_dump_56_by_lilaira-d7uj8pe.png我在 <somedir>/th05.deviantart.net/fs70/PRE/f/2014/222/2/3/sketch_dump_56_by_lilaira-d7uj8pe.png 保留了本地副本

现在,一般情况下的图像识别是相当困难的。我希望能够处理诸如轻微调整大小之类的问题,我可以通过将所有图像标准化为特定分辨率来解决这一问题,并在查询时将查询图像标准化为相同的分辨率。我希望能够处理格式更改(PNG vs JPG vs 等)之类的事情,我可以通过将图像文件读取为标准化格式来完成(例如:每个像素的未压缩 RGB 值,尽管理想情况下会出现一些“松弛”)这里可以容忍)。

最好有(愿意为了简化/更高的准确性而放弃):

  • 我希望能够处理图像的裁剪(例如:我以前见过 imageA ,有人采用 imageA 并将其裁剪并将其上传为 imageB 我想注意到作为副本)。
  • 我希望能够处理带有 Logo 的图像水印
  • 我希望能够在要分类的新图像是先前看到的图像的子图像的情况下处理裁剪(即 - 我已存储 imageA ,有人获取 imageA 并裁剪它,我希望能够将裁剪后的图像映射到 imageA )

限制/额外信息:

  • 我对查找不同但相似的图像完全不感兴趣(例如:同一辆红色巴士的两张不同照片应报告为两张不同的图像)
  • 虽然我并不完全反对使用元数据(例如:艺术家、图像类别等),但我希望尽可能将其限制为图像数据(EXIF 数据、分辨率、RBG 颜色值) .
  • 尺寸缩小并出现在我希望认为不同的较大图像中的图像。例如:我有imageA ,我将其大小调整为 50x50,并且 50x50 网格出现在新图像中,我不会认为新图像与 imageA “相同” (尽管我认为根据前面概述的标准,我会认为 imageA 是新图像的副本)
  • 如果能够检测到图像中的“微小”修改(例如:图像中 Gamma 值的全面更改等),那就太好了,但不是必需的

想法?有建议吗?

对于我的用例,我更关心误报而不是漏报,因此“模糊匹配”方法应该谨慎行事。

如果重要的话,我会用 Python 编写所有这些内容,不过说实话,如果替代技术能够优雅/高效地解决我的问题,我很乐意使用它。

最佳答案

我会在不靠近边缘的地方抓取一个小子图像,并将其在数据库图像中的源位置附近进行交叉关联。您可以在互相关之前对其重新采样,以考虑小调整大小,并且可以选择匹配的附近区域的大小,以考虑一定百分比的不对称裁剪。

为了避免完全适合无特征区域(例如天空),您可以使用局部图像变化作为子图像位置的选择标准。

这仍然会很慢,因此有必要使用全局图像度量来首先从数据库中选择候选重复项(例如 danf 提到的颜色直方图)。

关于图像相似度检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25233787/

相关文章:

matlab - 如何在矩阵或二进制图像中绘制多边形以便使用图像处理功能?

python - SkLearn 多项式 NB : Most Informative Features

r - 使用 R 线性回归进行机器学习

ios - CGDataProvider 在 Swift 4 中返回 null

html - 做个类(class)网站,背景图比我需要的高?

php - MySQL全选并从特定id开始

css - 使用 Reactstrap : Unable to apply CSS styles to image for CarouselItem and how to use div instead of image

android - 通过摄像头进行人脸检测

image-processing - 使用透视投影进行矩形识别的霍夫变换与轮廓检测

linux - sc 未在 SparkContext 中定义