R - Einführung in die Bildverarbeitung und Analyse (Stefan Bosse) [18.12.2024]

Einführung in die Bildverarbeitung und Bildanalyse mit R (Teil 1)

Einführung in die Bildverarbeitung und Bildanalyse mit R (Teil 1)
Vorwort
Literatur
Ziele
Synthetische Bilder
Das Histogramm
Rauschen
Kantendetektion der Poren
Clustering und Einhüllende
Ellipsenanpassung als Minimierungsproblem
Statistische Analyse

Vorwort

Bitte folgenden Code ausführen um notwendige Bibliotheken zu laden. Nicht erforderlich bei nativer R Software.


R Set-up

 ▸ 
[]
 ✗ 
 ≡ 

Es wird in diesem Kurs der R-Dialekt R+ verwendet. R+ ist eine Reimplementierung von R in JavaScript und läuft direkt in Web Browsern und node webkit Applikationsprogrammen. Es ist keine Softwareinstallation erforderlich. Keine Worker starten da das document Objekt vom Web Browser in einigen Packages für Berechnungen benötigt wird.

Literatur

Ziele

#label


Abbildung 1. Grundlegender Ablauf und Schritte der Datenverarbeitung von Bildmaterial

Synthetische Bilder


Randomisiertes Bild

 ▸ 
[]
 ✗ 
 ≡ 


Geometrisches Bild 100 × 100 Pixel als Matrix (Hintergrundwert ist hier 10)

 ▸ 
[]
 ✗ 
 ≡ 

Aufgabe. Erzeuge eine Funktion pores.generate die ein künstliches Porenbild (im.pores) mit N(=20) Poren und randomisierten Parametern (wie oben) erzeugt. Zunächst lassen wir Überlappungen zu. Breite und Höhe sollen auf den Bereich [5,15] Pixel begrenzt sein.


Synthetisches Porenbild

 ▸ 
[]
 ✗ 
 ≡ 

aW0ucG9yZXMgPSBtYXRyaXgoMTAsMTAwLDEwMCxtb2RlPSd1aW50OCcpCmZ1bmN0aW9uIHBvcmVzLmdlbmVyYXRlIChpbSxOKSB7CiAgZm9yIChpIGluIDE6TikgewogICAgcCA9IHJ1bmlmKDIpKjEwMAogICAgYSA9IHJ1bmlmKCkqMzYwCiAgICB3ID0gNStydW5pZigpKjEwCiAgICBoID0gNStydW5pZigpKjEwCiAgICBJID0gODArcnVuaWYoKSoxMDAKICAgIGRyYXcuY2lyY2xlKGltLEksY2VudGVyPXAsYW5nbGU9YSx3aWR0aD13LGhlaWdodD1oLGZpbGxlZD1UUlVFKQogIH0KICBpbQp9CnBvcmVzLmdlbmVyYXRlKGltLnBvcmVzLDIwKQpwbG90KGltLnBvcmVzKQ==

Da wir nachfolgend über eine Pixelanalyse die elliptischen Poren rekonstruieren wollen ist eine Porenüberlappung nicht sinnvoll (wenn auch möglich in z.B. Schliffbildern).


Auscchnitt für den Algortihmus zur Vermeidung von überlappenden Ellipsen durch Suche von bbox Überlappungen (Intersections)

 ▸ 
[]
 ✗ 
 ≡ 

Da randomisiert neue Kandidaten erzeugt werden kann man obiges Beispiel in eine Zählschleife einbinden, in der die Anzahl der Versuche eine nicht überlappende Ellipse zu erzeugen begrenzt wird.

Aufgabe. Erzeuge eine Funktion pores.generate.overlapfree die ein künstliches Porenbild (im.pores.synth) mit N(=20) Poren und randomisierten Paremtern (wie oben) ohne Überlappungen erzeugt.


Synthetisches Porenbild

 ▸ 
[]
 ✗ 
 ≡ 

aW0ucG9yZXMgPSBtYXRyaXgoMTAsMTAwLDEwMCxtb2RlPSd1aW50OCcpCmZ1bmN0aW9uIHBvcmVzLmdlbmVyYXRlLm92ZXJsYXBmcmVlIChpbSxOKSB7CiAgYmJveC5saXN0ID0gbGlzdCgpCiAgZm9yIChpIGluIDE6TikgewogICAgcCA9IHJ1bmlmKDIpKjEwMAogICAgYSA9IHJ1bmlmKCkqMzYwCiAgICB3ID0gNStydW5pZigpKjEwCiAgICBoID0gNStydW5pZigpKjEwCiAgICBJID0gODArcnVuaWYoKSoxMDAKICAgIHMgPSBtYXgodyxoKQogICAgYiA9IHtsZWZ0PXBbMV0tcy8yLHRvcD1wWzJdLXMvMix3aWR0aD1zLGhlaWdodD1zLGNlbnRlcj1wLGFuZ2xlPWEsbWFqb3I9dyxtaW5vcj1ofQogICAgbm9vdmVybGFwID0gYWxsKG1hcChiYm94Lmxpc3QsCiAgICAgICAgICBmdW5jdGlvbiAoYjEpIHsgaXNGQUxTRShiYm94LmludGVyc2VjdChiLGIxKSkgfSkpCiAgICBpZiAobm9vdmVybGFwKSB7CiAgICAgIGRyYXcuY2lyY2xlKGltLEksY2VudGVyPXAsYW5nbGU9YSx3aWR0aD13LGhlaWdodD1oLGZpbGxlZD1UUlVFKQogICAgICBwdXNoKGJib3gubGlzdCxiKQogICAgfQogIH0KICBiYm94Lmxpc3QKfQpwb3Jlcy5nZW5lcmF0ZS5vdmVybGFwZnJlZShpbS5wb3JlcywyMCkKcGxvdChpbS5wb3Jlcyk=

Das Histogramm

Ein Histogramm gibt eine diskretisierte verteilung von Werten eines Vektors, einer Matrix, eines Bildes, oder jeglicher n-dimensionaler Datenstruktur wieder.

Dabei wird der zu erwartende Wertebereich ⟨xmin,xmax⟩=⟨x1,x2⟩ in k Intervalle der Breite Δ=(xmax-xmin)/k unterteilt, d.h., {⟨x1,x1+Δ⟩, ⟨x1+Δ,x1+2Δ⟩, .. , ⟨x1+(k-1)Δ,x2⟩}.

Die Anzahl der Intervalle bestimmt die Granularität (breaks Argument). Die programmatische Rückgabe eines Histogramms (plot=FALSE) liefert eine Liste:

list [5] (
 breaks:vector,
 counts:vector,
 mids:vector,
 density:vector,
 equidist=boolean
)

Das Element density ist ein auf die Summe 1 normierter Vektor von count. Mit dem xlim Argument kann der Start und Endwert der Werteverteilung begrenzt werden.


Histogram Plot mit breaks=k Intervalle oder alternativ Rückgabe einer Liste

 ▸ 
[]
 ✗ 
 ≡ 

Aufgabe. Welche Anzahl von Intervallen ist sinnvoll bzw. wie sollte man die Intervallgröße (breaks) wählen und wovon hängt diese Wahl ab? Vergleiche das erzeugte Porenbild und das Rauschbild. Ändere die runif(N,min,max) Funktion in eine rnorm(N,min,max) Funktion ab. Wie unterscheidet sich die Verteilung?


Rauschen

Echte Bilder sind verrauscht. Detekorrauschen ist i.A. gaußverteilt um einen Mittelwert des Messwertes. Wir wollen jetzt Rauschen zu unserem synthetischen Bild hinzufügen.


Additives Rauschen zum Bild hinzufügen (hier nicht realistisch gleichverteiltes Rauschen)

 ▸ 
[]
 ✗ 
 ≡ 


Multiplikatives Rauschen zum Bild hinzufügen (hier nicht realistisch gleichverteiltes Rauschen)

 ▸ 
[]
 ✗ 
 ≡ 

man kann anstelle einer Rauschmatrix auch direkt einen Vektor mit gleicher Anzahl von Matrixelementen verwenden, d.h. im+runif(length(im),a,b)

Achtung: Bisher war der Datentyp unser Ausgangsbildes ganzzahlig (uint8). Der kleinste Delta(Rausch)wert kann dahern nur 1 sein. Und i+x kann zu einem Überlauf oder i-x zu einem Unterlauf führen was zu seltsamen Artifakten führen kann (Modulo Integerarithmetik, d.h. 3-10 bei 8Bit unsigned ergibt tatsächlich 255-7)! daher wird nachfolgend das Porenbild etwas realistischer im Dynamikbereich skaliert und ein Offset (Hintergrundintensität) hinzugefügt.

Aufgabe. Erzeuge eine Funktion image.noise die zum einem Bild Rauschen hinzufügt: Additiv (wie oben), jeweils wählbar mit runif(n,min,max) oder rnorm(n,min,max) Generatoren, und multiplikativ. Die Höhe des Rauschens wird über gamma festgelegt. Erzeuge ein verrauschtes Porenbild mit γ=0.1 und 0.3. n muss gleich length(im) gewählt werden. Weiterhin soll der Dynamikbereich eingeschränkt werden (Skalierung) und ein Hintergrundoffset hinzugefügt werden (nach der Skalierung). Dadurch wird Unter/Überlauf durch Rauschhinzufügung vermieden.


Synthetisches Rauschen

 ▸ 
[]
 ✗ 
 ≡ 

ZnVuY3Rpb24gaW1hZ2Uubm9pc2UgKGltLHNjYWxlLG9mZnNldCxnYW1tYSxub2lzZWdlbixhZGRpdGl2ZSkgewogIGltPWltKnNjYWxlK29mZnNldAogIGlmIChhZGRpdGl2ZSkgewogICAgaW0ubm9pc3k9aW0rKG5vaXNlZ2VuKGxlbmd0aChpbSksLWdhbW1hLGdhbW1hKSoyNTUpCiAgfSBlbHNlIHsKICAgIGltLm5vaXN5PWltKigxK25vaXNlZ2VuKGxlbmd0aChpbSksLWdhbW1hLGdhbW1hKSkKICB9CiAgaW0ubm9pc3kKfQpwbG90KGltLnBvcmVzKQpwbG90KGltYWdlLm5vaXNlKGltLnBvcmVzLDAuNSwyMCwwLjMscnVuaWYsRkFMU0UpKQpwbG90KGltYWdlLm5vaXNlKGltLnBvcmVzLDAuNSwyMCwwLjEscnVuaWYsVFJVRSkpCnBsb3QoaW1hZ2Uubm9pc2UoaW0ucG9yZXMsMC41LDIwLDAuMyxybm9ybSxGQUxTRSkpCnBsb3QoaW1hZ2Uubm9pc2UoaW0ucG9yZXMsMC41LDIwLDAuMSxybm9ybSxUUlVFKSk=

Aufgabe. Welches Rauschen hat einen größeren Effekt? Additiv oder Multiplikativ. Weclhe Art würde physikalischen Rascuhquellen entsprechen?


Kantendetektion der Poren

Um nun die Poren in einem Bild charakterisieren zu können müssen deren Konturen berechnet werden. gradientebasierte Filter sind dafür geeignet.


Canny Edge Detektor (t1 und t2 sind wählbare und problemabhängige Thresholdparameter)

 ▸ 
[]
 ✗ 
 ≡ 

Aufgabe. Bewerte das Ergebnis des Canny Edge Detektors ohne und mit verschieden großen Rauschen additiv und multiplikativ). Wann werden Artefakte markiert (also Rauschen), wie muss man die Parameter t1 und t2 verändern um die Artefakte zu reduzieren. Wo ist die Grenze erreicht?.

Clustering und Einhüllende


Gruppierung von Punkten nach Nachbarschaftsbeziehungen (t1 und t2 sind wählbare und problemabhängige Thresholdparameter)

 ▸ 
[]
 ✗ 
 ≡ 

Das Problem: Die Gruppen enthalten eventuell nicht zur Einhüllenden einer Pore gehörende Punkte oder die Zahl der Punkte ist unnötig hoch. Für einen Ellipsenfit benötigt man die relevanten einhüllenden Punkte (i.A. sortiert)

Ellipsenanpassung als Minimierungsproblem

Die Ellipsenanpassung liefert die Parameter der allgemeinen Ellipsengleichung. Mit normalize=TRUE werden die geometrischen Ellipsenparameter als Liste geliefert. Der Winkel ist aber um 270° verschoben gegenüber der draw.circle Funktion.


Ellipsenfit für alle Gruppen

 ▸ 
[]
 ✗ 
 ≡ 

Durch Rauschen verursachte Artefakte können als Ergebnis NaN (Not a Number) Werte liefern!

Aufgabe. Prüfe die Übereinstimmung der angepassten Ellipsen mit dem Punktebild in Abhängigkeit mit dem Rauschanteil (variieren). Welche Beobachtungen kann man machen? Vergleiche die Ergebnisse der vollen Punktegruppe mit nachfolgender Hüllenpunkte Berechnungen (mit dem Graham Algorithmus). Gibt es Unterschiede?


Hüllenberechnung nach dem Graham Algorithmus

 ▸ 
[]
 ✗ 
 ≡ 

Statistische Analyse

Abschließend wird das Ergebnis der Ellipsenanpassung statistisch ausgewertet. Dabei sind verschiedene Aggregate wichtig:


Statistische Analyse

 ▸ 
[]
 ✗ 
 ≡ 

Wichtig: Vorher müssen alle Datenzeilen mit NaN Werten entfernt werden (erste Anweisung). Dazu wird die Ergebnismatrix mit einem Booleschen Vektor reduziert (gefiltert).

Aufgabe. Ergänze die statistische Analyse um den Median (fivenum benutzen) und die Streuung (sd) für die Axenlängen und den Winkel. Trage Ergebnisse unten ein (Copy und Paste der obigen Ausgabe).


Created by the NoteBook Compiler Ver. 1.33.1 (c) Dr. Stefan Bosse (Wed Dec 18 2024 15:34:55 GMT+0100 (Central European Standard Time))