在数据库的特定目录中查找重复或类似的映像

时间:2012-04-21 08:49:17

标签: image image-processing image-comparison cbir

我是新手,我的反对意见是建立一些Web应用程序来实现用户将数据存储在数据库中作为存储,而我想要的只是存储一对或一些图像时减少两次或更多次。

所以,我需要的是如何找到已存储在数据库中的重复或类似图像,或者当用户尝试在第一步中导入它时更好,并且如果他们的图像与已经存在的图像类似存储在数据库中的系统可以发出警告,不要存储该图像。

我只想开发如何在数据库的特定目录中找到一些类似或重复的图像。你能否从第一部分给我一些关于如何构建它的解释,我应该从基本步骤学到什么,比如教程或其他什么。如果可能的话,我想学到很多东西。

先谢谢,我真的需要这个帮助,谢谢。

1 个答案:

答案 0 :(得分:1)

寻找类似图像的解决方案要复杂得多,所以我会先找到重复的图像。最简单的方法是采用图像位的SHA1哈希值。下面是C#中的一些代码来实现这一点(见下文)。至于将哈希存储在数据库中,我建议您使用binary(20)数据类型来存储哈希的结果。这使得SQL服务器能够比将此哈希存储为字符串或其他格式更快地进行索引和查询。

private static byte[] GetHashCodeForFile(string file)
{
    int maxNumberOfBytesToUse = 3840000;

    using (Stream sr = File.OpenRead(file))
    {
        byte[] buffer = (sr.Length > maxNumberOfBytesToUse) ? new byte[maxNumberOfBytesToUse]: new byte[sr.Length];

        int bytesToReadIn = (sr.Length < maxNumberOfBytesToUse) ? (int)sr.Length : maxNumberOfBytesToUse;

        sr.Read(buffer, 0, bytesToReadIn);
        System.Security.Cryptography.HashAlgorithm hasher = System.Security.Cryptography.SHA1.Create();
        byte[] hashCode = hasher.ComputeHash(buffer);
        return hashCode;

    }
}

搜索类似图像是目前正在进行大量研究的难题。这有点取决于你如何定义相似的。寻找类似图像的一些突出方法是:

  • 检查图像文件中的元数据(EXIF或类似)标签的创建日期,可以在彼此相似的时间拍摄类似的图像。这可能不是你想要的最好的东西。
  • 计算两个图像的相对历史图,并将它们与每个颜色通道中的增量进行比较。这样做的好处是可以编写SQL查询并且对图像大小不变。使用此方法可以找到已转换为缩略图的图像。
  • 在两个图像之间执行图像减法,并查看图像与纯黑色(全零)的接近程度。我不知道使用TSQL查询执行此操作的方法,并且此代码可能会因需要调整大小的图像而变得棘手。
  • 计算图像的轮廓(通过Sobel,canny或其他边缘检测器)然后减去两个图像以查看它们的轮廓有多少重叠。我再也不认为这可以在SQL中处理。