2010-03-30 14 views
12

Jest to formuła filtrowania log: alt text http://homepages.inf.ed.ac.uk/rbf/HIPR2/eqns/eqnlog2.gifLaplace'a Gaussa pracy filtra

także w zastosowaniach z filtrowaniem LOG I widać, że funkcja jest wywoływana tylko jeden parametr: sigma (o). Chcę wypróbować filtrowanie LoG za pomocą tej formuły (poprzednia próba została przeprowadzona przez filtr gaussowski, a następnie filtr laplacki z pewnym rozmiarem okna filtru) Ale patrząc na tę formułę, nie rozumiem, jak rozmiar filtra jest połączony z tą formułą, to znaczy, że rozmiar filtra jest ustalony? Czy możesz wyjaśnić, jak z niego korzystać?

Odpowiedz

6

Jak już zapewne domyśliłeś się z innych odpowiedzi i linków, filtr LoG wykrywa krawędzie i linie na obrazie. To, czego wciąż brakuje, to wyjaśnienie, czym jest σ.

σ jest skalą filtra. Czy linia o szerokości jednego piksela to linia lub szum? Czy linia o szerokości 6 pikseli jest linią lub obiektem o dwóch różnych równoległych krawędziach? Czy gradient zmienia kolor z czarnego na biały na 6 lub 8 pikseli na krawędzi lub tylko na gradient?To jest coś, co musisz zdecydować, a wartość σ odzwierciedla twoją decyzję. Im większa σ, tym szersze są linie, gładsza krawędź i więcej szumu jest ignorowane.

Nie należy się mylić między skalą filtra (σ) a rozmiarem dyskretnego przybliżenia (zwykle zwanym szablonem). W Paul's link σ = 1,4, a rozmiar szablonu to 9. Chociaż zwykle rozsądne jest użycie rozmiaru szablonu od 4σ do 6σ, te dwie wielkości są całkiem niezależne. Większy szablon zapewnia lepsze przybliżenie filtra, ale w większości przypadków nie jest potrzebne bardzo dobre przybliżenie.

+0

Wartość sigma (σ) jest stała lub musimy ją przyjąć samodzielnie? –

1

Wygląda na ciągły filtr kołowy, którego promień to sqrt (2) * sigma. Jeśli chcesz zaimplementować to w celu przetwarzania obrazu, musisz je zindeksować.

Jest przykładem dla sigma = 1,4 tutaj: http://homepages.inf.ed.ac.uk/rbf/HIPR2/log.htm

+0

Zrobiłem zbliżenie przez różnicę gaussian, ale nie chcę używać tego przybliżenia. O jakiego rodzaju przybliżeniu mówisz? – maximus

+0

@ Maksima: Czy * przeczytałeś * stronę, z którą się łączyłem? Jest to funkcja ciągła, więc musisz ją przybliżać do dyskretnego przetwarzania obrazu. Istnieje przykładowy zestaw współczynników dla sigma = 1,4 na stronie, z którą się łączyłem i wystarczająco dużo informacji, aby wygenerować współczynniki dla dowolnej wartości sigmy, której potrzebujesz. –

+0

Dziękuję, mam cię! – maximus

5

To było coś, co mylić mnie też, i to nie było aż musiałem zrobić to samo co ty na projekt uni, że rozumiem, co pan ma to zrobić z formułą!

Możesz użyć tej formuły, aby wygenerować dyskretny filtr LoG. Jeśli napiszesz trochę kodu, aby zaimplementować tę formułę, możesz wtedy wygenerować filtr do użycia w splotach obrazu. Aby wygenerować, powiedzmy szablon 5x5, po prostu wywołaj kod z xiy od -2 do +2.

Spowoduje to wygenerowanie wartości do użycia w szablonie LoG. Jeśli wykres wartości tego produkuje powinieneś zobaczyć „Mexican Hat” kształt typowy dla tego filtra, tak jak poniżej:

LoG template http://homepages.inf.ed.ac.uk/rbf/HIPR2/figs/logcont.gif

można dostroić szablonu zmieniając jak szeroki jest (rozmiar) i wartość sigma (jak szeroki jest szczyt). Im szerszy i szerszy szablon, tym mniejszy wpływ hałasu będzie skutkować tym, że będzie działał na szerszym obszarze.

Po zastosowaniu filtra można zastosować go do obrazu, tworząc szablon z obrazem. Jeśli jeszcze tego nie zrobiłeś, sprawdź kilka tutoriali. java applet tutorialsmore mathsy.

Zasadniczo, w każdym miejscu w pikselach "umieszczasz" swój szablon splotu, wyśrodkowany na tym pikselu. Następnie mnożymy otaczające wartości pikseli przez odpowiedni "piksel" w szablonie i sumujemy wynik. Jest to wtedy nowa wartość pikseli w tej lokalizacji (zazwyczaj musisz również znormalizować (skalować) dane wyjściowe, aby przywrócić je do prawidłowego zakresu wartości).

Poniższy kod przedstawia przybliżony sposób implementacji tego. Proszę wybaczyć wszelkie błędy/literówki itp., Ponieważ nie zostało to przetestowane.

Mam nadzieję, że to pomoże.

private float LoG(float x, float y, float sigma) 
{ 
    // implement formula here 
    return (1/(Math.PI * sigma*sigma*sigma*sigma)) * //etc etc - also, can't remember the code for "to the power of" off hand 
} 

private void GenerateTemplate(int templateSize, float sigma) 
{ 
    // Make sure it's an odd number for convenience 
    if(templateSize % 2 == 1) 
    { 
     // Create the data array 
     float[][] template = new float[templateSize][templatesize]; 

     // Work out the "min and max" values. Log is centered around 0, 0 
     // so, for a size 5 template (say) we want to get the values from 
     // -2 to +2, ie: -2, -1, 0, +1, +2 and feed those into the formula. 
     int min = Math.Ceil(-templateSize/2) - 1; 
     int max = Math.Floor(templateSize/2) + 1; 

     // We also need a count to index into the data array... 
     int xCount = 0; 
     int yCount = 0; 

     for(int x = min; x <= max; ++x) 
     { 
      for(int y = min; y <= max; ++y) 
      { 
       // Get the LoG value for this (x,y) pair 
       template[xCount][yCount] = LoG(x, y, sigma); 
       ++yCount; 
      } 
      ++xCount; 
     } 
    } 
} 
+0

Dziękuję bardzo, próbuję! – maximus

+0

Jak powiedział Paul w poprzedniej odpowiedzi, wydaje się być filtrem, którego promień to sqrt (2) * sigma. Jeśli tak, to rozmiar filtra zależy tylko od wartości sigma, , wtedy wartość sigma jest potrzebna. Jednak nie jestem pewien i może to być również w porządku użycie parametrów niezależnych jako sigma i rozmiaru szablonu. – maximus

2

Tutaj, na potrzeby wizualizacji, przedstawiono prosty matlabowy trójwymiarowy wykres Laplaciana z falki Gaussa (meksykański kapelusz). Można zmienić (o) parametru sigma i zobaczyć jego wpływ na kształt wykresu:

sigmaSq = 0.5 % Square of σ parameter 
[x y] = meshgrid(linspace(-3,3), linspace(-3,3)); 
z = (-1/(pi*(sigmaSq^2))) .* (1-((x.^2+y.^2)/(2*sigmaSq))) .*exp(-(x.^2+y.^2)/(2*sigmaSq)); 
surf(x,y,z) 

Można także porównać efekty parametru sigma na Mexican Hat w następujący sposób:

t = -5:0.01:5; 
sigma = 0.5; 

mexhat05 = exp(-t.*t/(2*sigma*sigma)) * 2 .*(t.*t/(sigma*sigma) - 1)/(pi^(1/4)*sqrt(3*sigma)); 

sigma = 1; 
mexhat1 = exp(-t.*t/(2*sigma*sigma)) * 2 .*(t.*t/(sigma*sigma) - 1)/(pi^(1/4)*sqrt(3*sigma)); 

sigma = 2; 
mexhat2 = exp(-t.*t/(2*sigma*sigma)) * 2 .*(t.*t/(sigma*sigma) - 1)/(pi^(1/4)*sqrt(3*sigma)); 

plot(t, mexhat05, 'r', ... 
    t, mexhat1, 'b', ... 
    t, mexhat2, 'g'); 

Albo po prostu użyć Toolbox Wavelet dostarczone przez Matlab następująco:

lb = -5; ub = 5; n = 1000; 
[psi,x] = mexihat(lb,ub,n); 
plot(x,psi), title('Mexican hat wavelet') 

znalazłem to przydatne przy realizacji tego celu wykrywania krawędzi w wizji komputerowej. Chociaż nie jest to dokładna odpowiedź, mam nadzieję, że to pomaga.