Я бы рекомендовал подумать о том, чтобы отказаться от использования гистограммы RGB.
Более качественный дайджест вашего изображения может быть получен, если вы возьмете двумерный вейвлет Хаара изображения (это намного проще, чем кажется, это просто большое усреднение и некоторые квадратные корни, используемые для взвешивания ваших коэффициентов) и просто сохраните k наибольшего взвешенные коэффициенты в вейвлете как разреженный вектор, нормализуйте его и сохраните, чтобы уменьшить его размер. Вы должны изменить масштаб RG и B с использованием перцепционных весов заранее, по крайней мере, или я бы рекомендовал переключиться на YIQ (или YCoCg, чтобы избежать шума квантования), чтобы вы могли сэмплировать информацию о цветности с меньшей важностью.
Теперь вы можете использовать скалярное произведение двух из этих разреженных нормализованных векторов в качестве меры сходства. Пары изображений с самыми большими скалярными произведениями будут очень похожи по структуре. Преимущество этого заключается в том, что он немного устойчив к изменению размера, смещению оттенка и водяным знакам, а также его очень легко реализовать и сжать.
Вы можете найти компромисс между хранением и точностью, увеличивая или уменьшая k.
Сортировка по одной числовой оценке будет трудноразрешимой для такого рода проблем классификации. Если подумать, это потребует, чтобы изображения могли «изменяться» только вдоль одной оси, но это не так. Вот почему вам нужен вектор функций. В случае вейвлета Хаара это примерно то место, где возникают самые резкие разрывы в изображении. Вы можете вычислить расстояние между изображениями попарно, но поскольку все, что у вас есть, это метрика расстояния, линейное упорядочение не может выразить «треугольник» из 3 изображений, которые все равно далеки друг от друга. (то есть подумайте о изображении, которое полностью зеленое, изображении, которое полностью является красным, и изображении, которое полностью синее.)
Это означает, что для любого реального решения вашей проблемы потребуется O (n ^ 2) операций в количестве имеющихся у вас изображений. В то время как, если бы было возможно линеаризовать меру, вы могли бы потребовать только O (n log n) или O (n), если мера подходила, скажем, для сортировки по основанию. Тем не менее, вам не нужно тратить O (n ^ 2), поскольку на практике вам не нужно просеивать весь набор, вам просто нужно найти то, что ближе, чем некоторый порог. Таким образом, применяя один из нескольких методов для разделения вашего разреженного векторного пространства, вы можете получить гораздо более быструю асимптотику для задачи `` найти мне k изображений, которые более похожи, чем заданный порог '', чем наивное сравнение каждого изображения с каждым изображением, давая вам то, что вам, вероятно, понадобится ... если не совсем то, о чем вы просили.
В любом случае, несколько лет назад я лично использовал это для хорошего эффекта, пытаясь свести к минимуму количество различных текстур, которые я хранил, но также было много шума исследований в этом пространстве, показывающего его эффективность (и в данном случае сравнение это более сложная форма классификации гистограмм):
http://www.cs.princeton.edu/cass/papers/spam_ceas07.pdf
Если вам нужна более высокая точность обнаружения, можно использовать алгоритмы minHash и tf-idf с вейвлетом Хаара (или гистограммой) для более надежного редактирования:
http://cmp.felk.cvut.cz/~chum/papers/chum_bmvc08.pdf
Наконец, в Стэнфорде есть поиск изображений, основанный на более экзотическом варианте такого подхода, основанный на извлечении большего количества функций из вейвлетов для поиска повернутых или масштабированных участков изображений и т. Д., Но это, вероятно, выходит далеко за рамки объема вашей работы. хотел бы сделать.
http://wang14.ist.psu.edu/cgi-bin/zwang/regionsearch_show.cgi