Все, что они делают, это сопоставляют гистограммы.
Итак, постройте гистограмму для ваших изображений. Нормализуйте гистограммы по размеру изображения. гистограмма - это вектор, содержащий столько же элементов, сколько цветов. Вам не нужно 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 и т. Д.
В конце вы должны будете добавить коэффициенты выдумки, чтобы приложение соответствовало реальному миру, но вы найдете их при тестировании.