TI/Programowanie dla Fizyków Medycznych/Morfologia matematyczna: Różnice pomiędzy wersjami

Z Brain-wiki
Linia 6: Linia 6:
 
a[30:50,30:50]=True
 
a[30:50,30:50]=True
 
a[50:70,50:70]=True
 
a[50:70,50:70]=True
for x in range(100):
 
    for y in range(100):
 
        if (np.random.random()<0.2): a[x,y]=False
 
        if (np.random.random()>0.8): a[x,y]=True
 
 
          
 
          
 +
brush7=np.array([[0,0,1,1,1,0,0],[0,1,1,1,1,1,0],[1,1,1,1,1,1,1],[1,1,1,1,1,1,1],[1,1,1,1,1,1,1],[0,1,1,1,1,1,0],[0,0,1,1,1,0,0]],dtype=np.bool)
 +
py.imshow(a, cmap=py.cm.gray,  interpolation='nearest')
 +
py.show()
 +
</source>
  
 +
[[Plik:morfologia1.png]]
  
#brush=np.array([[0,1,1,1,0],[1,1,1,1,1],[1,1,1,1,1],[1,1,1,1,1],[0,1,1,1,0]],dtype=np.bool)
+
Przydatna będzie procedura
#brush=np.array([[0,0,1,0,0],[0,1,1,1,0],[1,1,1,1,1],[0,1,1,1,0],[0,0,1,0,0]],dtype=np.bool)
+
<source lang="python">
brush=np.ones((5,5))
 
print brush
 
 
 
 
def brush2list(brush):
 
def brush2list(brush):
 
     result=[]
 
     result=[]
Linia 26: Linia 24:
 
             if brush[x,y]: result.append((x-middle,y-middle))
 
             if brush[x,y]: result.append((x-middle,y-middle))
 
     return result
 
     return result
 +
</source>
  
def medianowy(fig,brush=np.array([[0,1,0],[1,1,1],[0,1,0]],dtype=np.bool)):
+
===Dylacja===
 +
<source lang="python">
 +
def dylacja(fig,brush=np.array([[0,1,0],[1,1,1],[0,1,0]],dtype=np.bool)):
 
     result=np.zeros(fig.shape)
 
     result=np.zeros(fig.shape)
 
     brush_list=brush2list(brush)
 
     brush_list=brush2list(brush)
 
     for x in range(3,fig.shape[0]-3):
 
     for x in range(3,fig.shape[0]-3):
 
         for y in range (3,fig.shape[1]-3):
 
         for y in range (3,fig.shape[1]-3):
             result[x,y]=np.median([fig[x+x_shift,y+y_shift] for (x_shift,y_shift) in brush_list])
+
             result[x,y]=max([fig[x+x_shift,y+y_shift] for (x_shift,y_shift) in brush_list])
 
     return result
 
     return result
  
 +
py.imshow(dylacja(a,brush7), cmap=py.cm.gray,  interpolation='nearest')
 +
py.show()
 +
</source>
  
def dylacja(fig,brush=np.array([[0,1,0],[1,1,1],[0,1,0]],dtype=np.bool)):
+
[[Plik:morfologia-dylacja.png]]
    result=np.zeros(fig.shape)
 
    brush_list=brush2list(brush)
 
    for x in range(3,fig.shape[0]-3):
 
        for y in range (3,fig.shape[1]-3):
 
            result[x,y]=max([fig[x+x_shift,y+y_shift] for (x_shift,y_shift) in brush_list])
 
    return result
 
  
 +
===Erozja===
 +
<source lang="python">
 
def erozja(fig,brush=np.array([[0,1,0],[1,1,1],[0,1,0]],dtype=np.bool)):
 
def erozja(fig,brush=np.array([[0,1,0],[1,1,1],[0,1,0]],dtype=np.bool)):
 
     result=np.zeros(fig.shape)
 
     result=np.zeros(fig.shape)
Linia 52: Linia 52:
 
     return result
 
     return result
  
 +
py.imshow(erozja(a,brush7), cmap=py.cm.gray,  interpolation='nearest')
 +
py.show()
 +
</source>
 +
 +
[[Plik:morfologia-erozja.png]]
 +
 +
===Otwarcie i zamknięcie===
 +
<source lang="python">
 
def otwarcie(fig,brush=np.array([[0,1,0],[1,1,1],[0,1,0]],dtype=np.bool)):
 
def otwarcie(fig,brush=np.array([[0,1,0],[1,1,1],[0,1,0]],dtype=np.bool)):
 
     return dylacja(erozja(fig,brush),brush)
 
     return dylacja(erozja(fig,brush),brush)
Linia 57: Linia 65:
 
def zamkniecie(fig,brush=np.array([[0,1,0],[1,1,1],[0,1,0]],dtype=np.bool)):
 
def zamkniecie(fig,brush=np.array([[0,1,0],[1,1,1],[0,1,0]],dtype=np.bool)):
 
     return erozja(dylacja(fig,brush),brush)
 
     return erozja(dylacja(fig,brush),brush)
 +
 +
py.imshow(otwarcie(a,brush7), cmap=py.cm.gray,  interpolation='nearest')
 +
py.show()
 +
py.imshow(zamkniecie(a,brush7), cmap=py.cm.gray,  interpolation='nearest')
 +
py.show()
 +
</source>
 +
 +
[[Plik:morfologia-otwarcie.png]]
 +
 +
[[Plik:morfologia-zakmniecie.png]]
 +
 +
==Filtr medianowy===
 +
<source lang="python">
 +
def medianowy(fig,brush=np.array([[0,1,0],[1,1,1],[0,1,0]],dtype=np.bool)):
 +
    result=np.zeros(fig.shape)
 +
    brush_list=brush2list(brush)
 +
    for x in range(3,fig.shape[0]-3):
 +
        for y in range (3,fig.shape[1]-3):
 +
            result[x,y]=np.median([fig[x+x_shift,y+y_shift] for (x_shift,y_shift) in brush_list])
 +
    return result
 +
</source>
 +
Służy do usuwania szumu.
 +
<source lang="python">
 +
for x,y in np.ndindex(a.shape):
 +
    if (np.random.random()<0.05): a[x,y]=False
 +
    if (np.random.random()>0.95): a[x,y]=True
  
  
py.imshow(a, cmap='Greys',  interpolation='nearest')
+
py.imshow(a, cmap=py.cm.gray,  interpolation='nearest')
 
py.show()
 
py.show()
py.imshow(medianowy(a,brush), cmap='Greys',  interpolation='nearest')
+
a=medianowy(a)
 +
py.imshow(a, cmap=py.cm.gray,  interpolation='nearest')
 
py.show()
 
py.show()
py.imshow(medianowy(medianowy(a,brush),brush), cmap='Greys',  interpolation='nearest')
+
a=medianowy(a)
 +
py.imshow(a, cmap=py.cm.gray,  interpolation='nearest')
 
py.show()
 
py.show()
py.imshow(medianowy(medianowy(medianowy(a,brush),brush),brush), cmap='Greys',  interpolation='nearest')
+
a=medianowy(a)
 +
py.imshow(a, cmap=py.cm.gray,  interpolation='nearest')
 
py.show()
 
py.show()
 
</source>
 
</source>
 +
 +
[[Plik:morfologia-zaszumiony1.png]]
 +
 +
[[Plik:morfologia-zaszumiony2.png]]
 +
 +
[[Plik:morfologia-zaszumiony3.png]]
 +
 +
[[Plik:morfologia-zaszumiony4.png]]
  
 
[["Programowanie dla Fizyków Medycznych"]]
 
[["Programowanie dla Fizyków Medycznych"]]

Wersja z 23:04, 8 cze 2015

Morfologia Matematyczna

import numpy as np
import pylab as py
a=np.zeros((100,100),dtype=np.bool)
a[30:50,30:50]=True
a[50:70,50:70]=True
        
brush7=np.array([[0,0,1,1,1,0,0],[0,1,1,1,1,1,0],[1,1,1,1,1,1,1],[1,1,1,1,1,1,1],[1,1,1,1,1,1,1],[0,1,1,1,1,1,0],[0,0,1,1,1,0,0]],dtype=np.bool)
py.imshow(a, cmap=py.cm.gray,  interpolation='nearest')
py.show()

Morfologia1.png

Przydatna będzie procedura

def brush2list(brush):
    result=[]
    N=brush.shape[0]
    middle=N/2
    for x in range(N):
        for y in range(N):
            if brush[x,y]: result.append((x-middle,y-middle))
    return result

Dylacja

def dylacja(fig,brush=np.array([[0,1,0],[1,1,1],[0,1,0]],dtype=np.bool)):
    result=np.zeros(fig.shape)
    brush_list=brush2list(brush)
    for x in range(3,fig.shape[0]-3):
        for y in range (3,fig.shape[1]-3):
            result[x,y]=max([fig[x+x_shift,y+y_shift] for (x_shift,y_shift) in brush_list])
    return result

py.imshow(dylacja(a,brush7), cmap=py.cm.gray,  interpolation='nearest')
py.show()

Morfologia-dylacja.png

Erozja

def erozja(fig,brush=np.array([[0,1,0],[1,1,1],[0,1,0]],dtype=np.bool)):
    result=np.zeros(fig.shape)
    brush_list=brush2list(brush)
    for x in range(3,fig.shape[0]-3):
        for y in range (3,fig.shape[1]-3):
            result[x,y]=min([fig[x+x_shift,y+y_shift] for (x_shift,y_shift) in brush_list])
    return result

py.imshow(erozja(a,brush7), cmap=py.cm.gray,  interpolation='nearest')
py.show()

Morfologia-erozja.png

Otwarcie i zamknięcie

def otwarcie(fig,brush=np.array([[0,1,0],[1,1,1],[0,1,0]],dtype=np.bool)):
    return dylacja(erozja(fig,brush),brush)

def zamkniecie(fig,brush=np.array([[0,1,0],[1,1,1],[0,1,0]],dtype=np.bool)):
    return erozja(dylacja(fig,brush),brush)

py.imshow(otwarcie(a,brush7), cmap=py.cm.gray,  interpolation='nearest')
py.show()
py.imshow(zamkniecie(a,brush7), cmap=py.cm.gray,  interpolation='nearest')
py.show()

Morfologia-otwarcie.png

Morfologia-zakmniecie.png

Filtr medianowy=

def medianowy(fig,brush=np.array([[0,1,0],[1,1,1],[0,1,0]],dtype=np.bool)):
    result=np.zeros(fig.shape)
    brush_list=brush2list(brush)
    for x in range(3,fig.shape[0]-3):
        for y in range (3,fig.shape[1]-3):
            result[x,y]=np.median([fig[x+x_shift,y+y_shift] for (x_shift,y_shift) in brush_list])
    return result

Służy do usuwania szumu.

for x,y in np.ndindex(a.shape):
    if (np.random.random()<0.05): a[x,y]=False
    if (np.random.random()>0.95): a[x,y]=True


py.imshow(a, cmap=py.cm.gray,  interpolation='nearest')
py.show()
a=medianowy(a)
py.imshow(a, cmap=py.cm.gray,  interpolation='nearest')
py.show()
a=medianowy(a)
py.imshow(a, cmap=py.cm.gray,  interpolation='nearest')
py.show()
a=medianowy(a)
py.imshow(a, cmap=py.cm.gray,  interpolation='nearest')
py.show()

Morfologia-zaszumiony1.png

Morfologia-zaszumiony2.png

Morfologia-zaszumiony3.png

Morfologia-zaszumiony4.png

"Programowanie dla Fizyków Medycznych"