Zależy to całkowicie od tego, jak inteligentny ma być algorytm.
Na przykład, oto kilka problemów:
- obrazy przycięte a niecięte
- obrazy z dodanym tekstem vs. inne bez
- obrazy lustrzane
Najłatwiejszym i najprostszym algorytmem , jaki widziałem, jest po prostu wykonanie następujących kroków dla każdego obrazu:
- skalować do czegoś małego, na przykład 64x64 lub 32x32, zignorować proporcje, użyć łączącego algorytmu skalowania zamiast najbliższego piksela
- przeskaluj zakresy kolorów tak, aby najciemniejszy był czarny, a najjaśniejszy był biały
- obróć i odwróć obraz tak, aby najjaśniejszy kolor był w lewym górnym rogu, a następnie w prawym górnym rogu był następny ciemniejszy, dolny lewy był następny ciemniejszy (oczywiście o ile to możliwe)
Edycja łącząc algorytm skalowania jest, że podczas skalowania 10 pikseli w dół do jednego zrobi to za pomocą funkcji, która pobiera kolor wszystkich tych 10 pikseli i łączy je w jeden. Można to zrobić za pomocą algorytmów, takich jak uśrednianie, średnia wartość lub bardziej złożonych, takich jak dwusześcienne splajny.
Następnie oblicz średnią odległość piksel po pikselu między dwoma obrazami.
Aby wyszukać możliwe dopasowanie w bazie danych, zapisz kolory pikseli jako pojedyncze kolumny w bazie danych, zindeksuj kilka z nich (ale nie wszystkie, chyba że używasz bardzo małego obrazu) i wykonaj zapytanie, które używa zakresu dla każdego wartość piksela, tj. każdy obraz, w którym piksel małego obrazka znajduje się między -5 a +5 obrazu, który chcesz sprawdzić.
Jest to łatwe do wdrożenia i dość szybkie w działaniu, ale oczywiście nie poradzi sobie z najbardziej zaawansowanymi różnicami. Do tego potrzebne są znacznie bardziej zaawansowane algorytmy.