Potrzebuję prostego i szybkiego sposobu na porównanie dwóch obrazów w celu uzyskania podobieństwa. Tzn. Chcę uzyskać wysoką wartość, jeśli zawierają dokładnie to samo, ale mogą mieć nieco inne tło i mogą zostać przesunięte / zmienione o kilka pikseli.
(Bardziej konkretnie, jeśli to ma znaczenie: jedno zdjęcie jest ikoną, a drugie zdjęcie jest podobszarem zrzutu ekranu i chcę wiedzieć, czy ten podobszar jest dokładnie ikoną, czy nie.)
Mam pod ręką OpenCV, ale wciąż nie jestem do tego przyzwyczajony.
Jedna możliwość, o której do tej pory myślałem: Podziel oba zdjęcia na 10 x 10 komórek i dla każdej z tych 100 komórek porównaj histogram kolorów. Następnie mogę ustawić pewną skompilowaną wartość progową i jeśli wartość, którą otrzymam, jest powyżej tego progu, zakładam, że są one podobne.
Nie próbowałem jeszcze tego, jak dobrze to działa, ale myślę, że byłoby wystarczająco dobrze. Obrazy są już bardzo podobne (w moim przypadku użycia), więc mogę użyć dość wysokiej wartości progowej.
Sądzę, że istnieją dziesiątki innych możliwych rozwiązań, które działałyby mniej więcej (ponieważ samo zadanie jest dość proste, ponieważ chcę wykryć podobieństwo tylko wtedy, gdy są naprawdę bardzo podobne). Co byś zasugerował?
Istnieje kilka bardzo powiązanych / podobnych pytań dotyczących uzyskiwania podpisu / odcisku palca / skrótu z obrazu:
- OpenCV / SURF Jak wygenerować skrót obrazu / odcisk palca / podpis z deskryptorów?
- Odcisk palca obrazu w celu porównania podobieństwa wielu obrazów
- Wykrywanie niemal duplikatu obrazu
- OpenCV: Obraz odcisków palców i porównanie z bazą danych .
- więcej , więcej , więcej , więcej , więcej , więcej , więcej
Natknąłem się również na te implementacje, które mają takie funkcje, aby uzyskać odcisk palca:
- pHash
- imgSeek ( repozytorium GitHub ) (GPL) na podstawie papierowego Szybkiego Multiresolution Image Querying
- dopasowanie obrazu . Bardzo podobny do tego, czego szukałem. Podobnie jak pHash, oparty na sygnaturze obrazu dla dowolnego rodzaju obrazu, Goldberg i in . Wykorzystuje Python i Elasticsearch.
- iqdb
- ImageHash . obsługuje pHash.
- Image Deduplicator (imagededup) . Obsługuje CNN, PHash, DHash, WHash, AHash.
Kilka dyskusji na temat skrótów obrazu percepcyjnego: tutaj
Trochę poza tematem: Istnieje wiele metod tworzenia odcisków palców audio. MusicBrainz , usługa internetowa, która umożliwia wyszukiwanie utworów na podstawie linii papilarnych, ma dobry przegląd na swojej wiki . Używają teraz AcoustID . Służy do znajdowania dokładnych (lub głównie dokładnych) dopasowań. Aby znaleźć podobne dopasowania (lub jeśli masz tylko fragmenty lub wysoki poziom hałasu), spójrz na Echoprint . Powiązane pytanie SO znajduje się tutaj . Wygląda na to, że rozwiązano problem audio. Wszystkie te rozwiązania działają całkiem dobrze.
Nieco bardziej ogólne pytanie o rozmytych wyszukiwania w ogóle jest tutaj . Np. Występuje hash wrażliwy na lokalizację i wyszukiwanie najbliższego sąsiada .
Odpowiedzi:
Czy zrzut ekranu lub ikona mogą zostać przekształcone (skalowane, obracane, pochylone ...)? Na mojej głowie jest kilka metod, które mogą ci pomóc:
Większość z nich jest już zaimplementowana w OpenCV - patrz na przykład metoda cvMatchTemplate (wykorzystuje dopasowanie histogramu): http://dasl.mem.drexel.edu/~noahKuntz/openCVTut6.html . Dostępne są również detektory punktu zerowego / obszaru - patrz Wykrywanie funkcji OpenCV .
źródło
Ostatnio spotykam się z tymi samymi problemami, aby rozwiązać ten problem (prosty i szybki algorytm do porównania dwóch obrazów) raz na zawsze, wnoszę moduł img_hash do opencv_contrib, szczegóły można znaleźć w tym linku .
Moduł img_hash zapewnia sześć algorytmów mieszania obrazu, dość łatwych w użyciu.
Przykład kodów
pochodzenie Lena
rozmycie Lena
zmień rozmiar lena
shift lena
W takim przypadku ColorMomentHash daje nam najlepszy wynik
Plusy i minusy każdego algorytmu
Wydajność img_hash też jest dobra
Porównanie prędkości z biblioteką PHash (100 zdjęć z ukbench)
Jeśli chcesz poznać zalecane progi dla tych algorytmów, sprawdź ten post ( http://qtandopencv.blogspot.my/2016/06/introduction-to-image-hash-module-of.html ). Jeśli interesuje Cię sposób pomiaru wydajności modułów img_hash (obejmują szybkość i różne ataki), sprawdź ten link ( http://qtandopencv.blogspot.my/2016/06/speed-up-image-hashing-of -opencvimghash.html ).
źródło
Czy zrzut ekranu zawiera tylko ikonę? Jeśli tak, odległość L2 dwóch obrazów może być wystarczająca. Jeśli odległość L2 nie działa, następnym krokiem jest wypróbowanie czegoś prostego i dobrze ustalonego, na przykład: Lucas-Kanade . Jestem pewien, że jest dostępny w OpenCV.
źródło
Jeśli chcesz uzyskać indeks podobieństwa dwóch zdjęć, sugeruję na podstawie wskaźników indeks SSIM. Jest bardziej zgodny z ludzkim okiem. Oto artykuł na ten temat: Indeks podobieństwa strukturalnego
Jest także zaimplementowany w OpenCV i można go przyspieszyć za pomocą GPU: OpenCV SSIM z GPU
źródło
Jeśli możesz mieć pewność dokładnego wyrównania szablonu (ikony) do regionu testowego, wówczas każda stara suma różnic pikseli będzie działać.
Jeśli wyrównanie będzie tylko odrobinę wyłączone, możesz dolnoprzepustowo oba obrazy za pomocą cv :: GaussianBlur przed znalezieniem sumy różnic pikseli.
Jeśli jakość wyrównania jest potencjalnie słaba, zaleciłbym albo Histogram Zorientowanych Gradientów, albo jeden z wygodnych algorytmów wykrywania / deskryptora punktów kluczowych OpenCV (takich jak SIFT lub SURF ).
źródło
Jeśli chcesz dopasować identyczne obrazy - kod odległości L2
Szybki. Ale nie odporny na zmiany oświetlenia / punktu widzenia itp. Źródło
źródło
Jeśli chcesz porównać obraz pod względem podobieństwa, proponuję użyć OpenCV. W OpenCV istnieje kilka dopasowań funkcji i dopasowywania szablonów. Do dopasowania funkcji dostępne są detektory SURF, SIFT, FAST i tak dalej. Możesz użyć tego do wykrycia, opisania, a następnie dopasowania obrazu. Następnie możesz użyć określonego indeksu, aby znaleźć liczbę dopasowań między dwoma obrazami.
źródło