Analiza i Przetwarzanie Obrazów Projekt: Filtr medianowy bez sortowania listy sąsiadów Paweł Jóźwik Zawartość 1 Wstęp.... 2 2 Wyniki działania.... 3 3 Wnioski.... 5
1 Wstęp. Celem projektu było napisanie algorytmu filtru medianowego nie korzystającego z sortowania jako metody znalezienia mediany tablicy sąsiadów. Najbardziej intuicyjną metodą wyznaczenia mediany jest posortowanie danej tablicy i wyznaczenie mediany jako element środkowy. Jednak algorytmy sortujące, wykorzystujące porównania, w optymistycznym przypadku ich złożoność wynosi O(n) = nlgn gdzie n jest rozmiarem tablicy. Z pomocą może przyjść algorytm Quickselect który w optymistycznym przypadku pozwala osiągnąć złożoność O(n) = n. function select(list, left, right, n) if left = right return list[left] loop pivotindex :=... // select pivotindex between left and right pivotindex := partition(list, left, right, pivotindex) if n = pivotindex return list[n] else if n < pivotindex right := pivotindex - 1 else left := pivotindex + 1 Podprocedura partition: function partition(list, left, right, pivotindex) pivotvalue := list[pivotindex] swap list[pivotindex] and list[right] // Move pivot to end storeindex := left for i from left to right-1 if list[i] < pivotvalue swap list[storeindex] and list[i] increment storeindex swap list[right] and list[storeindex] // Move pivot to its final place return storeindex Projekt został zrealizowany jako wtyczka do FIJI. Po zainstalowaniu i uruchomieniu pojawia się okno pytające o ilość iteracji w celu porównania wydajności implementacji filtru medianowego zaimplementowanego w FIJI z filtrem medianowym korzystającym z algorytmu Quickselect.
2 Wyniki działania. Algorytm przetestowano na obrazach w skali szarości zakres wartości jasności przyjmowany przez piksele nie powinien mieć wpływu na złożoność znajdowania mediany. Testy odbyły się z zastosowaniem okna 3x3 ponieważ takie jest obsługiwane przez wbudowane w ImageJ metody. W porównaniu znalazły się najlepsze czasy wykonania spośród 20 iteracji. Obraz QSelect ImageProcessor.medianFilter() blobs.gif (256x254) 2 ms 2 ms bridge.gif (512x512) 11 ms 10 ms boats.gif (720x576) 18 ms 15 ms 8kimage1_gray.gif (7680x4320) 1390 ms 1149 ms 8kimage2_gray.gif (7680x4320) 1369 ms 1020 ms 8kimage3_gray.gif (7680x4320) 1345 ms 1026 ms Obrazy 8k wykorzystane do testów: 2-1 Obraz 8kimage1_gray.gif
2-2 Obraz 8kimage2_gray.gif 2-3 Obraz 8kimage3_gray.gif
3 Wnioski. Niestety nie udało się uzyskać lepszej prędkości algorytmu niż gotowe rozwiązanie zaimplementowane w ImageJ. Jednak należy pamiętać że metoda medianfilter jest zoptymalizowana dla okien 3x3. W metodzie medianfilter mediana jest znajdowana poprzez eliminacje 4 z 9 maksimów (ustawienie wartości na 0) a następnie wyznaczenie ostatniego piątego maksima, będącego jednocześnie medianą. private final int findmedian (int[] values) { //Finds the 5th largest of 9 values for (int i = 1; i <= 4; i++) { int max = 0; int mj = 1; for (int j = 1; j <= 9; j++) if (values[j] > max) { max = values[j]; mj = j; } values[mj] = 0; } int max = 0; for (int j = 1; j <= 9; j++) if (values[j] > max) max = values[j]; return max; } 3-1 Implementacja znajdowania mediany w ImageJ dla 9 elementow 3-2 Wyniki profilera kodu dla obrazu 8kimage2_gray.gif Prawdopodobnym źródłem różnicy czasów wykonania jest niekorzystny wybór początkowego indeksu poszukiwania mediany, został on arbitralnie ustalony jako środek wejściowej tablicy ponieważ metody randomizujące (wyznaczanie początkowego indeksu w sposób pseudolosowy) algorytm okazały sie być zbyt kosztowne przy tak dużej liczbie wywołań funkcji. Jak widać na powyżej załączonym obrazie stosunek wywołań metody partition do iterativeselect wyniósł około 4.62. Interesująca jest również liczba wywołań metody swap która została uruchomiona prawie 400 tys. razy. Ciekawym aspektem byłby całkowity koszt wywołań metody swap który mógł wnieść bardzo duży wkład w końcowy czas działania algorytmu. Co prawda proponowany algorytm spisał się gorzej od gotowej implementacji jednak należy pamiętać że gotowe rozwiązanie z ImageJ jest zoptymalizowane dla sąsiedztwa 3x3 dla większych okien warto rozważyć zastosowanie algorytmu Quickselect.
4 Bibliografia https://en.wikipedia.org/wiki/quickselect