Czy OpenCV obsługuje porównanie dwóch obrazów, zwracając pewną wartość (może procent), która wskazuje, jak podobne są te obrazy? Np. 100% zostałoby zwrócone, gdyby ten sam obraz został przesłany dwukrotnie, 0% zostałoby zwrócone, gdyby obrazy były zupełnie inne.
Przeczytałem już wiele podobnych tematów tutaj na StackOverflow. Zrobiłem też trochę Google. Niestety nie mogłem znaleźć satysfakcjonującej odpowiedzi.
image
opencv
comparison
similarity
Boris
źródło
źródło
Odpowiedzi:
To obszerny temat, zawierający odpowiedzi z 3 linii kodu na całe magazyny naukowe.
Przedstawię najpopularniejsze takie techniki i ich wyniki.
Porównanie histogramów
Jedna z najprostszych i najszybszych metod. Proponowane dziesiątki lat temu jako sposób na znalezienie podobieństw w obrazach. Chodzi o to, że las będzie miał dużo zieleni, a ludzka twarz dużo różu lub cokolwiek innego. Jeśli więc porównasz dwa zdjęcia z lasami, uzyskasz pewne podobieństwa między histogramami, ponieważ w obu jest dużo zieleni.
Dopasowywanie wzorców
Dobry przykład tutaj matchTemplate znajdujący dobre dopasowanie . Łączy szukany obraz z tym, w który jest przeszukiwany. Zwykle jest używany do znajdowania mniejszych części obrazu w większym.
Dopasowanie funkcji
Uważany za jeden z najskuteczniejszych sposobów wyszukiwania obrazów. Z obrazu wyodrębnia się szereg funkcji w sposób gwarantujący, że te same cechy zostaną ponownie rozpoznane nawet po obróceniu, skalowaniu lub pochyleniu. Funkcje wyodrębnione w ten sposób można dopasować do innych zestawów funkcji obrazu. Uważa się, że inny obraz, który ma duży odsetek cech pasujących do pierwszego, przedstawia tę samą scenę.
Znalezienie homografii między dwoma zestawami punktów pozwoli Ci również znaleźć względną różnicę w kącie fotografowania między oryginalnymi obrazami lub stopniem nakładania się.
Na stronie z pytaniami i odpowiedziami OpenCV mówię o różnicy między deskryptorami cech, które są świetne przy porównywaniu całych obrazów i deskryptorów tekstur, które są używane do identyfikacji obiektów, takich jak ludzkie twarze lub samochody na obrazie.
źródło
absdiff
codota.com/code/java/methods/org.opencv.core.Core/absdiff Ograniczanie wyniku tworzy maskę, która pozwala wyróżnić regiony, które zmieniały się w kolejnych scenach.Jeśli w celu dopasowania identycznych obrazów (ten sam rozmiar / orientacja)
Źródło
źródło
Rozwiązanie Sama powinno wystarczyć. Użyłem kombinacji różnicy histogramu i dopasowania szablonu, ponieważ żadna metoda nie działała dla mnie w 100% przypadków. Mniejsze znaczenie przypisałem jednak metodzie histogramu. Oto jak zaimplementowałem w prostym skrypcie Pythona.
źródło
Trochę poza tematem, ale przydatne jest
numpy
podejście pythonowe . Jest solidny i szybki, ale po prostu porównuje piksele, a nie obiekty lub dane, które zawiera obraz (i wymaga obrazów o tym samym rozmiarze i kształcie):Bardzo prostym i szybkim podejściem do zrobienia tego bez openCV i jakiejkolwiek biblioteki do wizji komputerowej jest znormalizowanie tablic obrazów przez
Po zdefiniowaniu obu znormalizowanych obrazów (lub macierzy) możesz po prostu zsumować mnożenie obrazów, które chcesz porównać:
1) Jeśli porównasz podobne zdjęcia, suma zwróci 1:
2) Jeśli nie są podobne, otrzymasz wartość od 0 do 1 (procent, jeśli pomnożymy przez 100):
Zwróć uwagę, że jeśli masz kolorowe zdjęcia, musisz to zrobić we wszystkich 3 wymiarach lub po prostu porównać wersję w odcieniach szarości. Często muszę porównywać ogromne ilości zdjęć z dowolną zawartością i to naprawdę szybki sposób na zrobienie tego.
źródło