Analiza obrazu

Kacper Topolnicki (2007)

Wykrywanie krawędzi.

Parametry  wykrywania krawędzi (k1) oraz parametry wyświetlania  (pot1  , pot2):

k1 = 50;
pot1 = 3;
pot2 = 3;

g=;

Do obiektu  d zapisana jest macierz bitmapy grafiki g , jest to macierz wektorów z których każdy ma trzy składowe okreslające nasycenie kolorów (RGB):

d=g[[1,1]]

Do obiektu pier zapisywany jest tabela tworzona następująco: sprawdzane są kolejne elementy macierzowe d, następnie liczony jest kwadrat różnicy  nasycenia pomiędzy najbliższymi sąsiadami sprawdzanego elementu macierzowego i tym elementem. Różnica liczona jest dla tylko jednego koloru. Spodziewamy sie, że dla krawędzi ta różnica będzie duża.

pier = Table[N[((((((d[[i,j,1]]-d[[i,j-1,1]]))^2)+(((d[[i,j,1]]-d[[i,j+1,1]]))^2)+(((d[[i,j,1]]-d[[i+1,j,1]]))^2)+(((d[[i,j,1]]-d[[i-1,j,1]]))^2)+(((d[[i,j,1]]-d[[i+1,j+1,1]]))^2)+(((d[[i,j,1]]-d[[i-1,j-1,1]]))^2)+(((d[[i,j,1]]-d[[i+1,j-1,1]]))^2)+(((d[[i,j,1]]-d[[i-1,j+1,1]]))^2)))^(1/2)) ],{i,2,Dimensions[d][[1]]-1},{j,2,Dimensions[d][[2]]-1}];

maa = Max[pier];

Tworzenie grafiki typu raster.

pp = Graphics[Raster[(((1-(pier/maa)))^pot1)],AspectRatio->Automatic]

Obiekt dru tworzony jest podobnie jak obiekt pier tylko z zastosowaniem do macierzy pier.

dru = Table[N[((((((pier[[i,j]]-pier[[i,j-1]]))^2)+(((pier[[i,j]]-pier[[i,j+1]]))^2)+(((pier[[i,j]]-pier[[i+1,j]]))^2)+(((pier[[i,j]]-pier[[i-1,j]]))^2)+(((pier[[i,j]]-pier[[i+1,j+1]]))^2)+(((pier[[i,j]]-pier[[i-1,j-1]]))^2)+(((pier[[i,j]]-pier[[i+1,j-1]]))^2)+(((pier[[i,j]]-pier[[i-1,j+1]]))^2)))^(1/2)) ],{i,2,Dimensions[pier][[1]]-1},{j,2,Dimensions[pier][[2]]-1}];

naj = Max[dru];

Tworzenie grafiki typu raster.

dp = Graphics[Raster[(((1-(dru/naj)))^pot2)],AspectRatio->Automatic]

Wykresy pozwalające odczytac próg dyskryminacji.

ListPlot[Sort[Flatten[pier]]]

ListPlot[Sort[Flatten[dru]]]

Tabela w której dyskryminowane są te wartości które sa mniejsze od zadanej wcześniej wartości k1.

tab1 = Table[ If[pier[[i,j]]>k1,0,1],{i,1,Dimensions[pier][[1]]},{j,1,Dimensions[pier][[2]]}];

Tabela w której dyskryminowane są te piksele które nie są większe od sąsiadów na przekątnej. Dla najbliższych sąsiadów mamy 4 przekątne, sprawdzane jest również czy wartośc piksela jest wieksza od progu k1.

tab3 = Table[If[(( (pier[[i,j]]>pier[[i,j-1]])&&(pier[[i,j]]>pier[[i,j+1]]))||(  (pier[[i,j]]>pier[[i-1,j]])&&(pier[[i,j]]>pier[[i+1,j]]) )||((pier[[i,j]]>pier[[i-1,j -1]])&&(pier[[i,j]]>pier[[i+1,j+1]]) )||((pier[[i,j]]>pier[[i+1,j-1]])&&(pier[[i,j]]>pier[[i-1,j+1]]) ))&&(pier[[i,j]]>k1),(((1-(pier[[i,j]]/maa)))^pot1),1],{i,2,Dimensions[pier][[1]] - 1},{j,2,Dimensions[pier][[2]] - 1}];

Tworzenie grafiki typu raster:

ppdys1=Graphics[Raster[tab1],AspectRatio->Automatic]

dpdys2=Graphics[Raster[tab3],AspectRatio->Automatic]

Wyświetlanie grafiki:

Show[GraphicsGrid[{{g,pp,dp},{g,ppdys1,dpdys2}}]]

Pierwsza kolumna obrazów  to obrazy  wyjściowe, w następnej kolumnie znajdują się rastry tabeli pier i tab3, tab 3 powstała poprzez dyskryminowanie pewnych wartości tabeli pier. Widać że program wykrył poprawnie krawędzie. Następna kolumna zawiera rastry tabeli dru i tab3. Obraz u góry to poprostu wykrywanie krawędzi na obrazie wykrywającym krawędzie. Pod spodem znajduje się pbraz dyskryminujacy pewne wartości w tabeli pier poprzez zastosowanie odpowiedniego algorytmu.

Eliminowanie szumów : filtr gausa.

strona z opisem;

Strona WWW zawiera dosyć szczegółowy opis metody eliminującej szumy która została zastosowana do obrazu poniżej.

g=;

d=g[[1,1]];

maska := {{1,4,7,4,1},{4,16,26,16,4},{7,26,41,26,7},{4,16,26,16,4},{1,4,7,4,1}};

maska//TraditionalForm

maskasum :=Sum[ maska[[i,j]],{i,1,Dimensions[maska][[1]]},{j,1,Dimensions[maska][[2]]} ]

pix[f_,g_] := Sum[ maska[[k,l]]* d[[f +k-1,g +l-1,1]],{k,1,Dimensions[maska][[1]]},{l,1,Dimensions[maska][[2]]} ]/maskasum//N

pix[10,10]

nowy =Table[pix[i,j], {i,1,Dimensions[d][[1]]-Dimensions[maska][[1]]},{j,1,Dimensions[d][[2]]-Dimensions[maska][[2]]}];

Max[nowy]

w = Graphics[Raster[nowy/Max[nowy]]]

Show[w]