Differences between revisions 1 and 16 (spanning 15 versions)
Revision 1 as of 2008-07-07 13:47:25
Size: 614
Editor: RonnyPetrik
Comment:
Revision 16 as of 2008-07-10 12:06:26
Size: 7669
Comment:
Deletions are marked like this. Additions are marked like this.
Line 6: Line 6:
  Verwendung von Filtern und Clusterbasiertemerkmalsanalyse++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++; als Ergebnis die Zuordnung von
Klasse zu Bildkoordinate
  Verwendung von Filtern und Clusterbasierte Merkmalsanalyse
  Ergebnis: die Zuordnung von Klassen zu Bildkoordinaten (x,y)


=== Dienstag ===
Wir haben ein Programm geschrieben, um über ein großes Bild einen Box-Filter laufen zu lassen, der Mittelwert und Standardabweichungen in einem 2-dimensionalen Array zurückgibt.

{{{#!python
def mean_std_box(I,w):
    """ Mittelwert über wxw Pixel"""
    Y,X=I.shape # Einlesen der Bilddimension
    M=zeros((Y/w,X/w,2),float)
    a=range(0,Y/w,1)
    b=range(0,X/w,1)
    for y in a:
        for x in b:
            box=I[y*w:y*w+w-1,x*w:x*w+w-1]
            M[y,x,0]=mean(box.flatten())
            M[y,x,1]=std(box.flatten())
    return M
}}}

Weiter haben wir uns damit beschäftigt, das Originalbild mit dem "read_asar_imp" einzulesen und in db-Darstellung auszugeben.

{{{#!python
# Einlesen des Originalbildes
file='/pf/u/u242027/SAR_raw/ASA_IMP_1PNDPA20060617_043346_000000162048_00362_22460_2136.N1'
I=read_asar_imp(file)

# Darstellung des ASAR-Bildes in db (image1.png)
w=8 # Größe der "Unterboxen"
A=mean_std_box(I,w)

figure(2)
imshow(10*log10(A[:,:,0]),vmin=-20,vmax=0,interpolation='nearest',origin='lower')
}}}

{{attachment:image1.png}}

Probleme hatten wir bei der Reduzierung des Speckles. Es wurde daher beschlossen diesen Schritt am Mittwoch zunächst in der ganzen Gruppe zu besprechen und dann durchzuführen.

=== Mittwoch ===
Wir haben eine Klassifizierung nur über den Mittelwert durchgeführt. Dazu haben wir das Bild in db umgerechnet und uns ein Histogramm erzeugt, bei dem jedoch keine Klassen zu unterscheiden waren. Auch eine Filterung mit dem Lee-Filter und dem Programm smooth hat am Histogramm nicht so viel verändert.

Daher haben wir aus dem gemittelten Bild homogene Bereiche ausgewählt und diese in einem Histogramm geplottet. Insgesamt haben wir fünf Klassen unterschieden, wobei die fünfte Klasse (magenta) äußerst selten vorkam, aber einen sehr hohen Rückstreukoeffizienten hatte.

{{{#!python
def db_hist(I,b,r):
    """Input: I ist das Intensitätsbild, b ist die Anzahl der bins, r ist die Limitierung der x-Achse"""
    A_db=nan_to_num(10*log10(I))
    h=histogram(A_db,bins=b,range=r,normed=True)
    return h[0],h[1] # h[0]: y-Achse des Histogramms, h[1]: x-Achse des Histogramms

# Definition der homogenen Bereiche
A_db=10*log10(A[:,:,0])
A1=A[295:394,929:997,0]
A2=A[198:225,168:197,0]
A3=A[863:949,382:464,0]
A4=A[846:851,623:629,0]
Aice=A[763:771,326:329,0] # vermutlich Eisberge

b=50
r=[-20,5]

y1,x1=db_hist(A1,b,r)
y2,x2=db_hist(A2,b,r)
y3,x3=db_hist(A3,b,r)
y4,x4=db_hist(A4,b,r)
yice,xice=db_hist(Aice,b,r)

# Histogramm
figure(7)
plot(x1,y1,'g',x2,y2,'b',x3,y3,'y',x4,y4,'r',xice,yice,'m')
}}}

{{attachment:image2b.png}}

Die Schwellwerte haben wir aus dem Histogramm abgelesen.

{{{#!python
# Klassifikation

# Schwellwerte
s0=-17.3
s1=-12.4
s2=-7.88
s3=-1.73

A_class=A_db.copy()
A_class[A_db<s0]=0
A_class[A_db>s0]=1
A_class[A_db>s1]=2
A_class[A_db>s2]=3
A_class[A_db>s3]=4

figure(11)
imshow(A_class,cm.gist_rainbow,interpolation='nearest',origin='lower')
colorbar()
show()
}}}

{{attachment:image3b.png}}

Die Klassifikation ist noch nicht perfekt.

=== Donnerstag ===

Wir haben die Klassifikation noch etwas optimiert, sodass die wichtigsten Strukturen auf dem klassifizierten Bild erkennbar sind. Wir haben außerdem noch ein Bild erstellt, das zusätzlich einen "smooth"-Filter durchlaufen hat.


Dies ist der Programmtext der vorläufig endgültigen Version.

{{{#!python
from scipy import *
from pylab import *
from read_asar import *
import scipy.stats
import os.path
import scipy.ndimage as ndi


def mean_std_box(I,w):
    """ Mittelwert über wxw Pixel"""
    Y,X=I.shape # Einlesen der Bilddimension
    M=zeros((Y/w,X/w,2),float)
    a=range(0,Y/w,1)
    b=range(0,X/w,1)
    for y in a:
        for x in b:
            box=I[y*w:y*w+w-1,x*w:x*w+w-1]
            M[y,x,0]=mean(box.flatten())
            M[y,x,1]=std(box.flatten())
    return M

def smooth(I,N):
    """Box average filter"""
    kernel=ones((N,N),float32)/(N**2)
    return ndi.convolve(I, kernel)

def db_hist(I,b,r):
    A_db=nan_to_num(10*log10(I))
    h=histogram(A_db,bins=b,range=r,normed=True)
    return h[0],h[1]

#*******************************************************
# Einlesen des Originalbildes

filename='/pf/u/u241110/project/asar_box_1090x1051x2.dat'
if not(os.path.exists(filename)):
    file='/pf/u/u242027/SAR_raw/ASA_IMP_1PNDPA20060617_043346_000000162048_00362_22460_2136.N1'
    I=read_asar_imp(file)
    w=8 # Größe der "Unterboxen"
    A=mean_std_box(I,w)
    A.tofile(filename)
else:
    A=reshape(fromfile(filename),(1090,1051,2))

#*********************************************************
# Darstellung des ASAR-Bildes in db (image1.png)

figure(1)
imshow(10*log10(A[:,:,0]),vmin=-20,vmax=0,interpolation='nearest',origin='lower')
gray()
colorbar()
title('ASAR-Bild in db')

#**********************************************************
# Histogramm

#Festlegung der homogenen Flächen
A_db=10*log10(A[:,:,0])
A1=A[365:380,976:994,0]
A2=A[198:225,168:197,0]
A3=A[830:860,55:80,0]
A4=A[291:298,877:894,0]
Aice=A[763:771,326:329,0]

# homogene Flächen (gefiltertes Bild)
A_sm=smooth(A[:,:,0],2)
A_db_sm=10*log10(A_sm)
A1_sm=A_sm[365:380,976:994]
A2_sm=A_sm[198:225,168:197]
A3_sm=A_sm[830:860,55:80]
A4_sm=A_sm[291:298,877:894]
Aice_sm=A_sm[763:771,326:329]

#b=bins, r=Länge der X-Achse im Histogramm
b=50
r=[-20,5]

# Erzeugung des Histogramms
y1,x1=db_hist(A1,b,r)
y2,x2=db_hist(A2,b,r)
y3,x3=db_hist(A3,b,r)
y4,x4=db_hist(A4,b,r)
yice,xice=db_hist(Aice,b,r)

y1_sm,x1_sm=db_hist(A1_sm,b,r)
y2_sm,x2_sm=db_hist(A2_sm,b,r)
y3_sm,x3_sm=db_hist(A3_sm,b,r)
y4_sm,x4_sm=db_hist(A4_sm,b,r)
yice_sm,xice_sm=db_hist(Aice_sm,b,r)

# graphische Darstellung
figure(2)
plot(x1,y1,'g',x2,y2,'b',x3,y3,'y',x4,y4,'r',xice,yice,'m')
title('Histogramm (ungefiltert)')
xlabel('Intensitaet in db')
ylabel('relative Haeufigkeit')

figure(3)
plot(x1_sm,y1_sm,'g',x2_sm,y2_sm,'b',x3_sm,y3_sm,'y',x4_sm,y4_sm,'r',xice_sm,yice_sm,'m')
title('Histogramm (gefiltert)')
xlabel('Intensitaet in db')
ylabel('relative Haeufigkeit')

#*************************************************************************
# Klassifikation

# Schwellwerte
s0=-15.1
s1=-11
s2=-7.56
s3=-1.98

A_class=A_db.copy()
A_class[A_db<s0]=0
A_class[A_db>s0]=1
A_class[A_db>s1]=2
A_class[A_db>s2]=3
A_class[A_db>s3]=4

# Schwellwerte (gefiltertes Bild)
s0=-15.2
s1=-11
s2=-7.83
s3=-3.09

A_class_sm=A_db_sm.copy()
A_class_sm[A_db_sm<s0]=0
A_class_sm[A_db_sm>s0]=1
A_class_sm[A_db_sm>s1]=2
A_class_sm[A_db_sm>s2]=3
A_class_sm[A_db_sm>s3]=4

# graphische Darstellung
figure(4)
imshow(A_class,cm.gist_rainbow,interpolation='nearest',origin='lower')
colorbar()
title('Klassifiziertes Bild (ungefiltert)')
A_class.tofile('asar_class_1090x1051.dat')

figure(5)
imshow(A_class_sm,cm.gist_rainbow,interpolation='nearest',origin='lower')
colorbar()
title('Klassifiziertes Bild (gefiltert)')
A_class_sm.tofile('asar_class_filtered_1090x1051.dat')
}}}

{{attachment:hist_klein.png}} {{attachment:asar_class.png}}
{{attachment:hist_filt_klein.png}} {{attachment:asar_class_filt.png}}

Besprechung ihrer Aufgaben ergab:

  • Einlesen als Teilaufgabe wurde von Lars geloest Gruppe arbeitet direkt mit Bildkoordinaten, welche als Arrayindex dienen

    Festlegung der Klasseneinteilung erst bei Bearbeitung der Aufgabe -> Sinnigkeitsentscheid Verwendung von Filtern und Clusterbasierte Merkmalsanalyse Ergebnis: die Zuordnung von Klassen zu Bildkoordinaten (x,y)

Dienstag

Wir haben ein Programm geschrieben, um über ein großes Bild einen Box-Filter laufen zu lassen, der Mittelwert und Standardabweichungen in einem 2-dimensionalen Array zurückgibt.

   1 def mean_std_box(I,w):
   2     """ Mittelwert über wxw Pixel"""
   3     Y,X=I.shape # Einlesen der Bilddimension
   4     M=zeros((Y/w,X/w,2),float)
   5     a=range(0,Y/w,1)
   6     b=range(0,X/w,1)
   7     for y in a:
   8         for x in b:
   9             box=I[y*w:y*w+w-1,x*w:x*w+w-1]
  10             M[y,x,0]=mean(box.flatten())
  11             M[y,x,1]=std(box.flatten())
  12     return M

Weiter haben wir uns damit beschäftigt, das Originalbild mit dem "read_asar_imp" einzulesen und in db-Darstellung auszugeben.

   1 # Einlesen des Originalbildes
   2 file='/pf/u/u242027/SAR_raw/ASA_IMP_1PNDPA20060617_043346_000000162048_00362_22460_2136.N1'
   3 I=read_asar_imp(file)
   4 
   5 # Darstellung des ASAR-Bildes in db (image1.png)
   6 w=8 # Größe der "Unterboxen"
   7 A=mean_std_box(I,w)
   8 
   9 figure(2)
  10 imshow(10*log10(A[:,:,0]),vmin=-20,vmax=0,interpolation='nearest',origin='lower')

image1.png

Probleme hatten wir bei der Reduzierung des Speckles. Es wurde daher beschlossen diesen Schritt am Mittwoch zunächst in der ganzen Gruppe zu besprechen und dann durchzuführen.

Mittwoch

Wir haben eine Klassifizierung nur über den Mittelwert durchgeführt. Dazu haben wir das Bild in db umgerechnet und uns ein Histogramm erzeugt, bei dem jedoch keine Klassen zu unterscheiden waren. Auch eine Filterung mit dem Lee-Filter und dem Programm smooth hat am Histogramm nicht so viel verändert.

Daher haben wir aus dem gemittelten Bild homogene Bereiche ausgewählt und diese in einem Histogramm geplottet. Insgesamt haben wir fünf Klassen unterschieden, wobei die fünfte Klasse (magenta) äußerst selten vorkam, aber einen sehr hohen Rückstreukoeffizienten hatte.

   1 def db_hist(I,b,r):
   2     """Input: I ist das Intensitätsbild, b ist die Anzahl der bins, r ist die Limitierung der x-Achse"""
   3     A_db=nan_to_num(10*log10(I))
   4     h=histogram(A_db,bins=b,range=r,normed=True)
   5     return h[0],h[1] # h[0]: y-Achse des Histogramms, h[1]: x-Achse des Histogramms
   6 
   7 # Definition der homogenen Bereiche
   8 A_db=10*log10(A[:,:,0])
   9 A1=A[295:394,929:997,0]
  10 A2=A[198:225,168:197,0]
  11 A3=A[863:949,382:464,0]
  12 A4=A[846:851,623:629,0]
  13 Aice=A[763:771,326:329,0] # vermutlich Eisberge
  14 
  15 b=50
  16 r=[-20,5]
  17 
  18 y1,x1=db_hist(A1,b,r)
  19 y2,x2=db_hist(A2,b,r)
  20 y3,x3=db_hist(A3,b,r)
  21 y4,x4=db_hist(A4,b,r)
  22 yice,xice=db_hist(Aice,b,r)
  23 
  24 # Histogramm
  25 figure(7)
  26 plot(x1,y1,'g',x2,y2,'b',x3,y3,'y',x4,y4,'r',xice,yice,'m')

image2b.png

Die Schwellwerte haben wir aus dem Histogramm abgelesen.

   1 # Klassifikation
   2 
   3 # Schwellwerte
   4 s0=-17.3
   5 s1=-12.4
   6 s2=-7.88
   7 s3=-1.73
   8 
   9 A_class=A_db.copy()
  10 A_class[A_db<s0]=0
  11 A_class[A_db>s0]=1
  12 A_class[A_db>s1]=2
  13 A_class[A_db>s2]=3
  14 A_class[A_db>s3]=4
  15 
  16 figure(11)
  17 imshow(A_class,cm.gist_rainbow,interpolation='nearest',origin='lower')
  18 colorbar()
  19 show()

image3b.png

Die Klassifikation ist noch nicht perfekt.

Donnerstag

Wir haben die Klassifikation noch etwas optimiert, sodass die wichtigsten Strukturen auf dem klassifizierten Bild erkennbar sind. Wir haben außerdem noch ein Bild erstellt, das zusätzlich einen "smooth"-Filter durchlaufen hat.

Dies ist der Programmtext der vorläufig endgültigen Version.

   1 from scipy import *
   2 from pylab import *
   3 from read_asar import *
   4 import scipy.stats
   5 import os.path
   6 import scipy.ndimage as ndi
   7 
   8 
   9 def mean_std_box(I,w):
  10     """ Mittelwert über wxw Pixel"""
  11     Y,X=I.shape # Einlesen der Bilddimension
  12     M=zeros((Y/w,X/w,2),float)
  13     a=range(0,Y/w,1)
  14     b=range(0,X/w,1)
  15     for y in a:
  16         for x in b:
  17             box=I[y*w:y*w+w-1,x*w:x*w+w-1]
  18             M[y,x,0]=mean(box.flatten())
  19             M[y,x,1]=std(box.flatten())
  20     return M
  21 
  22 def smooth(I,N):
  23     """Box average filter"""
  24     kernel=ones((N,N),float32)/(N**2)
  25     return ndi.convolve(I, kernel)
  26 
  27 def db_hist(I,b,r):
  28     A_db=nan_to_num(10*log10(I))
  29     h=histogram(A_db,bins=b,range=r,normed=True)
  30     return h[0],h[1]
  31 
  32 #*******************************************************
  33 # Einlesen des Originalbildes
  34 
  35 filename='/pf/u/u241110/project/asar_box_1090x1051x2.dat'
  36 if not(os.path.exists(filename)):
  37     file='/pf/u/u242027/SAR_raw/ASA_IMP_1PNDPA20060617_043346_000000162048_00362_22460_2136.N1'
  38     I=read_asar_imp(file)
  39     w=8 # Größe der "Unterboxen"
  40     A=mean_std_box(I,w)
  41     A.tofile(filename)
  42 else:
  43     A=reshape(fromfile(filename),(1090,1051,2))
  44 
  45 #*********************************************************
  46 # Darstellung des ASAR-Bildes in db (image1.png)
  47 
  48 figure(1)
  49 imshow(10*log10(A[:,:,0]),vmin=-20,vmax=0,interpolation='nearest',origin='lower')
  50 gray()
  51 colorbar()
  52 title('ASAR-Bild in db')
  53 
  54 #**********************************************************
  55 # Histogramm
  56 
  57 #Festlegung der homogenen Flächen
  58 A_db=10*log10(A[:,:,0])
  59 A1=A[365:380,976:994,0]
  60 A2=A[198:225,168:197,0]
  61 A3=A[830:860,55:80,0]
  62 A4=A[291:298,877:894,0]
  63 Aice=A[763:771,326:329,0]
  64 
  65 # homogene Flächen (gefiltertes Bild)
  66 A_sm=smooth(A[:,:,0],2)
  67 A_db_sm=10*log10(A_sm)
  68 A1_sm=A_sm[365:380,976:994]
  69 A2_sm=A_sm[198:225,168:197]
  70 A3_sm=A_sm[830:860,55:80]
  71 A4_sm=A_sm[291:298,877:894]
  72 Aice_sm=A_sm[763:771,326:329]
  73 
  74 #b=bins, r=Länge der X-Achse im Histogramm
  75 b=50
  76 r=[-20,5]
  77 
  78 # Erzeugung des Histogramms
  79 y1,x1=db_hist(A1,b,r)
  80 y2,x2=db_hist(A2,b,r)
  81 y3,x3=db_hist(A3,b,r)
  82 y4,x4=db_hist(A4,b,r)
  83 yice,xice=db_hist(Aice,b,r)
  84 
  85 y1_sm,x1_sm=db_hist(A1_sm,b,r)
  86 y2_sm,x2_sm=db_hist(A2_sm,b,r)
  87 y3_sm,x3_sm=db_hist(A3_sm,b,r)
  88 y4_sm,x4_sm=db_hist(A4_sm,b,r)
  89 yice_sm,xice_sm=db_hist(Aice_sm,b,r)
  90 
  91 # graphische Darstellung
  92 figure(2)
  93 plot(x1,y1,'g',x2,y2,'b',x3,y3,'y',x4,y4,'r',xice,yice,'m')
  94 title('Histogramm (ungefiltert)')
  95 xlabel('Intensitaet in db')
  96 ylabel('relative Haeufigkeit')
  97 
  98 figure(3)
  99 plot(x1_sm,y1_sm,'g',x2_sm,y2_sm,'b',x3_sm,y3_sm,'y',x4_sm,y4_sm,'r',xice_sm,yice_sm,'m')
 100 title('Histogramm (gefiltert)')
 101 xlabel('Intensitaet in db')
 102 ylabel('relative Haeufigkeit')
 103 
 104 #*************************************************************************
 105 # Klassifikation
 106 
 107 # Schwellwerte
 108 s0=-15.1
 109 s1=-11
 110 s2=-7.56
 111 s3=-1.98
 112 
 113 A_class=A_db.copy()
 114 A_class[A_db<s0]=0
 115 A_class[A_db>s0]=1
 116 A_class[A_db>s1]=2
 117 A_class[A_db>s2]=3
 118 A_class[A_db>s3]=4
 119 
 120 # Schwellwerte (gefiltertes Bild)
 121 s0=-15.2
 122 s1=-11
 123 s2=-7.83
 124 s3=-3.09
 125 
 126 A_class_sm=A_db_sm.copy()
 127 A_class_sm[A_db_sm<s0]=0
 128 A_class_sm[A_db_sm>s0]=1
 129 A_class_sm[A_db_sm>s1]=2
 130 A_class_sm[A_db_sm>s2]=3
 131 A_class_sm[A_db_sm>s3]=4
 132 
 133 # graphische Darstellung
 134 figure(4)
 135 imshow(A_class,cm.gist_rainbow,interpolation='nearest',origin='lower')
 136 colorbar()
 137 title('Klassifiziertes Bild (ungefiltert)')
 138 A_class.tofile('asar_class_1090x1051.dat')
 139 
 140 figure(5)
 141 imshow(A_class_sm,cm.gist_rainbow,interpolation='nearest',origin='lower')
 142 colorbar()
 143 title('Klassifiziertes Bild (gefiltert)')
 144 A_class_sm.tofile('asar_class_filtered_1090x1051.dat')

hist_klein.png asar_class.png hist_filt_klein.png asar_class_filt.png

LehreWiki: \AG2_ASAR_Klassifikation (last edited 2008-07-11 12:19:23 by GregorHalfmann)