Dopasowanie i przejrzystość szablonów OpenCV

Jak OpenCV radzi sobie z przezroczystością obrazu podczas dopasowywania szablonów?

Problem polega na tym, że obraz szablonu musi mieć przezroczyste części, ponieważ w oryginalnym obrazie może być cokolwiek w tych miejscach.

Wypróbowałem wszystkie metody i żadna z nich nie przyniosła pozytywnych rezultatów (np. pozycja szablonu w oryginalnym obrazku nie została poprawnie wykryta).

Edit: OK, widzę, że trzeba podać przykłady.

Oryginał obraz

Obraz szablonu

Jak widzisz, prawie niemożliwe jest dopasowanie takiego szablonu do takiego obrazu. "Tło" wokół obiektu może mieć dowolny kolor (jak ten, lub biały, brązowy...)

Sobel on grayscaled image & template + cvconvertscaleabs

Dodatkowy oryginalny obraz

Edit 2: rozwiązanie Mishy działa nawet z niewielką ilością przeszkód wokół ("przezroczystość" działa). Przykład:

Szablon dopasowany do Twoich potrzeb

Edycja 3 - wiele wystąpień:

Zrobiłem szybkie i brudne rozwiązanie znalezienia wielu wystąpień szablonu, jednak gdy szablon nie zostanie znaleziony, dostaję "dużo" fałszywych alarmów. Głównie z powodu mojej realizacji:

  • iteracja danych obrazu
  • if (imageData[y, x, 0] >= maxValue * 0.95 f) then it counts [x,y] as a match (maxValue pochodzi z cvMinMaxLoc)

It Działa dla obrazów, gdy jest co najmniej jedno dopasowanie pozytywne, jednak powoduje okropną sytuację dla obrazów, na których nie ma takiego szablonu.

Author: mnn, 2011-01-21

7 answers

Wygląda na to, że OpenCV nie radzi sobie z alfą tak, jak tego chcesz.

Masz dwie opcje:

  1. Napisz własną metodę korelacji krzyżowej, która użyje kanału alfa
  2. Przekształć swoje obrazy, aby Twój kanał alfa stał się nieistotny

Ponieważ pierwsza opcja jest prosta, zbadam drugą opcję tutaj. Zamierzam ponownie użyć przykładowego kodu, który podałem podobne pytanie wcześniej. Jeśli zastosujesz korelację krzyżową bezpośrednio do obrazów tło zakłóca dopasowanie szablonu (w szczególności jasne części tła). Jeśli bawisz się kanałami kolorów, przekonasz się, że dopasowanie w niebieskim kanale daje prawidłowy wynik. Zależy to od zawartości obrazu i nie jest spójnym sposobem rozwiązania problemu.

Inną opcją jest wykonanie detekcji krawędzi (np. Sobel) na obrazie i szablonie, a następnie wykonanie korelacji krzyżowej. Oto obrazy wykryte przez krawędź (I wykorzystałem Detektor krawędzi Sobel na kanale Luma w GIMP, a następnie rozciąganie intensywności).

mapka

budynek

Jak widać, kanał alfa tutaj stał się nieistotny, ponieważ większość terenu ma zerową intensywność i nie przyczyni się do obliczeń korelacji krzyżowej. Więc teraz korelacja krzyżowa może być zastosowana bezpośrednio, dając pożądany rezultat:

misha@misha-desktop:~/Desktop/stackoverflow$ python cross-correlation.py map-blue.png building-maskz-blue.png 
(163, 244)

Na koniec, oto kolejne powiązane pytanie.

PS. Co to jest gra to?

 16
Author: mpenkov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:15

Mam nieco bardziej obumarłe rozwiązanie tego problemu, które wydaje się działać w miarę dobrze: zastąpić kanał alfa szablonu obrazem szumem, co mniej więcej sprawia, że przezroczyste regiony statystycznie nieistotne podczas procesu dopasowywania.

Na przykład mój przypadek użycia polegał na wyszukiwaniu znaków emoji w zrzutach ekranu z iOS. Tło klawiatury iOS zmienia kolory w zależności od kontekstu, co sprawia, że proces dopasowania jest problematyczny, jeśli Zatwierdź konkretny kolor tła w obrazie szablonu.

Oto surowy obraz szablonu na Alfie:
surowy obraz szablonu na Alfie

Oto przetworzony szablon z szumem wypełniającym kanał alfa:
Tutaj wpisz opis obrazka

Przesłałem przetworzony obraz szablonu za pomocą szablonu dopasowanego do przykładowego kodu podanego w dokumentacji OpenCV. Na ciemnym lub jasnym tle, dopasowanie jest Znalezione z rozsądną pewnością siebie.

Searching on dark tła:

dopasowane na ciemnym

Wyszukiwanie na jasnym tle:

dopasowane na światło

Dla porównania, pozostawienie przeźroczystego kanału alfa szablonu - lub oddanie ciemnego lub jasnego tła-nie zwróciło akceptowalnych dopasowań.

 9
Author: kitschpatrol,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-09 00:31:09

OpenCV 3.0 oferuje natywne wsparcie dla dopasowania szablonów z maskowanymi szablonami. Zobacz Nowa dokumentacja :

Parametry:

Obraz ...

Templ ...

Wynik ...

Metoda ...

Maska Maska wyszukiwanego szablonu. Musi mieć ten sam typ danych i rozmiar z templ. Nie jest ustawiony domyślnie.

[Lekka Dygresja]

Zwróć uwagę, że szablon pasujący do maskowanego obrazy referencyjne (większy obraz) nie są jednak możliwe. I to ma sens, biorąc pod uwagę, że OpenCV wykorzystuje dopasowanie szablonów oparte na FFT.

Dlatego, jeśli chcesz dopasować szablon tylko w określonych regionach obrazów referencyjnych, musisz zaimplementować własną metodę lub zamaskować wyjście CV:: matchTemplate.

Wdrożenie go od podstaw powinno zrekompensować przypadki, w których chcemy wyszukać szablon tylko w bardzo konkretnych regionach (np. narożniki).

 8
Author: Marcello Salomao,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-22 15:32:27

Opcja SQDIFF/SQDIFF_N będzie rozwiązaniem, jeśli spróbujesz zastąpić kanał alfa czarnym kolorem RGB. Przynajmniej to było moje rozwiązanie tego samego problemu. Z mojego wyniku wynika, że ta metoda jest wrażliwa na jaśniejsze wartości pikseli, i skorzystałem z okazji.

 1
Author: Marstep,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-22 20:08:07

Myślę, że próbujesz zrobić to, co w OpenCV nazywa się dopasowaniem szablonu z maską. Myślę, że możesz spróbować ustawić ROI (region of interest) na szablonie. to pytanie pokazuje jak to zrobić . (zauważ, że w tym pytaniu zwrot z inwestycji jest ustawiany na obrazie docelowym, a nie na szablonie, ale procedura jest taka sama).

 -1
Author: carlosdc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:00:34

Nie jestem pewien, ale kanał przezroczystości jest traktowany jak każdy inny kanał. Jeśli piksel w szablonie jest "przezroczysty", powinien być również" przezroczysty " na głównym obrazie. Tylko zgaduję.

 -1
Author: Utkarsh Sinha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-24 13:39:59

Natknąłem się na ten sam problem i wymyśliłem rozwiązanie. Ponieważ referenceImageMask i templateMask mają 1s w dobrych pikselach i 0s w złych. I że referenceImage i templateImage zostały już zamaskowane i mają 0s w złych pikselach, jak również.

Wtedy, pierwszy wynik dopasowania szablonu Da nie znormalizowaną korelację krzyżową między obrazami. Jednak kilka pikseli było zero.

Drugi szablon dopasowania Da dla każdego możliwe przesunięcie liczby pikseli, które jednocześnie różniły się od zera (zdemaskowane) w obu obrazach.

Następnie normalizacja korelacji przez tę liczbę powinna dać wartość, którą chciałeś (i ja). Przeciętny produkt dla Pikseli, które nie są zamaskowane w obu obrazach.

Image<Gray, float> imCorr = referenceImage.MatchTemplate(templateImage,      Emgu.CV.CvEnum.TM_TYPE.CV_TM_CCORR);
Image<Gray, float> imCorrMask = referenceImageMask.MatchTemplate(templateMask, Emgu.CV.CvEnum.TM_TYPE.CV_TM_CCORR);
_imCorr = _imCorr.Mul(_imCorrMask.Pow(-1));

Aktualizacja: w rzeczywistości To rozwiązanie nie działa. Ponieważ implementacja korelacji krzyżowej w opencv używa DFT będą problemy numeryczne i nie można użyć drugiego crosscorrelation do poprawienia pierwszego.

 -2
Author: Jorge Otero-Millan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-22 15:44:31