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
Odpowiedz
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.
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
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
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 ...
To jest eleganckie, ale niestety oblicza medianę każdego niepokrywającego się 3x3, a nie medianę wszystkich możliwych 3x3. –
Spróbuj tego: Rolling median in C - Turlach implementation
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ż :)
dzięki Alex, jeszcze tego nie próbowałem, ale wygląda obiecująco. – bla
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
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
większość ram kodu jest już w python, małe części są w matlab, najlepiej jak zaimplementować tę część kodu w pythonie. – bla