Поиск дубликатов или похожих изображений в определенном каталоге в базе данных

Я новичок в этом, и я возражаю против создания какого-либо веб-приложения, которое реализует пользователя для хранения изображения в базе данных в качестве хранилища, и все, что я хочу, это уменьшить, если есть пара или несколько изображений, которые хранятся дважды или более,

Итак, все, что мне нужно, это как найти дубликаты или похожие изображения, которые уже сохранены в базе данных, или даже лучше, когда пользователь пытается импортировать их на первом шаге, и если их изображения похожи на изображения, которые уже были сохранены на база данных, система может дать предупреждение не хранить это изображение.

Я просто хочу разработать, как найти несколько похожих или повторяющихся изображений в определенном каталоге в базе данных. Можете ли вы дать мне какое-то объяснение с самого начала о том, как его построить, и что я должен узнать, чтобы выполнить это с базового шага, такого как учебник или что-то еще. Я бы хотел многому научиться, если это возможно.

Заранее спасибо, мне очень нужна эта помощь, спасибо.

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.
Другие вопросы по тегам