title: Новый проект -- libsimdb, библиотека для поиска визуально похожих изображений
---
Эта идея периодически всплывала в голове, поскольку минимум раз в год я перебираю свой архив контента.
Но, поскольку это именно что "раз в год", реализация неоднократно откладывалась.
---
Итак, исходная задача -- есть архив с десятками тысяч картинок, надо найти там дубли
(в том числе разного размера, качества и формата), оставить наилучшее из группы, остальное удалить.
Надо сказать, что идея не новая, востребованная и кое-где уже реализованная:
* wine + ImageDupeless (древняя вендовая софтина) -- если б оно было под линукс, проблема была бы закрыта.
Недостатки: нужен вайн, гуй прибит гвоздями, исходников разумеется нет
* [findimagedupes](http://www.jhnc.org/findimagedupes/) (perl + inline::c) -- честно ищет похожие, но у него просто ебическая скорость обработки, даже с "оптимизацией" через inline::c
* [gthumb](https://wiki.gnome.org/Apps/gthumb) -- т.н. "поиск дубликатов" сравнивает файлы тупо по md5
* [imgseek](http://www.imgseek.net) -- тут уже целый демон со встроенным вебсервером. (потенициально оттуда можно портировать алгоритмы сравнения).
Проект похоже мёртв, сайт лежит, код на сорсфорже, последний коммит в 2013м.
Мне хотелось именно чёткое отделение нужного функционала в библиотеку, без лишних зависимостей.
А на основе этой библиотеки уже строить инструменты.
Два года назад я таки решил, что так жить дальше нельзя, и взялся за дело сам.
Результат выкладываю в открытый доступ, может кому пригодится.
Основной принцип работы -- сравнение битовых карт яркости, с некоторыми оптимизациями.
Теоретически библиотека может обрабатывать до `INT_MAX` изображений,
но на практике, максимально тестировавшийся объём -- примерно 1.8 миллиона изображений.
Скорость -- приличная, на таком объёме поиск работает за время до 2х секунд,
без учёта времени сэмплирования исходного изображения.
Размер базы -- по 48 байт на запись, для в/у объёма это будет порядка 86,5 Мб.
У библиотеки чисто-сишный интерфейс, работа сделана через opaque handle + набор функций для работы с ним.
Записи адресуются по числовому id, поиск выдаёт их же.
Что вы будете делать с этими номерами - уже ваша забота.
Все видимые функции и структуры снабжены doxygen'овскими комментами.
Утилита писалась в том числе для проверки удобства работы с api.
На версии до 0.4 даже не смотрите, там треш и угар в коде,
писалось изначально "для себя", в стиле "похер как, лишь бы работало".