5

我们有一个图像数据库,我使用David Oftedal实施的Neal Krawetz 博士的方法计算了 PHASH 。

部分示例代码计算了这些 long 之间的差异:

ulong hash1 = AverageHash(theImage);
ulong hash2 = AverageHash(theOtherImage);

uint BitCount(ulong theNumber)
{
    uint count = 0;
    for (; theNumber > 0; theNumber >>= 8) {
        count += bitCounts[(theNumber & 0xFF)];
    }
    return count;
}

Console.WriteLine("Similarity: " + ((64 - BitCount(hash1 ^ hash2)) * 100.0) / 64.0 + "%");

挑战在于我只知道其中一个哈希值,并且我想查询 SOLR 以按相似度顺序查找其他哈希值。

几点注意事项:

  1. 在这里使用 SOLR(我唯一的选择是 HBASE)
  2. 想要避免将任何自定义 java 安装到 solr 中(很高兴安装现有插件)
  3. 很高兴在 C# 中进行大量预处理
  4. 乐于使用多个字段将数据存储为位字符串、长等
  5. 使用 SOLRNet 作为客户端

编辑,一些额外的信息(抱歉我陷入了这个问题并开始假设它是一个广为人知的领域)。这里是 C# 控制台/示例应用程序的直接下载:http: //01101001.net/Imghash.zip

此控制台应用程序的示例输出为:

004143737f7f7f7f phash-test-001.jpg
0041417f7f7f7f7f phash-test-002.jpg
相似度:95.3125%

4

1 回答 1

4

您可以为此使用Solr 的模糊搜索,您必须在页面上向下滚动一点。

Solr 的标准查询解析器支持基于 Levenshtein 距离或编辑距离算法的模糊搜索。模糊搜索发现与指定术语相似但不一定完全匹配的术语。要执行模糊搜索,请在单个词项的末尾使用波浪号 ~ 符号。

假设你有一个像下面这样的模式,这个字段phash包含你计算的 phash。

<fields>
    <!-- ... all your other fields ... -->
    <field name="phash" type="string" indexed="true" stored="true" />
</fields>

您可以执行如下查询

q=phash:004143737f7f7f7f~0.8&
fl=score,phash

这将返回所有 PHASHLevenshtein Distance or Edit Distance至少为 80% 的文档。您不会得到您在问题中给出的 95.3125%,但会计算 87.5% 作为匹配/不匹配字符。

当您想查看该值时,您可以执行以下查询

q=phash:004143737f7f7f7f~0.8&
fl=score,phash,strdist("0041417f7f7f7f7f", phash, edit)

这是一个使用 Levenstein 或 Edit 距离获取字符串距离的函数调用,将提供类似于

+----------------+---------------------------------------+
|hash            |strdist("0041417f7f7f7f7f", hash, edit)|
+----------------+---------------------------------------+
|0041417f7f7f7f7f|1.0                                    |
+----------------+---------------------------------------+
|004143737f7f7f7f|0.875                                  |
+----------------+---------------------------------------+

当您想减少和之间的差距时95.3125%87,5%您应该考虑将 PHASH 存储为不作为十六进制值,而是作为八进制值。

于 2014-02-14T16:02:59.320 回答