2014-02-14 71 views
5

我们有一个图像数据库,其中我使用Dr. Neal Krawetz's method来计算PHASH,如David Oftedal所示。使用SOLR计算两个长度之间的“相似度”/“位数”

的示例代码部分计算这些多头的区别就在这里:

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试验001.JPG
0041417f7f7f7f7f phash - 测试 - 002.JPG
相似度:95.3125%

+0

如果比较,你可以给两个哈希值和期望的结果吗?我对PHASH不太熟悉。 – cheffe

+0

@cheffe添加了一些关于PHASH的信息,基本上它将一个图像变成一个无符号的long/uint64,并对结果进行位计数以确定相似性。让我知道如果还有什么不清楚的地方! – CameraSchoolDropout

回答

3

您可以使用Solr's Fuzzy Search这一点,你需要向下滚动页面上的位。

Solr的标准查询解析器支持基于Levenshtein Distance或Edit Distance算法的模糊搜索。模糊搜索发现类似于指定术语的术语,而不一定完全匹配。要执行模糊搜索,请在单词术语末尾使用代字符〜符号。

假设您有像下面这样的模式,其中此字段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 

此执行查询将返回具有至少80%Levenshtein Distance or Edit Distance一个PHASH所有文档。你不会得到你在问题中给出的95.3125%,但是匹配/不匹配字符的数量是87.5%。

当你想看到的值,你可以执行以下查询

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

这是一个function call to fetch the String Distance使用莱文施泰因或编辑距离,将提供类似

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

当结果你想减少95.3125%87,5%之间的差距,你应该考虑将PHASH存储为不是十六进制值,而是例如八进制值。

+0

谢谢@cheffe - 我现在会测试这个,以提高字符比字节更进一步,如果使用像这样的单个字符串是有意义的:0000000001000001010000110111001101111111011111110111111101111111,我试图尽可能接近像bitcount例。 (尽管我非常高兴SOLR能够让我获得90%的通路,并通过C#中的其余工作) – CameraSchoolDropout

+0

感谢您的答复 - 就像上述方法一样,上述方法可以与bitcount算法完全匹配。 – CameraSchoolDropout

相关问题