Расстояние между N изображениями: постепенно!(тот же урожай, но повторно сжатый / отрегулированный) - PullRequest
2 голосов
/ 27 декабря 2011

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

Итак, мне нужно что-то, что:

  • INPUT: список JPG или PNGизображения на диске
  • ВЫХОД: Для каждого изображения строка WHERE чем длиннее общий префикс строки между любыми двумя изображениями, тем выше вероятность того, что два изображения одинаковы.

Это не обязательно должно быть идеально, и оно не должно обрабатывать крайние случаи, такие как обрезанные изображения или сильно скорректированные изображения.Он предназначен для нескольких копий одного и того же изображения с разным разрешением и степенью сжатия.

Я не могу использовать:

  • Хэширование файлов или данных изображения, потому что даже небольшое изменениемежду двумя изображениями получается совершенно другой хэш, и вы не получите никакой близости
  • Вычитание изображения, потому что это не будет сравнение N-N.

I 'Я читал другие ответы, чтобы попробовать вейвлет-сжатие или лапласианскую / гауссовскую пирамиду, но я не уверен, как реализовать в Java или Python.Тем не менее, я добился прогресса!

  1. Измените размер до 32x32, используя http://today.java.net/pub/a/today/2007/04/03/perils-of-image-getscaledinstance.html, чтобы не сбрасывать данные.Хорошо, что все превращается в квадрат.
  2. Создайте пирамиду из последовательно уменьшающихся миниатюр вплоть до 2x2.
  3. В 2x2 закодируйте строку " - этоследующий пиксель ярче текущего? Если да, то 1, иначе 0"(Это отбрасывает весь оттенок и насыщенность, я, возможно, захочу как-нибудь использовать оттенок)
  4. Кодирование последовательных двоичных чисел из 8x8 и 32x32пирамиды
  5. Преобразование большого двоичного числа в некоторое представление с более высоким основанием, например Base62.

Это, кажется, работает хорошо!Незначительных отличий от сжатия или цветового баланса недостаточно, чтобы изменить «левая сторона этой области ярче, чем правая».Тем не менее, я думаю, что заново изобретаю колесо, какое-нибудь прогрессивное кодирование может быть лучше?Обнаружение SIFT и других функций является излишним, мне не нужно обрабатывать кадрирование или вращение.

Ответы [ 3 ]

0 голосов
/ 28 декабря 2011

Как насчет этого. Строка хэша состоит из групп из трех символов, представляющих красный, зеленый и синий:

{R0, G0, B0}, {R1, G1, B1}, {R2, G2, B2}, ...

Для каждой группы размер изображения уменьшается до 2 ^ N на 2 ^ N квадрата. Тогда значение является суммой (скажем, 255 или любой другой вашей кодировки) различий в интенсивности каждого из цветов в течение некоторого прохода через пиксели.

Таким образом, в качестве небольшого примера, например, для вычисления группы 1 (изображение 2x2) можно использовать следующий код (я беспокоился только о красном пикселе)

int rSum = 0;
int rLast = 0;
for (int i=0; i<2; i++) {
  for (int j=0; j<2; j++) {
    rSum += Math.abs(image[i][j].r - rLast);
    rLast = image[i][j].r;
  }
}
rSum %= 255;

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

Хотя при более высоких значениях N вероятность столкновения возрастает (многие изображения будут иметь одинаковые значения суммы разностей для интенсивностей RG и B через них), каждая последующая итерация должна раскрывать новую информацию об изображении, которая не был протестирован с предыдущей итерацией.

Может быть довольно дорого в вычислительном отношении, но у вас есть преимущество (которое я могу вывести из вашего вопроса, который вы, возможно, пожелаете), что вы можете завершить вычисление хэша, как только отрицательный будет обнаружен в пределах определенного порога.

Просто идея, дайте мне знать, если мне непонятно!

0 голосов
/ 07 января 2012

Получение хороших результатов из следующего:

Уменьшение (используя хорошее масштабирование, которое не отбрасывает информацию) до трех изображений: 1x7, 7x1 и 6x6.

Преобразовать все в оттенки серого.

Для каждого изображения кодировка "следующий пиксель ярче?"стать значениями для трех столбцов. Хорошая последовательно улучшенная разность, упакованная в 2 символа, 2 символа и 6 символов. Правда, отбрасывает все цвета, но все же хорошо!

0 голосов
/ 28 декабря 2011

То, что вы описываете, кажется мне примером Локально-чувствительного хеширования , примененного к проблеме подобия изображения.

Я не уверен, что свойство общего префикса желательно для хорошей хэш-функции.Я ожидаю, что хорошая хеш-функция будет иметь два свойства:

1) Хорошая локализация - для изображений I1 и I2 норма (Hash (I1) -Hash (I2)) должна представлять визуально воспринимаемое сходство I1 иI2.

2) Хорошее сжатие - данные изображения большого размера должны быть встроены в пространство хеш-функций низкого размера самым различительным образом.

...