Алгоритм хеширования изображений для получения естественных значений первичного ключа, которые хорошо работают в табличных индексах PostgreSQL?

1

Я создаю набор совлокальных хранилищ данных с изображениями, и я начинаю реализовывать простые/тривиальные поисковые и сортировочные алгоритмы на основе контента: SIFT, разреженное расстояние между цветами и гистограммой, базовое SVD и т.д.

В настоящее время я использую хэши sha1 двоичных данных в качестве индексов в таблицах PostgreSQL. Эти хэши "глупые" - они вычисляются путем подачи данных в вопрос * прямо на модуль Python hashlib.sha1 и хранятся в столбцах с hashlib.sha1, которые в точности равны представлению sha1 base64.

Было бы довольно панацеей реализовать алгоритм хэширования, который бы дал хеши, подходящие для индексирования таблиц Postgres, но это также каким-то образом описывало изображение, а также фашистское или хаммингское расстояние. В то время как phash выглядит как хороший кандидат, он, как оказалось, требует использования запатентованного механизма хранения и API... Я ищу что-то меньшее, чем "под ключ", которое будет хорошо работать с моими существующими Python/Postgresql/Solr/Редизационная экосистема.

Это не должно быть самым быстрым - для меня более важно реализовать алгоритм (или алгоритмы), который можно немного взломать и оставаться несколько убедительным.

(*) в основном это состоит из нетрансформированных или слегка трансформированных урожаев из моих изображений - таких, как: содержимое файла изображения JPEG/PNG/DNG, структуры данных профиля ICC, дампы JSON наборов тегов EXIF /IPTC и т.д.

  • 1
    Существует конфликт между тем, как работают индексы БД, и требованиями к хэшу образа. Индексы БД одномерные (линейно упорядоченные). Сходство изображений моделируется как метрика в многомерном пространстве (по крайней мере, я не знаю ни одного алгоритма, который бы использовал что-то более слабое). Не существует сохраняющего расстояние отображения из многомерного пространства на линейный индекс.
  • 0
    Ага - пост Джитамаро (ниже), похоже, предлагает заполнение пространства кривой как средство для одномерности без значительной потери. Это возможный конец в этом случае? ... В любом случае, в данный момент я занимаюсь статистическим анализом цвета, а не извлечением признаков; Я определенно воспользуюсь другим подходом к индексированию таблиц, полных извлеченных функций, в соответствии с вашей точкой зрения, но если вы на мгновение меня здесь рассмешите: может быть хеш для цветовых данных (одноканальный или другой), который может также работать как индекс БД? ... В любом случае, спасибо за совет.
Показать ещё 16 комментариев
Теги:
image-processing
algorithm
hash

2 ответа

0
Лучший ответ

Как насчет кривой заполнения пространства, например кривая Гильберта или кривая moore?

  • 0
    Это интересный способ исследования - я прочитал небольшую статью о кривых Гильберта, но я не использовал ее. Я предполагаю, что я использую кривую, чтобы сгладить изображение в гигантский вектор, к которому я затем могу применить широкий диапазон хешей и / или других преобразований ... Это ваше предложение?
  • 1
    В основном кривая Гильберта - это кривая черепицы. Это помогает уменьшить 2d сложность до 1d сложности, но чтобы преобразовать ее в хеш, вам понадобится другой алгоритм, возможно быстрое преобразование Фурье. Я хотел предложить вам что-то вроде сжатия jpeg, которое использует z-кривую и быстрое преобразование Фурье.
1

Весьма интересный подход описан в http://railsware.com/blog/2012/05/10/effective-similarity-search-in-postgresql/.

В основном изображение масштабируется до 15x15 px, затем интенсивность вычисляется для каждого пикселя (0,299 * красный + 0,587 * зеленый + 0,114 * синий). Этот массив из 255 значений хранится в столбце таблицы PostgreSQL с индексом Gin/Gist для быстрого поиска похожих изображений.

  • 0
    Эта статья увлекательна и весьма актуальна - снятие отпечатков пальцев в PL / SQL на самом деле является предметно-ориентированным умением. Спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню