Алгоритм поиска визуального сходства - PullRequest
8 голосов
/ 12 июня 2009

Я пытаюсь создать утилиту, подобную этой http://labs.ideeinc.com/multicolr, но я не знаю, какой алгоритм они используют, кто-нибудь знает?

Ответы [ 3 ]

5 голосов
/ 12 июня 2009

Все, что они делают, это сопоставляют гистограммы.

Итак, постройте гистограмму для ваших изображений. Нормализуйте гистограммы по размеру изображения. гистограмма - это вектор, содержащий столько же элементов, сколько цветов. Вам не нужно 32,24 и, возможно, даже 16 бит точности, и это только замедлит вас. По соображениям производительности я бы отображал гистограммы в 4, 8 и 10-12 бит.

  • Сделайте нечеткое least distance compare между всеми 4-битными гистограммами и вашими образцами цветов.
  • Затем возьмите этот набор и сравните 8-битную гистограмму.
  • Тогда, возможно, перейдите к 10 или 12-битной гистограмме и сравните с оставшимся набором. Это будет поиск с наивысшей производительностью, потому что вы сравниваете общий набор с очень небольшим количеством вычислений, чтобы найти небольшое подмножество.
  • Затем вы работаете с небольшим подмножеством с большим количеством вычислений и т. Д.

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

  • Начните с расчета расстояния. В 3 измерениях я думаю, что это было:

    SQRT ((x1-x2) ^ 2 + (y1-y2) ^ 2 + (z1-z2) ^ 2)

Я делаю это по памяти, так что посмотрите, чтобы убедиться.

  • Для ваших целей у вас будет более 3-х измерений, поэтому у вас будет больше терминов. 4-битная гистограмма будет иметь 16 терминов, 8-битная - 256, и т. Д. Помните, что этот тип математики медленный, поэтому на самом деле не выполняйте часть SQRT. Если вы нормализуете размер своих изображений достаточно мал, скажем, до 10000 пикселей, то вы знаете, что вам когда-либо придется только x^2 для значений 0..10,0000. Предварительно вычислите таблицу поиска x^2, где x идет от 0,10 000. Тогда ваши расчеты пойдут быстро.

  • Когда вы выбираете цвет из палитры, просто создайте гистограмму с этим цветом = 10,0000. При выборе 2 создайте гистограмму с цветом1 = 5000, цветом2 = 5000 и т. Д.

  • В конце вы должны будете добавить коэффициенты выдумки, чтобы приложение соответствовало реальному миру, но вы найдете их при тестировании.

2 голосов
/ 01 сентября 2010

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

  • собрать цвета каждого пикселя на изображении
  • выполнить кластеризацию (скажем, кластеризацию по k-среднему значению с 5 кластерами) для собранных цветов
  • сохранить кластерные цвета в качестве типичного дескриптора изображения

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

Каков размер вашей коллекции изображений, потому что в зависимости от размера некоторая поисковая индексация может быть большей проблемой, чем сам алгоритм?

0 голосов
/ 12 июня 2009

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

...