Mam dwa różne obrazy:
i
o szerokości 100 pikseli lub 400 pikseli
Jak widać, oba są wyraźnie „takie same” z ludzkiego punktu widzenia. Teraz chcę programowo wykryć, że są takie same. Używam magii obrazu za pomocą rubinowego klejnotu o nazwie rmagick
tak:
img1 = Magick::Image.from_blob(File.read("image_1.jpeg")).first
img2 = Magick::Image.from_blob(File.read("image_2.jpeg")).first
if img1.difference(img2).first < 4000.0 # I have found this to be a good threshold, but does not work for cropped images
puts "they are the same!!!"
end
Chociaż działa to dobrze w przypadku obrazów o tym samym współczynniku / kadrowaniu, nie jest idealne, gdy mają nieco inne kadrowanie i zostało zmienione do tej samej szerokości.
Czy można to zrobić w przypadku zdjęć z innym kadrowaniem? Interesuje mnie rozwiązanie, w którym mogę powiedzieć coś takiego: jeden obraz jest zawarty w drugim i obejmuje około 90% tego.
PS. Mogę uzyskać obrazy w wyższej rozdzielczości, jeśli to pomoże (np. Podwójne)
ruby
image-processing
imagemagick
rmagick
image-comparison
Niels Kristian
źródło
źródło
compare
narzędzie wiersza poleceń ImageMagick ma-subimage-search
przełącznik.Odpowiedzi:
Możesz rzucić okiem na dopasowanie funkcji. Chodzi o to, aby znaleźć funkcje na dwóch obrazach i dopasować je. Ta metoda jest powszechnie stosowana do znajdowania szablonu (powiedzmy logo) na innym obrazie. Cechę można w istocie opisać jako rzeczy, które ludzie mogą uznać za interesujące na obrazie, takie jak narożniki lub otwarte przestrzenie. Istnieje wiele rodzajów technik wykrywania cech, jednak moim zaleceniem jest użycie niezmiennej transformacji cech (SIFT) jako algorytmu wykrywania cech. SIFT jest niezmienny dla translacji obrazu, skalowania, obrotu, częściowo niezmienny dla zmian oświetlenia i odporny na lokalne zniekształcenie geometryczne. Wygląda na to, że pasuje do specyfikacji, w której obrazy mogą mieć nieco inne proporcje.
Biorąc pod uwagę dwa dostarczone obrazy, oto próba dopasowania funkcji za pomocą dopasowywania funkcji FLANN . Aby ustalić, czy dwa obrazy są takie same, możemy oprzeć je na pewnym z góry określonym progu, który śledzi liczbę dopasowań, które przejdą test współczynnika opisany w Wyróżniających cechach obrazu z Keypoints Scale-Invariant autorstwa Davida G. Lowe'a . Prostym wyjaśnieniem testu jest to, że test proporcji sprawdza, czy dopasowania są niejednoznaczne i powinny zostać usunięte, można to potraktować jako technikę usuwania wartości odstających. Możemy policzyć liczbę dopasowań, które przejdą ten test, aby ustalić, czy dwa obrazy są takie same. Oto wyniki dopasowania funkcji:
Kropki oznaczają wszystkie wykryte dopasowania, podczas gdy zielone linie oznaczają „dobre dopasowania”, które pomyślnie przeszły test stosunku. Jeśli nie użyjesz testu proporcji, wszystkie punkty zostaną narysowane. W ten sposób możesz użyć tego filtra jako progu, aby zachować tylko najlepiej dopasowane funkcje.
Zaimplementowałem to w Pythonie, nie znam się zbyt dobrze na Railsach. Mam nadzięję, że to pomogło, powodzenia!
Kod
źródło
Ponieważ ImageMagick jest bardzo starym, zaawansowanym i wielofunkcyjnym narzędziem, trudno byłoby zbudować interfejs, który obejmowałby większość funkcji. Mimo, że jest świetny, rmagick nie zbliża się do objęcia wszystkich funkcji (podobnie jak wiele prób, jakie podjął Python).
Wyobrażam sobie, że w wielu przypadkach użycia będzie wystarczająco bezpieczne i o wiele łatwiejsze po prostu wykonanie metody wiersza poleceń i odczytanie z niej. W rubinie będzie to wyglądać tak;
Omówię ważne rzeczy, a następnie omówię dodatkowe notatki.
Polecenie używa porównania magii, aby sprawdzić, czy drugi obraz (
small
) jest podobrazem pierwszego (large
). Ta funkcja nie sprawdza, czy małe jest ściśle mniejsze niż duże (zarówno wysokość, jak i szerokość). Liczba podana dla podobieństwa wynosi 0,2 (błąd 20%), a wartość podanych zdjęć wynosi około 0,15. Możesz to dostroić! Uważam, że obrazy, które są ścisłym podzbiorem, mają mniej niż 0,01.stderr
istdout
nie jest „konieczne”, ale powinieneś.źródło
Pobierz histogram obu zdjęć i porównaj je. Działałoby to bardzo dobrze w przypadku przycinania i powiększania, chyba że nastąpiła z tego powodu zbyt drastyczna zmiana.
Jest to lepsze niż obecne podejście, w którym obrazy są odejmowane bezpośrednio. Ale to podejście wciąż ma niewiele.
źródło
Zwykle dopasowanie szablonów daje dobry wynik w takich sytuacjach. Dopasowywanie szablonów to technika znajdowania obszarów obrazu, które pasują (są podobne) do obrazu szablonu (drugi obraz). Ten algorytm daje ocenę za najlepszą pozycję zmodowaną na obrazie źródłowym (drugi).
W opencv przy użyciu TM_CCOEFF_NORMED metody daje wynik od 0 do 1. Jeśli wynik wynosi 1, oznacza to, że obraz szablonu jest dokładnie częścią (Rect) obrazu źródłowego, ale jeśli masz niewielką zmianę rozjaśnienia lub perspektywy między dwa obrazki, wynik byłby niższy niż 1.
Teraz Rozważając próg oceny podobieństwa, możesz dowiedzieć się, czy są one takie same, czy nie. Ten próg można uzyskać za pomocą prób i błędów na kilku przykładowych obrazach. Próbowałem twoich zdjęć i uzyskałem wynik 0,823863 . Oto kod (opencv C ++) i wspólny obszar między dwoma obrazami, uzyskany przez dopasowanie:
źródło
Rozważ metodę find_similar_region . Użyj mniejszego z dwóch obrazów jako obrazu docelowego. Wypróbuj różne wartości atrybutów fuzz na obrazie i na obrazie docelowym.
źródło