Wykład 14 - Operatory morfologiczne

Grafika w Mathematice - import grafik do wykładu

Poniżej import obrazka z podaną ścieżką:

lenna=Import["c:/Users/wrzask/Desktop/PO/lenna.jpg"]
datalenna=Import["c:/Users/wrzask/Desktop/PO/lenna.jpg","Data"];
Dimensions[datalenna]

morf1=Import["c:/Users/wrzask/Desktop/PO/morf1.png"]
datamorf1=Import["c:/Users/wrzask/Desktop/PO/morf1.png","Data"];
pixelmorf1=datamorf1[[All,All,1]];
morf2=Import["c:/Users/wrzask/Desktop/PO/morf2.jpg"]
datamorf2=Import["c:/Users/wrzask/Desktop/PO/morf2.jpg","Data"];
pixelmorf2=datamorf2[[All,All,1]];
morf3=Import["c:/Users/wrzask/Desktop/PO/morf3.jpg"]
datamorf3=Import["c:/Users/wrzask/Desktop/PO/morf3.jpg","Data"];
Dimensions[datamorf3]

Operacje morfologiczne

Operacje morfologiczne pozwalają przeprowadzić analizę kształtów poszczególnych obiektów oraz odległości między nimi. Podstawowe przekształcenia morfologiczne można ze sobą łączyć, co daje podstawę do budowania skomplikowanych systemów analizy obrazu.

Element strukturalny

Właściwości filtrów morfologicznych określane są przez tzw. element strukturalny B. Określony jest względem wybranego piksela, tzw. punktu centralnego lub początkowego. Element strukturalny B może przybrać dowolny kształt i wielkość, zawierać dowolną kombinację wartości 0 i 1, zaś jego punkt centralny może być w dowolnym miejscu. 

Najczęściej stosowanymi elementami strukturalnymi są kwadrat o boku 2N+1 (zazwyczaj 3x3) i wartości 1 dla wszystkich pikseli, a także dyski

Poniżej przykładowe elementy strukturalne (tu czarne to 1, białe 0)

structureElement1={{0,1,0},{1,1,1},{0,1,0}};
structureElement2={{1,0,1},{0,1,0},{1,0,1}};
structureElement3=Table[If[(x-4)^2+(y-4)^2<= 3^2,1.0,0.0],{x,1,7},{y,1,7}];
structureElement4=BoxMatrix[2];
structureElement5=DiskMatrix[3];
{ArrayPlot[structureElement1,Mesh->True],ArrayPlot[structureElement2,Mesh->True],ArrayPlot[structureElement3,Mesh->True],ArrayPlot[structureElement4,Mesh->True],ArrayPlot[structureElement5,Mesh->True]}

Główne kroki algorytmów morfologicznych:

✔    Element strukturalny jest przemieszczany po całym obrazie tak, by analizowany piksel był punktem centralnym elementu strukturalnego.
✔    Dla każdego takiego punktu następuje porównanie zgodności jego otoczenia z wzorcem elementu strukturalnego.
✔    W przypadku zgodności (najczęściej), następuje wykonanie operacji na badanym punkcie - zazwyczaj zmiana przypisanej mu wartości.

Operacje morfologiczne nie modyfikują całego obrazu, lecz tą jego część, której otoczenie odpowiada wzorcowi elementu strukturalnego.

Dylatacja

Dylatacja, czyli rozszerzanie, jest zastosowaniem sumy Minkowskiego do obrazu:

Przy czym  to po prostu translacja. 
✔  Powiększa elementy obrazu
✔  Wypełnia przestrzenie (dziury) w niespójnym obszarze, znikają detale

Operacja ta przykłada obrócony element strukturalny do każdego piksela na obrazie. Jeżeli choć jeden piksel z sąsiedztwa objętego przez B ma wartość równość jeden, punkt centralny również otrzymuje wartość jeden. W przeciwnym wypadku przypisywane jest mu zero.

Istotny wpływ na wynik dylatacji ma wybór elementu strukturalnego. Przy niestandardowym kształcie rozrost obiektu jest kierunkowy. Z kolei jeżeli punkt centralny nie leży w środku elementu, rozrost jest niesymetryczny. Najbardziej neutralny efekt daje wykorzystanie elementu zbliżonego kształtem do koła. Często, aby uzyskać pożądany efekt stosuje się dylatacje wielokrotną.

Poniżej testowy “obraz”

testImage={
{0,0,0,0,0,0,0,0},
{0,0,0,0,1,0,1,0},
{0,1,1,1,1,0,0,0},
{0,1,1,1,1,0,0,0},
{0,1,1,1,1,0,0,0},
{0,0,1,0,0,1,1,0},
{0,0,0,0,0,1,1,0},
{0,0,0,0,0,0,0,0}};
ArrayPlot[testImage,Mesh->True]

Poniżej dylatacja przy pomocy dwóch elementów strukturalnych, użyłam funkcji Mathematici Dilation[]

{ArrayPlot[Dilation[testImage,structureElement1]],ArrayPlot[Dilation[testImage,structureElement2]]}

Poniżej przesunięcia wzgledem elementu strukturalnego structureElement1

{ArrayPlot[RotateRight[testImage,{1,1}]],ArrayPlot[RotateRight[testImage,{-1,1}]],ArrayPlot[RotateRight[testImage,{1,-1}]],ArrayPlot[RotateRight[testImage,{-1,-1}]]}

oraz ich suma

{ArrayPlot[testImage+RotateRight[testImage,{1,0}]+RotateRight[testImage,{-1,0}]+RotateRight[testImage,{0,-1}]+RotateRight[testImage,{0,1}]],ArrayPlot[Dilation[testImage,structureElement1]]}

Poniżej pokazałam sumę dla elementu strukturalnego structureElement2

{ArrayPlot[testImage+RotateRight[testImage,{1,1}]+RotateRight[testImage,{-1,1}]+RotateRight[testImage,{1,-1}]+RotateRight[testImage,{-1,-1}]],ArrayPlot[Dilation[testImage,structureElement2]]}

Erozja

pomniejsza elementy przestrzeni
usuwa zanieczyszczenia
Również na erozję istotny wpływ ma wybór elementu strukturalnego. Konsekwencją erozji jest zmniejszenie obiektu, zniknięcie wąskich gałęzi i małych obiektów, likwidacja szumu, rozszerzenie się „dziur" w niespójnym obszarze - przyjmują one kształt elementu strukturalnego.

{ArrayPlot[Erosion[testImage,structureElement1]],ArrayPlot[Erosion[testImage,structureElement2]]}

{ArrayPlot[{{0,0,0,0,0,0,0,0},
{0,0,0,0,1,0,1,0},
{0,1,Red,1,1,0,0,0},
{0,Red,Red,Red,1,0,0,0},
{0,1,Red,1,1,0,0,0},
{0,0,1,0,0,1,1,0},
{0,0,0,0,0,1,1,0},
{0,0,0,0,0,0,0,0}},Mesh->True],
ArrayPlot[{
{0,0,0,0,0,0,0,0},
{0,0,0,0,1,0,1,0},
{0,1,1,1,1,0,0,0},
{0,1,Red,1,1,0,0,0},
{0,Red,Red,Red,1,0,0,0},
{0,0,Red,0,0,1,1,0},
{0,0,0,0,0,1,1,0},
{0,0,0,0,0,0,0,0}},Mesh->True],
ArrayPlot[{
{0,0,0,0,0,0,0,0},
{0,0,0,0,1,0,1,0},
{0,1,1,Red,1,0,0,0},
{0,1,Red,Red,Red,0,0,0},
{0,1,1,Red,1,0,0,0},
{0,0,1,0,0,1,1,0},
{0,0,0,0,0,1,1,0},
{0,0,0,0,0,0,0,0}},Mesh->True]}

External Boundary - kontur zewnętrzny

testImage2=DiskMatrix[3,{9,9}];
{ArrayPlot[testImage2],
ArrayPlot[Dilation[testImage2,structureElement1]-testImage2]}

Morphological gradient - gradient morfologiczny

{ArrayPlot[testImage2],
ArrayPlot[Dilation[testImage2,structureElement1]-Erosion[testImage2,structureElement1]]}

Internal boundary - kontur wewnetrzny

{ArrayPlot[testImage2],
ArrayPlot[testImage2-Erosion[testImage2,structureElement1]]}

Operacje morfologiczne na obrazach

Wyznaczanie konturów

Poniżej wyznaczanie konturów wewnętrznych i przy pomocy gradientu morfologicznego przy pomocy elementu strukturalnego dysku o dwóch różnych promieniach

{morf2,Image[ImageData[morf2]-ImageData[Erosion[morf2,DiskMatrix[3]]],ColorSpace->"RGB"],
Image[ImageData[Dilation[morf2,DiskMatrix[3]]]-ImageData[Erosion[morf2,DiskMatrix[3]]],ColorSpace->"RGB"]
}

{morf2,Image[ImageData[morf2]-ImageData[Erosion[morf2,DiskMatrix[5]]],ColorSpace->"RGB"],
Image[ImageData[Dilation[morf2,DiskMatrix[5]]]-ImageData[Erosion[morf2,DiskMatrix[5]]],ColorSpace->"RGB"]
}

Poniżej wyznaczanie konturów wewnętrznych i przy pomocy gradientu morfologicznego przy pomocy elementu strukturalnego dysku i structureElement2 zdefiniowanego powyżej w wykładzie

GraphicsRow[{morf3,Image[ImageData[morf3]-ImageData[Erosion[morf3,DiskMatrix[3]]],ColorSpace->"RGB"],
Image[ImageData[Dilation[morf3,DiskMatrix[3]]]-ImageData[Erosion[morf3,DiskMatrix[3]]],ColorSpace->"RGB"]
}]

GraphicsRow[{morf3,Image[ImageData[morf3]-ImageData[Erosion[morf3,structureElement2]],ColorSpace->"RGB"],
Image[ImageData[Dilation[morf3,structureElement2]]-ImageData[Erosion[morf3,structureElement2]],ColorSpace->"RGB"]
}]

Morfologiczne operacje zamknięcia i otwarcia

Otwarcie

Krok 1 Wykonujemy erozję na A przy pomocy elementu strukturalnego B - wszystkie elementy mniejsze od elementu strukturalnego zostają wyeliminowane pozostałe pomniejszone
Krok 2 Wykonujemy dylatację przy pomocy tego samego elementu strukturalnego - powiększenie pozostałych elementów

{morf1,Erosion[morf1,DiskMatrix[3]],Dilation[Erosion[morf1,DiskMatrix[3]],DiskMatrix[3]],Opening[morf1,DiskMatrix[3]]
}

Zamkniecie

Krok 1 Wykonujemy dylatację na A przy pomocy elementu strukturalnego B - powiększenie elementów
Krok 2 Wykonujemy erozję przy pomocy tego samego elementu strukturalnego - pomniejszenie

{morf1,Dilation[morf1,DiskMatrix[3]],Erosion[Dilation[morf1,DiskMatrix[3]],DiskMatrix[3]],Closing[morf1,DiskMatrix[3]]
}

GraphicsRow[{morf4=ImageEffect[morf3,{"SaltPepperNoise",0.15}],Closing[morf4,DiskMatrix[1]],Opening[Closing[morf4,DiskMatrix[1]],DiskMatrix[1]]}]

Na koniec efekty “malarskie”:

{lenna,Opening[lenna,DiskMatrix[5]],Closing[lenna,DiskMatrix[8]],Opening[Closing[lenna,DiskMatrix[10]],DiskMatrix[8]]
}

Pytania na kolokwium

1. Proszę podać definicję operacji morfologicznych dylatacji i erozji - w jaki sposób operacje te działają na elementy obrazu? - pp
2. Proszę podać definicję operacji morfologicznych otwarcia i zamknięcia - w jaki sposób operacje te działają obraz? - pr 
3. W jaki sposób przy pomocy operacji morfologicznych możemy zrealizować wykrywanie konturów przy pomocy operacji morfologicznych? - pp

Ćwiczenia na laboratorium

Ćwiczenie 15 - 4p.
Należy
1. Zaimportować dowolny obraz na którym będziemy wykrywali kontury
2. Zastosować operacje morfologiczne wykrywania konturów dla 5 różnych elementów strukturalnych
3. Jakie elementy strukturalne najlepiej pasuja do wykrywania konturów wybranej grafiki?

Możliwe projekty

W jaki sposób operacje morfologiczne mogą zostać wykorzystane do obrazowania USG w medycynie?

Można stworzyć malarskie efekty np. impresjonistyczne.

Przy pomocy operacji morfologicznych odszumić obraz. Należy także po usunieciu niepożądanego szumu odtworzyc obraz.