使用C#,我如何在Windows文件系统中搜索图像,就像TinEye.com在web上搜索一样?

使用C#,我如何在Windows文件系统中搜索图像,就像TinEye.com在web上搜索一样?,c#,windows,image-processing,ms-office,system.drawing,C#,Windows,Image Processing,Ms Office,System.drawing,嗨,谢谢你的关注 更新 为了清晰起见,第三方.NET库也可以。最好是开源或免费的。解决方案不必是本机.NET 背景 我正在开发一个企业web应用程序,客户机为我们提供了MS Word文档中数千页的内容,我们必须解析、提取数据并发送到内容数据库 在这些文档中,有各种嵌入的图像,表示单独文件夹中较大的原始图像 客户端没有提供任何指向原始源图像的路径,因此当我们在MS Word文档中看到包含嵌入图像的内容时,我们必须通过几个“资产”文件夹查找相应的图像,这非常耗时 我们已经在使用它来解析文档,因此您可

嗨,谢谢你的关注

更新 为了清晰起见,第三方.NET库也可以。最好是开源或免费的。解决方案不必是本机.NET

背景 我正在开发一个企业web应用程序,客户机为我们提供了MS Word文档中数千页的内容,我们必须解析、提取数据并发送到内容数据库

在这些文档中,有各种嵌入的图像,表示单独文件夹中较大的原始图像

客户端没有提供任何指向原始源图像的路径,因此当我们在MS Word文档中看到包含嵌入图像的内容时,我们必须通过几个“资产”文件夹查找相应的图像,这非常耗时

我们已经在使用它来解析文档,因此您可以假设我们有一个位图图像列表,可以循环使用我们从文档中提取的位图图像。

问题: 给定刚从文档中提取的位图列表,我们如何搜索包含数百个图像的不同文件夹以查找匹配图像,然后返回其文件路径

TinEye.com是通过网络实现的。我想知道,使用System.Drawing之类的工具,我们是否可以在带有C#的PC上完成

谢谢


Matt

在.NET framework中没有用于生成图像相似性的内置算法。您需要使用第三方库,或者自己使用。很多图像相似性算法问题,所以:


还有一个,用于.NET:。这一个是指你,它似乎有你想要的算法。

根据一个类似的问题,你应该看看OpenCV和VLFeat。前者有一个C++ API,后者是一个C API,所以你需要编写自己的P/Jook包装器,或者把它们包在一个C++/CLI外观中,你可以从C语言调用。

< P>讨厌对我自己的问题提出一个答案,但是我想我可能会在这里找到一些东西。下面是C#forms应用程序的启发式/伪代码——非常感谢您的想法:

第一部分
  • 使用System.IO,遍历“资产”文件夹并获取所有图像
  • 对每个图像进行编码
  • 获取结果字符串并将其放入XML文件中:
  • 
    C:\SomePath
    [一些Base64字符串]
    
    现在我们有了一个包含所有原始图像的XML文件,格式为Base64,以及它们的文件路径

    第二部分
  • 使用,从MS Word文档中提取所有图像
  • 对于每个图像,使用Linq to Xml在第1部分的Xml文件中搜索精确匹配
  • 如果没有精确的匹配,则开始迭代XML文件并计算结果
  • 而在
    foreach
    中,将XML节点Id(或文件路径)和Levenshtein距离作为键值对存储在对象中
  • 获取LD分数最低的k/v对并返回文件路径
  • 为了提高性能,请设置公差,以便在与从文档中提取的图像相比时,如果某个原始图像的LD分数低到可以接受的程度,则会停止
    foreach
  • 由于这是一项一次性任务,我不需要立即执行。所以,我可以在今晚离开办公室之前运行这个程序,希望明天能返回到一个连接原始图像和文档中嵌入图像的路径列表

    更新
    上面的启发式算法运行得很好!我最终使用了有效地计算Base64字符串之间的距离。具体来说,我使用了他们的FastDistance()方法。在找到我需要的图像时有100%的准确率,即使照片拍摄的角度略有不同。

    我将补充另一个类似的问题:谢谢你们,但这些链接都没有真正的帮助。这可能就是为什么这个问题不断出现在如此多的宣言中的原因。我不在乎这是否发生在本机.NET中,一个库就可以了。而且,我现在可能无法自己编写一个库,所以上面讨论算法理论的所有链接都没有帮助,尤其是那些甚至没有涉及.NET的链接。不过还是要谢谢你。请看我的编辑,看另一本你可能会更容易使用的。啊,是的,我忘了一本书,谢谢。去年夏天,我偶然发现图书馆在各种方面都有巨大的潜力。我刚在倒咖啡的时候有了个主意。我要先试试,看看它是否管用,然后再跳进一个大洞。同时,投票给一位总统。干杯好吧,几小时后,当我有一个新的每日投票配额时,我就可以投票了;)。谢谢你,大卫!我会调查这些。与此同时,我将提出一个我刚刚提出的答案,这个答案(对我来说)似乎更优雅,似乎更合理。请注意,它可能是内存绑定的。你可能需要以某种方式将其分为若干批。这一点很好。我最多有60个图像每个文档,所以我会做的每个文档的基础上。现在就开始验证这个理论。谢谢如果同一图像出现在多个文档中会发生什么?谢谢Chris。如果在多个文档中有一个公共图像就可以了,因为我只是返回一个文件路径。最后,我将把本地映像发送到CDN,然后用CDN路径交换本地文件路径。因为,在这一点上,我将有一个嵌入图像和原始图像文件路径之间的关联,我可以交换出相应的CDN地址以及。谢谢@克丽莎因啊,克鲁德。当我尝试将每个Base64字符串的长度设置为int[length1,length2]时,遇到System.OutOfMemory异常。看来你对内存问题的看法是对的。还在挖。
    <Image>
         <Path>C:\SomePath</Path>
         <EncodedString>[Some Base64 String]<Encoded String>
    </Image>