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

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

Einführung in die Bildverarbeitung und Bildanalyse mit R (Teil 1)
Vorwort
Literatur
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 keinee Softwareinstallation erforderlich.

Literatur

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.


Synthetisches Porenbild

 ▸ 
[]
 ✗ 
 ≡ 

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

 ▸ 
[]
 ✗ 
 ≡ 

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)

 ▸ 
[]
 ✗ 
 ≡ 

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 Rauschen wird über gamma festgelegt. Erzeuge ein verrauschtes Porenbild mit γ=0.1.


Synthetisches Rauschen

 ▸ 
[]
 ✗ 
 ≡ 

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 verschiedenen großen Rauschen. 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 eventuelle 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)

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).



Hilfe



Einreichung (Assignment #01-46158 )



Prüfen



Bewerten (Lehrer)




Created by the NoteBook Compiler Ver. 1.25.0 (c) Dr. Stefan Bosse (Fri Dec 08 2023 17:05:31 GMT+0100 (Central European Standard Time))