Poszukiwanie lokalnych maksimów na tablicy 2D

0

Witam,

Otóż napotkałem w mojej pracy na dość ciekawy problem znajdowania lokalnych maksimów na tablicy 2D. Ogólnie chodzi o to, że mam takową tablicę będącą digitalizacją odczytu z detektora powierzchniowego dla promieniowania X. W tablicy (dowolnej prostokątnej, niekoniecznie kwadratowej) znajdują się po prostu liczby naturalne. Tam gdzie padło promieniowanie znajduje się pik, czasami silny, czasami słaby. Pytanie zatem jak znaleźć pozycje tych pików na takiej tablicy? Myślałem, że mógłbym rozpatrywać np. kwadratową maskę (np. 3 x 3), która poruszałaby się po tablicy i zapisywała sumę jej elementów w drugiej tablicy co by było takim jakby wygładzaniem, ale nie rozwiązuje mi to problemu znajdowania maksimów... Szum zasadniczo może być pominięty jako, że maksima poniżej jakiejś granicy mogą być po prostu ignorowane.

Z góry dziękuję za pomoc w stworzeniu algorytmu. Szukałem w Internecie i literaturze, ale niestety nie doszedłem do niczego dla mnie w pełni zrozumiałego...

Pozdrawiam,

Radek

0

Liczysz dyskretne pochodne cząstkowe. Tam gdzie są najbliższe zera to ekstrema. Sprawdzasz, czy takie ekstremum to min, czy maks i już.


Opolski Portal Programistyczny
http://programowanie.opole.pl
http://protechnologia.pl

1

zakładam, że dane są nieujemne, ciekawym bardzo co będzie po czymś takim

int t[m+2][n+2];
//zera na marginesach mogą byc wygodne

łubudu(){
	for(int y=1;y<=m;y++)
		for(int x=1;x<=n;x++) 
			if(t[y][x]){ int r;
				r=t[y][x]-t[y][x+1];
				if(r>0) {
					t[y][x+1] = 0;
					r=t[y][x]-t[y+1][x]
					if(r>0) t[y+1][x]=0;
					else if (r<0)  // [y][x] lokalny max
						t[y][x]=0;
					x++; 
				} else if(r<0) /
					t[y][x]=0;
			} 
}
0

Całkiem przyjemne rozwiązanie. Martwi mnie jednak sytuacja, gdy po szerokości jest płasko, a po wysokości jest wzniesienie. Z tego co widze, to nie zauważy tego.


Opolski Portal Programistyczny
http://programowanie.opole.pl
http://protechnologia.pl

0

Dzięki wielkie za kod. Możecie mi tylko wyjaśnić co robi np. int itp. rzeczy w tym kodzie? Podobnie nie potrafię odczytać co oznaczają te rzeczy w nawiasach kwadratowych np. t[x] i tak daleji. Jeśli dobrze widzę to przypomina mi to troszkę C, o którym niestety nie mam pojęcia... Niestety umiem dobrze programować tylko w Fortranie... Z góry wielkie dzięki:)

Odczyt z detektora jest zasadniczo wszędzie dodatni i maksima są dość lokalne i ostre, nie są rozciągnięte zbytnio więc pewnie by działało:) Muszę to sobie tylko przetworzyć na mój język, hehe:)

0

Przetworzyłeś już na swój język? Jeśli nie to postaram się pomóc -> na Fortranie się niestety nie znam więc opiszę słownie:

int t[m+2][n+2]; - zadeklarowanie tablicy o rozmiarze m+2 na n+2 (gdzie m i n to pewnie wysokość i szerokość) - wnioskując po komentarzu, powinna ona wyglądać tak:

0 0 0 0 0 0
0 D A N E 0
0 D A N E 0
0 D A N E 0
0 0 0 0 0 0

Gdzie DANE to faktyczne dane (oryginalna tablica)

for(int y=1;y<=m;y++) - pętla for, y przyjmuje wartości 1 do m
for(int x=1;x<=n;x++) - tak jak powyżej, dla x od 1 do n
if(t[y][x]) - jeśli element tablicy o współrzędnych [y] i [x] nie jest równy zero...
r=t[y][x]-t[y][x+1]; - r = el.o.wsp. y x - el.o.wsp y x+1
x++ - to samo co x = x + 1.
poza tym chyba wszystko jest w miarę jasne.

1 użytkowników online, w tym zalogowanych: 0, gości: 1