检测不同分辨率下的图像相等性

时间:2009-11-10 05:24:02

标签: ruby image image-processing computer-vision similarity

我正在尝试构建一个脚本来浏览原始的高分辨率照片,并在我拥有专业帐户之前替换我上传到Flickr的旧的低分辨率照片。

对于他们中的许多人,我可以使用Exif信息,例如确定匹配日期。但有些人真的很老了,要么原始文件没有Exif信息,要么被我当时使用的任何愚蠢的调整大小软件所破坏。

因此,无法依赖元数据,我不得不求助于内容本身。问题是原件的分辨率不同于Flickr上的分辨率(这是这项努力的重点)。那么我有没有办法将它们与某种模糊相似性度量进行比较,这样可以让我设置一个需要人类输入的阈值?

我想知道一个图像是另一个图像的调整大小版本可以产生比一般相似性更好的结果。任何语言的解决方案都可以做到,但Ruby将是一个优势:)

3 个答案:

答案 0 :(得分:7)

有趣的问题,顺便说一下:)

缓慢解决方案 - 成功的绝佳机会

使用比例不变特征检测器查找两个图像中的相应特征。如果功能与类似位置的高分相匹配,那么您就有了匹配。

我建议使用SIFT生成比例尺&用于在图像中找到的特征的旋转不变128整数描述符。 SURF(在OpenCV中可用)是另一个(更快的)特征点检测器。

您可以通过bruteforce(将每个描述符与另一个图像中的描述符进行比较)将两个图像中的要素匹配,这是O(n ^ 2)但非常快(特别是在VL SIFT实现中)。但是,如果您需要将一个图像中的要素与几个图像(您可能需要)进行比较,则应构建一个要素树,以便使用其他图像的要素进行查询。 K-D树很有用,OpenCV有很好的实现。

快速解决方案 - 可能有效

将您的高分辨率图像下采样到低分辨率尺寸,并使用像SAD这样的相似性度量(其中两个图像中像素周围的3x3像素块之间的差异总和为分数)确定一场比赛。

答案 1 :(得分:3)

我建议使用ImageMagick编写解决方案的脚本。以下(来自comparing images with IM的文档)将输出您可以使用的比较值。

convert image1 image2 \
        -compose difference -composite -colorspace gray miff:- |\
  identify -verbose - |\
    sed -n '/^.*Mean: */{s//scale=2;/;s/(.*)//;s/$/*100\/32768/;p;q;}' | bc

答案 2 :(得分:3)

计算两个图像的标准化 color histogram并使用某种方法比较它们(例如,直方图交叉点 - 请参阅上面的链接)。请注意,需要标准化的直方图,因为图像呈现不同的分辨率。如果图像如此不同,则它们不是相同的图像。但如果它们相似,则您有以下两种情况之一:(i)它们是相同的图片或(ii)它们是不同的图片但呈现类似的全局颜色分布。

对于情况(ii),拆分图像和矩形图块并重复该过程,比较相应的图块。您正在尝试考虑图片的本地属性。对结果进行排名并选择最佳匹配。