图像相似性检测

时间:2014-08-10 22:51:56

标签: image image-processing machine-learning similarity

我一直在玩写一个刮掉Deviantart.com的刮刀。它在本地保存新图像的副本,并在Postgresql DB中为图像创建记录。我的问题:当新图像出现时,我如何知道这个新图像是否与我之前见过的图像相对应? Dupes在DA上相当罕见,但与此同时,这是一个更普遍意义上的有趣问题。

关于如何进行的想法?

现在Postgresql DB填充为我刮图像,其中有一个表格如下:

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
);

当我从DA(例如:http://th05.deviantart.net/fs70/PRE/f/2014/222/2/3/sketch_dump_56_by_lilaira-d7uj8pe.png)抓取图片时,url是图片的链接,dateadded是刮刀找到图片的datetime,{{1} }& width是图片尺寸。

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

保留了本地副本

现在,一般情况下的图像识别非常困难。我希望能够处理像轻微调整大小的事情,我可以通过将所有保存到特定分辨率的图像归一化来解释,并在查询时将查询图像规范化为相同的分辨率。我希望能够处理格式改变(PNG与JPG等)之类的事情,我可以通过将图像文件读入标准化格式来做(例如:每个像素的未压缩RGB值,尽管理想情况下有些"松弛& #34;这里可以容忍。)

很高兴(愿意放弃简化/更准确):

  • 我希望能够处理裁剪图像(例如:我之前见过<somedir>/th05.deviantart.net/fs70/PRE/f/2014/222/2/3/sketch_dump_56_by_lilaira-d7uj8pe.png,有人拿imageA并裁剪它并将其上传为{{ 1}}我想注意这是一个重复的内容。
  • 我希望能够为带有徽标的图像添加水印
  • 我希望能够在分类的新图像是先前看到的图像的子图像的情况下处理裁剪(即 - 我存储了imageA,有人需要{{1}并且裁剪它,我希望能够将裁剪后的图像映射到imageB

约束/额外信息:

  • 我根本不感兴趣寻找不同但相似的图像(例如:相同红色巴士的两张不同照片应报告为两张截然不同的图像)
  • 虽然我并不完全反对使用元数据(例如:艺术家,图像类别等),但我希望将其仅限于图像数据(EXIF数据,分辨率,RBG颜色)价值)尽可能。
  • 尺寸向下并显示在 new 较大图像中的图像我希望将其视为不同的图像。例如:我有imageA,我将其调整为50x50,并且50x50网格出现在新图像中,我不会考虑新图像&#34;相同&#34;作为imageA(虽然我认为之前列出的标准我会认为imageA是新图像的副本)
  • 如果能够发现&#34; minor&#34;那将会很好但不是必需的。图像中的修订(例如:对图像中的伽玛值进行全面更改等)

思考?建议?

对于我的用例,我更关心误报而不是假阴性,并且这样一个模糊匹配&#34;方法应谨慎行事。

如果重要的是我用Python编写所有这些内容,尽管TBH我很乐意使用替代技术,如果它能够优雅/高效地解决我的问题。

1 个答案:

答案 0 :(得分:0)

我会抓住一个不在边缘附近的小子图像,并在数据库图像中的源位置附近交叉关联。您可以在互相关之前对其进行重新取样以计算小尺寸,并且您可以选择与之匹配的附近区域的大小来计算特定百分比的不对称作物。

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

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