у меня есть 90 тысяч тайлов карты такого вида https://files.catbox.moe/w1xifl.png и координаты каждого тайла на глобальной карте;
нужно по аплоаду подобного тайла от юзера находить этот тайл среди 90 тысяч и, таким образом, сообщать координаты;
дело в том, что тайл от юзера может немного отличаться от тайла на глобальной карте, а значит вместо обычных хешей нужен locality sensitive hash;
взял https://github.com/trendmicro/tlsh
у них в пдфке сказано, что по очевидным причинам любые заенкоженные файлы сравниваются плохо, в случае картинок надо сравнивать битмапы;
но у пользователя тайл в png, а значит нужно прямо в бравзере конвертировать в битмпап - нашёл такую ерунду с канвасом https://stackoverflow.com/a/29652507
и уже вроде всё заработало, но в разных бравзерах канвас даёт разные результаты (при этом визуально тайлы выглядят одинаково) и там, где в форефоксе разница между двумя тайлами ноль, в хрёме разница оказывается 150+, что гораздо больше, чем разница с другими, гораздо более визуально отличающимися тайлами;
бнвач, подскажи, что проще - искать способ конвертации пнг в бмп без канваса? держать таблицы хешей для каждого бравзера? у каких ещё бравзеров канвас работает отлично от хрома и фаерфокса?
Что за херотень? Слово «bitmap» означает сами данные изображения, а не формат файла .BMP. Хешируй и сравнивай сами массивы данных, раз они всегда одного размера.
@ceyt сорь, тут https://github.com/trendmicro/tlsh/blob/master/DFRWS_Similarity_Digests.pdf речь именно о формате .bmp
https://files.catbox.moe/fks1z2.png
как раз из-за неудовлетворительных результатов от хеширования байтиков у png начал читать пдфки в репе
@kogda Тебе не байтики в PNG нужны, а байтики декодированного изображения из этого файла. BMP они используют только из-за того, что это один из фиксированных несжатых форматов представления этих байтиков.
@ceyt да, это я затупил, спасибо; но для декодирования изображения мне всё равно необходим канвас, так? а он даёт разные результаты в разных браузерах
@kogda Если ты берёшь ImageData с одними и теми же размерами, то логично предположить, что незначительная разница в цветах пикселей из-за разных библиотек цветокоррекции будет мало отражаться на хэше. (Или нет.)
Можешь декодировать файл без canvas через pngjs, можешь использовать специальные алгоритмы сравнения изображений, а не универсальные.
@ceyt Я бы порекомендовал второе, потому что не уверен, что то, что есть, понимает, что нужно сохранять относительные зависимости между пикселями.
@ceyt спасибо, сделал с pngjs - именно то, что искал
@stiletto спасибо за ссылки! я искал простейший способ делать вот это всё прямо в браузере на страничке с гитхабпейджес
https://www.pyimagesearch.com/2017/11/27/image-hashing-opencv-python/ - написание своей хеш-функции, которая ресайзит картинку до 9*8 и сравнивает яркость соседних пикселей 64 раза, получая 64 бита хеша; интересно читать, но звучит слишком просто, надо сравнивать с результатами других решений;
http://phash.org/ - не разобрался, в чём разница между tlsh, phash и ctph (у ssdeep) и что лучше работает для какой задачи: там математика, а я тупой;
вариант с нейронками ещё более трудоёмкий, ссылки схоронил.