7. NORMALIZACJA I BINARYZACJA ADAPTATYWNA 7.1. Normalizacja lokalna Zwykłe konwolucje działają w jednakowy sposób na całym obrazie. Plugin Local Normalization przeprowadza filtrowanie Gaussa w zależności od lokalnych wartości poziomów szarości - średniej i wariancji. Jest dostępny na stronie: http://bigwww.epfl.ch/sage/soft/localnormalization/ Plugin jest bardzo przydatny przy wyrównywaniu poziomu tła, jak i przy wyrównywaniu jasności potencjanych obiektów. Rys. 7.1 Przykład zastosowania pluginu Local Normalization - oryginalny obraz na górze po lewej, wyrównany na dole, obok profil pokazujący poziomy szarości wzdłuż linii selekcji. Podobny efekt można uzyskać przy pomocy Banpass Filter - rys. 6.7.
Rys. 7.2. Przykład zastosowania pluginu Local Normalization - barwienie na DAPI. Efekt działania pluginu - wyrównanie jasności zabarwionych jąder komórkowych 7.2. BINARYZACJA ADAPTATYWNA W sytuacji gdy obraz jest nierównomiernie oświetlony zwykłe procedury binaryzacji mogą nie dawać zadowalających rezultatów. Jeśli nie uda się poprawić obrazu przy pomocy np. Subtrack background (menu: Process), to można zastosować tzw. binaryzację adaptacyjną (Adaptative Thresholding), w której podstawą procesu są lokalne różnice poziomów szarości. Składa się ona z kilku etapów: - najpierw obraz oryginalny jest wygładzany przy pomocy filtru uśredniającego lub Gaussa; - następnie odejmuje się przefiltrowany obraz od oryginalnego i kontrastuje - przeprowadza się binaryzację na obrazie powstałym w wyniku odejmowania. Algorytmy binaryzacji adaptatywnej opierają się na lokalnych różnicach w poziomach szarości, czyli można je zaliczyć do przekształceń kontekstowych. ImageJ oferuje obecnie całą paletę algorytmów takiej binaryzacji, obok algorytmów z rozwijanej listy w Image Adjust Threshold mamy jeszcze opcje Auto Threshold i Auto Local Threshold. Wybór odpowiedniego algorytmu zależy od charakteru obrazu i najprościej go ustalić eksperymentalnie. Auto Threshold i Auto Local Threshold pozwalają na jednoczesne wypróbowanie wszystkich dostępnych w menu algorytmów (opcja Try all). Opcje lokalnej binaryzacji to plugin, opracowany przez Gabriela Landiniego, włączony do głównego programu. Obecne wersja lokalnego oferuje 9 różnych algorytmów. W każdym z nich ustawia się promień obszaru, w
obrębie którego liczony jest próg binaryzacji. Poszczególne algorytmy różnią się sposobem obliczania tego progu. Np. w algorytmie Bernsena ustawiamy dwa parametry. Radius pozwala na określenie wielkości sąsiedztwa, parametr 1 ustawia lokalny kontrast (contrast threshold, default = 15). Parametr 2 jest ignorowany. Jeśli różnica między maksymalnym a minimalnym poziomem szarości w otoczeniu jest niższa niż zakres ustalony w parametrze 1 to piksel zostaje zaliczony do obiektu, jeśli wyższa to do tła. Szczegółowy opis poszczególnych algorymów binaryzacji można znaleźć na stronach: http://gamera.sourceforge.net/doc/html/binarization.html#niblack-threshold http://fiji.sc/wiki/index.php/auto_local_threshold Algorytm Parametr 1 Parametr 2 Bernsen 15 - Contrast - - Mean 0 - Median 0 - MidGrey 0 - Niblack 0.2 dla jasnych obiektów, 0-0.2 dla ciemnych Otsu - - Phansalkar 0.25 0.5 Sauvola 0.5 128 Tab.1 Wartości domyślne parametrów poszczególnych algorytmów - wpisanie wartości innej niż 0 zmienia te wartości. Posługiwanie się algorytmami lokalnej binaryzacji jest dość trudne, ze względu na bardzo dużą liczbę dostępnych opcji (9 algorytmów, różne promienie lokalnego otoczenia, jeden lub dwa parametry do modyfikacji. Najlepszym rozwiązaniem w takiej sytuacji jest ułożenie makra, które pozwoli na szybkie sprawdzenie różnych kombinacji ustawień.
Przykładowe makro, sprawdzające działanie algorytmu Bernsena przy ustawieniu promienia w zakresie od 5 do 50 (z ostępem co 5 pikseli), i parametru 1 w zakresie od 0 do 90. macro "Bernsen [F1]" { setforegroundcolor(0, 0, 0); run("copy"); for (i=0;i<10;i++) { r=5+i*5; for (j=0; j<10; j++) { p1=j*10; run("add Slice"); run ("Paste"); run("auto Local Threshold", "method=bernsen radius=r parameter_1=p1 parameter_2=0 "); drawstring("radius:"+r,10,20, "white"); drawstring("parametr1:"+p1,10,40, "white"); Rys. 7.3 Efektem pracy makra jest stos 101 obrazów (oryginał i 100 obrazów zbinaryzowanych przy różnych ustawieniach. W lewym górnym roku jest wyświetlona informacja o ustawieniach algorytmu (efekt działania polecenie DrawString). Więcej na temat makr w części 13.
Opis makra: słowo kluczowe macro informuje program, że wszystko co mieści się między klamrami { to sekwencja poleceń tworzących makro, opcja "nazwa [F1]" przypisuje makro klawiszowi F1 Funkcja: setforegroundcolor(0, 0, 0); definiuje kolor tekstu na obrazie (przy takim ustawieniu będzie to barwa czarna). Funkcja: run("copy"); tworzy kopię obrazu i przechowuje ją w schowku programu. Funkcja : for (i=0;i<10;i++) { uruchamia pierwszą (zewnętrzną) pętlę. Litera i to licznik pętli, w tym przypadku i będzie się zmieniało w zakresie od 0 do 9, opcja i++ każe wykonać polecenie zawarte w pętli dla kolejnych wartości i. Pierwsze polecenie w tej pętli to: r=5+i*5; Funkcja wylicza wartość r (r od radius czyli promień). W pierwszej iteracji będzie to: r = 5 + 0 * 5 = 5. Drugie polecenie uruchamia kolejną (wewnątrzną) pętlę: for (j=0; j<10; j++) { Pierwsze polecene w tej pętli wylicza wartość p1 p1=j*10; Następne polecenia: run("add Slice"); run ("Paste"); dodają nową warstwę (skrawek optyczny) i kopiują do niej zawartość oryginalnego obrazu. Obraz staje się stosem z dwóch obrazów. Kolejne polecenie przeprowadza lokalną binaryzację na dodanym skrawku, metodą Bernsena, przy promieniu r (w pierwszej iteracji = 5) i pierwszym parametrze p1 (w pierwszej iteracji = 0). Drugi parametr w tym algorytmie pozostaje cały czas bez zmian. run("auto Local Threshold", "method=bernsen radius=r
parameter_1=p1 parameter_2=0 "); Pierwsze polecienia drawstring drukuje na obrazie słowo "radius" i wartość r. Napis zaczyna się w punkcie o współrzędnych x=10, y=20, tło pod napisem jest białe. Drugie polecenie drukuje informacje o parametrze1. drawstring("radius:"+r,10,20, "white"); drawstring("parametr1:"+p1,10,40, "white"); Druga pętla powtarza się dla wartości licznika od 0 do 9 - czyli przeprowadza binaryzację obrazu przy promieniu 5 i wartościach parametru1 od 0 do 90. Po wykonaniu wszystkich obliczeń wewnętrzna pętla kończy swoją działalność, zewnętrzna pętla wylicza nową wartość promienia (w drugiej iteracji r = 10) i cała procedura powtarza się od nowa. Przedstawione makro może być, po modyfikacjach, wykorzystane także do sprawdzenia innych algorytmów. W przypadku algorytmów w których modyfikuje się dwa parametry makro musi zawierac potrójnie zagnieżdżoną pętlę.