Степень похожести бинарных файлов

kode

never knows best
Степень похожести бинарных файлов

Предложите вариант получения степени похожести бинарных файлов.

Суть такова: пишется бот, который будет собирать картинки. Но картинки могут отличатся друг от друга одним пикселем (таким кол-вом чтобы суть изображения не менялась, обьяснять долго - но такое есть). Просто хотелось бы чтобы схожие (с точки зрения человека) дубликаты картинки не сохранялись.

Моя идея: Возможно это будет немного ресурсо затратно, но думаю что стоит считать дерево хешей (Tiger) (размер сегмента верхнего (первого) уровня зависит от размера файла) и сравнивать их на соответсвующем размеру файла уровне (а не в корне)

Сразу оговорюсь что бот пишется на яве
 

fixxxer

К.О.
Партнер клуба
посмотри как rsync устроен, там дерево хэшей как раз, производительность вполне вменяемая.
правда, от минимального ресайза-кропа или небольшой цветокоррекции это не поможет)
 

kruglov

Новичок
Одно и то же изображение в gif и png будет совсем разными "бинарными" файлами. Если вы изображения сравниваете, так и надо задачу формулировать. И в поиске искать.
 

dr-sm

Новичок
а пережатый джпег, как раз файлсайз-то и будет разный
можт в верх лучше размер картинки.
 

AmdY

Пью пиво
Команда форума
kode
а формат у изображений какой?
 

kode

never knows best
я говорю ничего срашного если изображения будут разного размера или формата
 

Роберт

Аналитик
Ну так если для твоя программа должна сказать "Практически идентичны" для файла размером 100х100 пикселей (занимающем 11Кб) и файла 1600х1600 пикселей (занимающем более 3 мегабайт) - то как можно ставить задачей "сравнение бинарных файлов"?
Ты по любому обязан работать с видеообразами!
А дальше уже способо много:
хочешь , по гамме цветов анализируй ,
хочешь , по спектру
хочешь , придумай алгоритм нахождения кривых на картинке и анализируй их количество и направления.
Я например , когда 10 лет назад делал програмку которая через WinAPI сама управляя мышкой играла за человека в паззлы (где есть маленькая картинка подсказка и потом надо составить из кусочков большую картинку) - просто делил картинку на определённое количество кубиков (в зависимости от того - на сколько разбит пазл , ну скажем 20х10) и потом внутри каждого квадратика из центральной части примерно в 2 раза меньше чем сам квадратик просто считал сумму цвета по RGB , а потом делил на количество ссумированных точек (другими словами находил средний цвет квадратика). После чего , взяв любой элементик пазла , я быстро находил похожий на него элемент в маленькой картинке (таким же образом осреднив цвет) , и программа всегда-всегда быстро собирала пазл.
Но ещё раз повторю - поставленная тобой задача (сравнения картинок) ничего общего не имеет со сравнением бинарных файлов...
 

kode

never knows best
блин, повторяю: мне важно чтобы картинки одинаковые по формату и размеру, но отличающиеся всего несколькими пикселями не сохронялись. Если файл другого формата, другого размера, с другой гаммой цветов - пусть будут
 

Роберт

Аналитик
Ты одно сообщение назад говорил что "ничего страшного если изображения будут разного размера или формата" , а теперь заявляешь что тебе "важно чтобы картинки одинаковые по формату и размеру". И как тебя понимать? Причём ты не даёшь формата изображения. Тогда это вообще абсурдная задача. Мол если где-то немножко изменю чего-то , то это несчитается.
Если взять Word , то изменение одной буквы может изменить размер файла на 30Кб. Если текстовый файл заархивировать с паролем - то он вообще ни чем не будет напоминать то что будет если аналогичный текстовый файл с одной изменённой буквой заархивировать с тем же паролем!
Что ты хочешь делать на уровне бинарного файла?
Открой какой-нибудь .jpg файл из сети в программе paint , измени одну точку и сохрани - он вообще почти ни одного общего байта не будет иметь за исключением шапки JFIF. Таже компрессия...
Твою задачу можно реализовать только анализируя картинку!
 

kode

never knows best
парень, ты по русски читать умеешь? Смысл текста улавиваешь?
> мне важно чтобы картинки одинаковые по формату и размеру, но отличающиеся всего несколькими пикселями не сохронялись.

-~{}~ 18.05.08 03:46:

да, компрессия это беда....

-~{}~ 18.05.08 03:51:

как вариант можно хранить дерево хешей карты пикселей
 

Роберт

Аналитик
Вариантов сотни...
Но как я тебе уже дважды сказал - ты будешь работать с картинкой , а не бинарным файлом!
 

С.

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

fixxxer

К.О.
Партнер клуба
вы с терминологией определитесь, друзья ;)))
я вот всегда считал что картинка - это такая кучка байтиков в количестве width * height * ( color_depth / 8 )
 

kode

never knows best
Автор оригинала: С.
kode, ты бы хоть прикола ради взял картинку, поменял один пиксель, сохранил и сравнил с оригинальной каким-нибудь filediff. Я думаю, тебя ждет открытие.
сделаю для тебя открытия что изменение будет максимум на длинну LZW-кода, похожая ситуация с jpeg, если конечно степень компрессии не менять.....
 
Сверху