2012-03-26 13 views
5

Mam wąskie gardło w dwuwymiarowym medianie filtra (okno 3x3) Używam bardzo dużego zestawu obrazów i chciałbym go zoptymalizować. Przetestowałem scipy.ndimage median_filter, a także PIL, scipy.signal i scikits-image. Przeglądając jednak w SO, dowiedziałem się, że istnieje szybki filtr medianowy O (n) w C (Median Filtering w Constant Time patrz Rolling median algorithm in C) i zastanawiałem się, czy mogę zaimplementować go w Pythonie za pomocą scipy.weave.inline? Jakieś sugestie dotyczące alternatywnej trasy?Używanie scipy.weave.inline do szybkiego filtrowania median 2D

+2

Mam otoki Cython dla Perreault + Hebert, mediana Filtering w stałym czasie, gdzieś - ale to byłoby przesada na 3x3, lepiej zrobić sieć sortującą, 9 wejść w 25 porównaniach. Czy wejścia to 0..255 czy co? – denis

+0

Czy chcesz przetworzyć swój zestaw obrazów? Czy [OpenCV] (http://opencv.org/) jest alternatywną trasą? [medianBlure] (http://docs.opencv.org/modules/imgproc/doc/filtering.html#medianblur) może? Masz również implementacje CUDA i OpenCl. – mfrellum

+0

większość ram kodu jest już w python, małe części są w matlab, najlepiej jak zaimplementować tę część kodu w pythonie. – bla

Odpowiedz

1

Nie znam podstawowego algorytmu, ale obraz scikitów ma wartość rolling median filter.

W przeciwnym razie, polecam go napisać w Cython (język C/Python pidgin). Koniecznie sprawdź numer convolution example/tutorial pod kątem pracy z numpy tablicami.

+0

Dzięki, zajrzę do tego. Ponadto, pisząc 3x3, miałem na myśli, że średni rozmiar okna to 3x3, a rzeczywisty obraz, w którym jest używany, ma rozmiar megapikseli. – bla

+0

Wygląda na to, że sciki są wolniejsze od PIL i scipy.ndimage. Niestety, obrazy, nad którymi pracuję, są 16-bitowe, więc opcja 0..255 nie jest istotna. Dalej Cython ... – bla

1

Jeśli Reshape Twojego nadal zainteresowany będę próbować NumPy i mediana:

a= some big array 
a.reshape(N,3,3) #N being specific to your array 
[numpy.median(m) for m in a] 

ja nie wiem jak to waga w porównaniu do metod testowałem, ale jeśli chcesz, aby zoptymalizować z C można zamocować na pętla na liście zrozumieniem ...

+1

To jest eleganckie, ale niestety oblicza medianę każdego niepokrywającego się 3x3, a nie medianę wszystkich możliwych 3x3. –

2

Spróbuj tego: Rolling median in C - Turlach implementation

http://ideone.com/8VVEa

Zastosowanie:

Mediator* m = MediatorNew(9); 
for (...) 
{ 
     MediatorInsert(m, value); 
     median = MediatorMedian(m); 
} 

Wierzę, że to jest taki sam jak R algo, ale czystsze (zaskakująco więc, w rzeczywistości).

Możesz go zawinąć lub przenieść i użyć Numba (lub Cython). Myślę, że poleciłbym Numba over Cython, jeśli nic innego, ponieważ to jest zwykły stary kod Pythona.

Proponuję dodanie tego do scikits, jeśli przebiega szybciej niż w scikits już :)

+0

dzięki Alex, jeszcze tego nie próbowałem, ale wygląda obiecująco. – bla

Powiązane problemy