Chciałbym porównać zrzut ekranu jednej aplikacji (może to być strona internetowa) z wcześniej wykonanym zrzutem ekranu, aby określić, czy aplikacja wyświetla się poprawnie. Nie chcę dokładnego porównania dopasowania, ponieważ aspekt może być nieco inny (w przypadku aplikacji internetowej, w zależności od przeglądarki, jakiś element może znajdować się w nieco innym miejscu). Powinien pokazać, jak podobne są zrzuty ekranu.
Czy istnieje biblioteka / narzędzie, które już to robi? Jak byś to zaimplementował?
algorithm
language-agnostic
image
image-processing
Antoine Aubry
źródło
źródło
Odpowiedzi:
Zależy to całkowicie od tego, jak inteligentny ma być algorytm.
Na przykład, oto kilka problemów:
Najłatwiejszym i najprostszym algorytmem , jaki widziałem, jest po prostu wykonanie następujących kroków dla każdego obrazu:
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.
źródło
„Klasyczny” sposób pomiaru polega na rozbiciu obrazu na pewną kanoniczną liczbę sekcji (powiedzmy na siatce 10x10), a następnie obliczeniu histogramu wartości RGB wewnątrz każdej komórki i porównaniu odpowiednich histogramów. Ten typ algorytmu jest preferowany zarówno ze względu na jego prostotę, jak i niezmienność skalowania i (małych!) Tłumaczeń.
źródło
Użyj histogramu znormalizowanych kolorów. (Przeczytaj sekcję dotyczącą aplikacji tutaj ), są one powszechnie używane w systemach wyszukiwania / dopasowywania obrazów i są standardowym sposobem dopasowywania obrazów, który jest bardzo niezawodny, stosunkowo szybki i bardzo łatwy do wdrożenia.
Zasadniczo histogram kolorów uchwyci rozkład kolorów obrazu. Można to następnie porównać z innym obrazem, aby sprawdzić, czy rozkłady kolorów są zgodne.
Ten typ dopasowania jest dość odporny na skalowanie (po znormalizowaniu histogramu), rotację / przesuwanie / ruch itp.
Unikaj porównań piksel po pikselu, ponieważ jeśli obraz jest nieznacznie obrócony / przesunięty, może to prowadzić do zgłaszania dużej różnicy.
Histogramy byłyby łatwe do samodzielnego wygenerowania (zakładając, że możesz uzyskać dostęp do wartości pikseli), ale jeśli nie masz na to ochoty, biblioteka OpenCV jest świetnym źródłem do robienia tego rodzaju rzeczy. Oto prezentacja PowerPoint, która pokazuje, jak utworzyć histogram przy użyciu OpenCV.
źródło
Czy algorytmy kodowania wideo, takie jak MPEG, nie obliczają różnicy między każdą klatką wideo, aby mogły po prostu zakodować deltę? Możesz przyjrzeć się, jak algorytmy kodowania wideo obliczają te różnice w klatkach.
Spójrz na tę aplikację do wyszukiwania obrazów typu open source http://www.semanticmetadata.net/lire/ . Opisuje kilka algorytmów podobieństwa obrazu, z których trzy pochodzą ze standardu MPEG-7: ScalableColor, ColorLayout, EdgeHistogram i Auto Color Correlogram.
źródło
Możesz użyć czysto matematycznego podejścia
O(n^2)
, ale będzie to przydatne tylko wtedy, gdy masz pewność, że nie ma przesunięcia lub czegoś podobnego. (Chociaż jeśli masz kilka obiektów o jednorodnym zabarwieniu, nadal będzie działać całkiem dobrze).W każdym razie chodzi o obliczenie znormalizowanego iloczynu skalarnego dwóch macierzy.
C = sum(Pij*Qij)^2/(sum(Pij^2)*sum(Qij^2))
.Ta formuła jest właściwie „cosinusem” kąta między macierzami (wierd). Im większe podobieństwo (powiedzmy
Pij=Qij
), C będziei,j Qij = 1
równe 1, a jeśli są zupełnie różne, powiedzmy dla każdego (unikając dzielenia przez zero)Pij = 255
, to dla rozmiarunxn
, im większen
będzie, tym bliżej zera będziemy otrzymać. (W przybliżeniu:)C=1/n^2
.źródło
Będziesz potrzebować do tego rozpoznawania wzorców . Aby określić małe różnice między dwoma obrazami, siatki Hopfielda działają dość dobrze i są dość łatwe do wdrożenia. Nie znam jednak żadnych dostępnych wdrożeń.
źródło
Rozwiązanie rubinowe można znaleźć tutaj
Z pliku readme:
Phashion to opakowanie Ruby wokół biblioteki pHash, „percepcyjny hash”, który wykrywa zduplikowane i prawie zduplikowane pliki multimedialne
źródło
Sposób mierzenia podobieństwa między dwoma obrazami zależy całkowicie od tego, co chcesz zmierzyć, na przykład: kontrastu, jasności, modalności, szumu ... a następnie wybierz najbardziej odpowiednią miarę podobieństwa. Możesz wybierać spośród MAD (średnia różnica bezwzględna), MSD (średnia kwadratowa różnica), które są dobre do pomiaru jasności ... dostępna jest również CR (współczynnik korelacji), który jest dobry w reprezentowaniu korelacji między dwoma obrazami. Można również wybrać miary podobieństwa oparte na histogramie, takie jak SDH (odchylenie standardowe histogramu obrazu różnicowego) lub miary podobieństwa multimodalności, takie jak MI (informacje wzajemne) lub NMI (znormalizowane informacje wzajemne).
Ponieważ te miary podobieństwa kosztują dużo czasu, zaleca się przeskalowanie obrazów w dół przed zastosowaniem na nich tych miar.
źródło
Zastanawiam się (i tak naprawdę rzucam pomysł, aby go zestrzelić), czy coś można uzyskać, odejmując jeden obraz od drugiego, a następnie skompresowując wynikowy obraz jako jpeg gif i przyjmując rozmiar pliku jako miara podobieństwa.
Gdybyś miał dwa identyczne obrazy, dostałbyś białe pudełko, które byłoby naprawdę dobrze skompresowane. Im bardziej obrazy się różniły, tym bardziej złożona byłaby reprezentacja, a tym samym mniej kompresowalna.
Prawdopodobnie nie jest to idealny test i prawdopodobnie znacznie wolniejszy niż to konieczne, ale może działać jako szybka i brudna implementacja.
źródło
Możesz spojrzeć na kod narzędzia open source findimagedupes , chociaż wygląda na to, że został napisany w perlu, więc nie mogę powiedzieć, jak łatwo będzie go przeanalizować ...
Czytając stronę findimagedupes, która mi się podobała, widzę, że istnieje implementacja C ++ tego samego algorytmu . Prawdopodobnie będzie to łatwiejsze do zrozumienia.
Wygląda na to, że możesz też użyć gqview .
źródło
Cóż, nie odpowiadam bezpośrednio na twoje pytanie, ale widziałem, jak to się dzieje. Firma Microsoft niedawno uruchomiła narzędzie o nazwie PhotoSynth, które robi coś bardzo podobnego do określania nakładających się obszarów w dużej liczbie obrazów (które mogą mieć różne proporcje).
Zastanawiam się, czy mają jakieś dostępne biblioteki lub fragmenty kodu na swoim blogu.
źródło
rozszerzyć na notatki Vaibhav za, Hugin jest open-source „autostitcher”, który powinien mieć pewne wyobrażenie na ten problem.
źródło
Istnieje oprogramowanie do pobierania obrazów w oparciu o zawartość, które (częściowo) robi to, czego potrzebujesz. Linki do wszystkich odnośników i wyjaśnień znajdują się na stronie projektu, a także w krótkim podręczniku (Kindle): LIRE
źródło
Możesz skorzystać z Siamese Network, aby sprawdzić, czy te dwa obrazy są podobne lub niepodobne po tym samouczku . Ten samouczek grupuje podobne obrazy, podczas gdy możesz użyć
L2
odległości do zmierzenia podobieństwa dwóch obrazów.źródło
Jeśli będziesz to robić od czasu do czasu i nie potrzebujesz automatyzacji, możesz to zrobić w edytorze obrazów obsługującym warstwy, takim jak Photoshop lub Paint Shop Pro (prawdopodobnie również GIMP lub Paint.Net, ale ja ' nie jestem tego pewien). Otwórz oba zrzuty ekranu i umieść jeden na drugim jako warstwę. Zmień tryb mieszania warstw na Różnica, a wszystko, co między nimi jest takie samo, stanie się czarne. Możesz przesunąć górną warstwę, aby zminimalizować wszelkie różnice w wyrównaniu.
źródło
Beyond Compare oferuje porównywanie piksel po pikselu dla obrazów, np.
źródło
Cóż, naprawdę podstawowa metoda mogłaby przejść przez każdy kolor piksela i porównać go z odpowiednim kolorem piksela na drugim obrazie - ale to prawdopodobnie bardzo powolne rozwiązanie.
źródło