Я рекомендую розглянути можливість відійти від використання лише гістограми RGB.
Краще дайджест вашого зображення можна отримати, якщо взяти вейвлет зображення 2d Haar (його набагато простіше, ніж це звучить; його просто багато усереднень і кілька квадратних коренів, які використовуються для зважування ваших коефіцієнтів) і просто зберегти 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