Я создаю набор совлокальных хранилищ данных с изображениями, и я начинаю реализовывать простые/тривиальные поисковые и сортировочные алгоритмы на основе контента: SIFT, разреженное расстояние между цветами и гистограммой, базовое SVD и т.д.
В настоящее время я использую хэши sha1 двоичных данных в качестве индексов в таблицах PostgreSQL. Эти хэши "глупые" - они вычисляются путем подачи данных в вопрос * прямо на модуль Python hashlib.sha1
и хранятся в столбцах с hashlib.sha1
, которые в точности равны представлению sha1 base64.
Было бы довольно панацеей реализовать алгоритм хэширования, который бы дал хеши, подходящие для индексирования таблиц Postgres, но это также каким-то образом описывало изображение, а также фашистское или хаммингское расстояние. В то время как phash выглядит как хороший кандидат, он, как оказалось, требует использования запатентованного механизма хранения и API... Я ищу что-то меньшее, чем "под ключ", которое будет хорошо работать с моими существующими Python/Postgresql/Solr/Редизационная экосистема.
Это не должно быть самым быстрым - для меня более важно реализовать алгоритм (или алгоритмы), который можно немного взломать и оставаться несколько убедительным.
(*) в основном это состоит из нетрансформированных или слегка трансформированных урожаев из моих изображений - таких, как: содержимое файла изображения JPEG/PNG/DNG, структуры данных профиля ICC, дампы JSON наборов тегов EXIF /IPTC и т.д.
Как насчет кривой заполнения пространства, например кривая Гильберта или кривая moore?
Весьма интересный подход описан в http://railsware.com/blog/2012/05/10/effective-similarity-search-in-postgresql/.
В основном изображение масштабируется до 15x15 px, затем интенсивность вычисляется для каждого пикселя (0,299 * красный + 0,587 * зеленый + 0,114 * синий). Этот массив из 255 значений хранится в столбце таблицы PostgreSQL с индексом Gin/Gist для быстрого поиска похожих изображений.