11

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

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

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

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

4

3 回答 3

7

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

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

使用尺度不变特征检测器在两个图像中找到对应的特征。如果这些特征在相似的位置以高分匹配,那么你就有了匹配项。

我推荐SIFT,它为图像中的特征生成比例和旋转不变的 128 整数描述符。SURF(在 OpenCV 中可用)是另一个(更快的)特征点检测器。

您可以通过蛮力(将每个描述符与另一个图像中的描述符进行比较)匹配两个图像之间的特征,这是 O(n^2) 但非常快(尤其是在 VL SIFT 实现中)。但是,如果您需要将一张图像中的特征与多张图像(您可能必须这样做)进行比较,您应该构建一个特征树,以便与另一张图像的特征进行查询。KD 树很有用,OpenCV有一个很好的实现。

快速解决方案 - 可能有效

将高分辨率图像下采样到低分辨率尺寸,并使用SAD之类的相似性度量(其中两个图像中像素周围的 3x3 像素块之间的差异之和就是分数)来确定匹配。

于 2009-11-10T05:40:08.567 回答
3

我建议使用 ImageMagick 编写解决方案。以下(来自有关将图像与 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
于 2009-11-10T06:48:51.330 回答
3

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

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

于 2009-11-10T11:48:28.840 回答