2011-09-15 16 views
22

Szukam najszybszego dostępnego algorytmu do transformacji odległości.Najszybszy dostępny algorytm transformacji odległości

Zgodnie z tą witryną http://homepages.inf.ed.ac.uk/rbf/HIPR2/distance.htm, opisuje ona: "Przekształcenie odległości można obliczyć o wiele bardziej efektywnie za pomocą sprytnych algorytmów w tylko dwóch przejściach (np. Rosenfeld i Pfaltz 1968)."

Poszukując, znalazłem: "Rosenfeld, A i Pfaltz, J L. 1968. Funkcje odległości w obrazach cyfrowych Rozpoznawanie wzorów, 1, 33-61."

Ale sądzę, że powinniśmy mieć lepszy i szybszy algorytm niż ten z 1968 roku? W rzeczywistości nie mogłem znaleźć źródła od 1968 roku, więc każda pomoc jest wysoko ceniona.

Odpowiedz

10

Biblioteka OpenCV używa w przybliżeniu funkcji cv::distanceTransform algorytmu, który przekazuje obraz z góry z lewej na prawą i z powrotem. Algorytm opisany jest w artykule "Transformacje odległości w obrazach cyfrowych" z Gunilla Borgefors (Comput .. Vision Graph, Image Process, 34 3, str. 344-371, 1986).

Algorytm oblicza odległość poprzez kombinację podstawowych skoków (poziomego, pionowego, ukośnego i rycerskiego). Każdy skok wiąże się z kosztami. Poniższa tabela pokazuje koszty różnych skoków.

+------+------+------+------+------+ 
| 2.8 |2.1969| 2 |2.1969| 2.8 | 
+------+------+------+------+------+ 
|2.1969| 1.4 | 1 | 1.4 |2.1969| 
+------+------+------+------+------+ 
| 2 | 1 | 0 | 1 | 2 | 
+------+------+------+------+------+ 
|2.1969| 1.4 | 1 | 1.4 |2.1969| 
+------+------+------+------+------+ 
| 2.8 |2.1969| 2 |2.1969| 2.8 | 
+------+------+------+------+------+ 

Odległość od jednego piksela do drugiego jest sumą kosztów niezbędnych skoków. Poniższy obrazek pokazuje odległość od komórek 0 do każdej innej komórki. Strzałki pokazują drogę do niektórych komórek. Kolorowe cyfry odzwierciedlają dokładną odległość (euklidesową).

enter image description here

Algorytm działa tak: Po maska ​​

+------+------+------+ 
| 0 | 1 | 2 | 
+------+------+------+ 
| 1 | 1.4 |2.1969| 
+------+------+------+ 
| 2 |2.1969| 2.8 | 
+------+------+------+ 

został przeniesiony z lewej górnej części obrazu do prawej dolnej. Podczas tego przejścia komórki leżące wewnątrz granic maski zachowują swoją wartość (jeśli są znane i mniejsze) lub uzyskują wartość obliczoną przez zsumowanie wartości maski i wartości komórki (jeśli jest znana) z komórki poniżej komórki-maski. Następnie wykonywane jest drugie przejście od prawego dolnego rogu do lewego górnego rogu (z odwróconą maską pionową i poziomą). Po drugim przejściu obliczane są odległości.

+0

Metoda ta jest znacznie wolniejsza od nowoczesnych technik (najbardziej godna uwagi jest ta pochodząca od A. Meijstera). –

12

W pracy znana dokładna odległość przekształcić algorytmów:

"2D odległość euklidesowa przekształcić algorytmów: analiza porównawcza"
http://liu.diva-portal.org/smash/get/diva2:23335/FULLTEXT01

Najszybszy dokładną odległość przekształcenia wynosi od Meijster:

" Ogólny algorytm obliczania odległości zmienia się w czasie liniowym. "
http://fab.cba.mit.edu/classes/S62.12/docs/Meijster_distance.pdf

Konstrukcja algorytmu jest szczególnie dobrze dostosowana do obliczeń równoległych.

ten realizowany jest w moim otwartej biblioteki źródłowej, która próbuje naśladować Photoshopa „styl warstwy:”

https://github.com/vinniefalco/LayerEffects

3

Felzenszwalb i Huttenlocher zaprezentować eleganckie algorytm, który jest dokładny i O (N) w swoim artykule " Transformacje odległości samplowanych funkcji "dostępne here. Wykorzystują fakt, że kwadrat transformacji odległości euklidesowej jest parabolą, którą można oceniać niezależnie w każdym wymiarze.

Kod źródłowy to także available.

1

Wprowadziłem metodę O (N) Meijstera cytowaną w odpowiedzi Vinniego. "Ogólny algorytm obliczania odległości przekształca w czasie liniowym." http://fab.cba.mit.edu/classes/S62.12/docs/Meijster_distance.pdf

Przyjemnie jest, że może być zrównoleglony bardzo wydajnie, niezależnie obliczając każdą linię pikselową (jest to metoda oddzielna). Działając na 12 rdzeniach procesora, pole odległości obrazu o objętości 1000^3 oblicza się w ciągu kilku sekund.

Rozwiązanie Felzenszwalb i Huttenlochera "Odległe transformacje samplowanych funkcji" z 2012 roku (cytowane w odpowiedzi bw1024) oparte jest dokładnie na tym samym pomyśle. Co ciekawe, nie cytują pracy Meijstera wykonanej 12 lat wcześniej.

Powiązane problemy