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

Posted

技术标签:

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

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

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

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

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

【问题讨论】:

按名称或按图像复制图像?? 来自图片,比如图片比较。对不起 你应该看看这篇文章:***.com/questions/684713/… research.microsoft.com/pubs/135074/phashmain.pdf 【参考方案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 处理。

【讨论】:

以上是关于在数据库的特定目录中查找重复或相似的图像的主要内容,如果未能解决你的问题,请参考以下文章

如果分辨率更改,则查找相似图像[重复]

仅使用图像而不是通过标签从数据库中查找相似图像

查找不同目录中特定文件夹中的文件

根据特定条件查找重复值

如何通过使用 grep 扫描整个目录来在文件内容中查找具有特定字符串的文件 [重复]

查找特定文件名的扩展名