【问题标题】:Finding Duplicate or Similar Images on a specific directory on a database在数据库的特定目录中查找重复或相似的图像
【发布时间】:2012-05-02 16:57:52
【问题描述】:

我对此并不陌生,我的反对意见是构建一些 Web 应用程序来实现用户将图像存储在数据库中作为存储,我想要的只是减少存储的一对或一些图像两次或更多。

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

我只是想开发如何在数据库的特定目录中找到一些相似或重复的图像。你能从一开始就给我一些关于如何构建它的解释,以及我应该从基本步骤中学习什么来完成这个,比如教程之类的。如果可能的话,我想学很多东西。

提前谢谢,我真的需要帮助,谢谢。

【问题讨论】:

标签: image image-processing image-comparison cbir


【解决方案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 处理。

【讨论】:

    猜你喜欢
    • 2012-08-25
    • 2014-07-17
    • 2021-04-01
    • 2012-05-03
    • 1970-01-01
    • 2014-11-30
    • 2013-03-15
    • 2011-04-19
    • 2017-11-24
    相关资源
    最近更新 更多