2

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

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

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

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

4

1 回答 1

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 中处理。
于 2013-05-04T01:57:22.590 回答