R - Einführung in Datenverarbeitung (Teil 2) mit Analyse (Stefan Bosse) [4.12.2025]

Wir verwenden hier Pakete die math, plot, imager. Ggfs. in einem Snippet mittels use einbinden. Rechts unten gibt es den ChatBot für eine R+ Hilfe.

Analyse von Bild- und Matrixdaten

Zweidimensionale Daten werden häufig in Matrizen oder Arrays organisiert und gespeichert. Eine matrix besteht aus Zeilen und Spalten, ein Array kann beliebig viele Dimensionen besitzen.

Bilder können in verschiedenen Formaten vorliegen:

  1. Intensitätsmatrix (XY Grauwertbild)
  2. Multikanal Arrays (XY Farbbilder, mit den Kanälen Rot, Grün, Blau, und eventuell Alpha)
  3. Dreidimensional als Bildervolumen (z.B. XY Schichtbilder entlang Z-Achse in CT Voumes), also auch wieder dreidimensionale Arrays)

Es gibt verschiedene Merkmale von Bilder, i.A. statistischer Art:

  1. Mittelwert der Intensität, oder einzelner (Farb-) Kanäle
  2. Standardabweichung der Intensität
  3. Frequenspektrum der Intensität, d.h. die Fouriertransformation vom Orts- in den Wellenvektorruam
  4. Intensitätsverteilung (Histogramm)

Literatur

Statistische Größen


Mittelwert, Median und Momente höherer Ordnung am Beispiel von Matrizen

 ▸ 
[]
 ✗ 
 ≡ 

Histogramm

Ein Histogramm gibt die Intensitätsverteilung eines Bildes an. Diese ist eine Häufigkeit (Pixelwerte) von Intensitäten in diskreten Intervallen (bins).


Histogramm von Bildern (Matrizen)

 ▸ 
[]
 ✗ 
 ≡ 

Die Histogramm Funktion gehört zum plot Package, kann aber mit der plot=FALSE Option auch eine Liste u.A. mit der Dichteverteitlung (Vektor) zurück geben.

Bildprofile

Neben skalarer Aggegaten können auch Profile von Bildern ermittelt werden. Besonders wichtig sind horizontale und vertikale Profillinien eines Bildes, um z.B. danach eine einfache matrixbasierte Intensisätshomogenisierung (gleichmäßige Beleuchtung) durchzuführen. Dabei kann man entweder eine Linie in horizontaler oder vertikaler Richtung entnehmen oder besser in die jeweils orthogonale Richtung integrieren (also Mittelwert der Intensitäten bilden):

#label

function core::apply(
  x:data.frame|matrix
  MARGIN:number|vector
  FUN:function|string
  keep.type?:boolean=false) => vector|matrix

Choices:
  MARGIN=1|2|[1,2]

Apply takes data frame or matrix as an input and gives output in vector or matrix.
MARGIN:
 1:iterate over rows and transpose (function(vector))
 2:iterate over columns (function(vector)),
[1,2]: iterate over cells (function (*)).
Row names: given by FUN result.


Horizontale und vertikale Intensitätsprofile von Bildern

 ▸ 
[]
 ✗ 
 ≡ 

Will man mit den Profilen Beleuchtungsinhomogenitäten in Bildern beseitigen sind diese rohen Profile nicht gut geeignet da sie auch die Bildmerkmale enthalten, d.h. z.B. Intensitätsschwankungen in Röntgenbildern durch Fremdeinschlüsse oder Poren.


Beleuchtungskorrektur eines Rauschbildes und überlagerte Gaussinhomogenität mit horizontalen und vertikalen Intensitätsprofilen (mit einfacher Mittelwertglättung der Profile). Das Ergebnis überzeugt nicht wirklich!

 ▸ 
[]
 ✗ 
 ≡ 

Eine radiale Intensiätsinhomogenität kann mit der getrennten Linearisierung mit horizotntalen und vertikalen Profilen nicht flächug richtig kompensiert werden!

Frage 1. Welche Funktion müsste man anstelle von Linien für eine solche Korrektur verwenden?


Analyse eines Beispieldatensatzes

Daten

DATA: Variable dataImage0 Type: Binary DATA: Variable dataImage0R Type: Binary DATA: Variable dataImage2000 Type: Binary DATA: Variable dataImage2000R Type: Binary DATA: Variable dataImage10000 Type: Binary DATA: Variable dataImage10000R Type: Binary DATA: Variable dataImage20000 Type: Binary DATA: Variable dataImage20000R Type: Binary

Die Bilddaten liegen häufig im Integer (8 Bit) Format vor. Weitere Berechnungen wie Intensitätshomogenisierung sollten aber mit dem Datenformat float32 durchgeführt werden. Dazu ist eine Konvertierung der Bilder sinnvoll, wie unten gezeigt. Dazu erzeugt man ggfs. einen neuen Datenrahmen wo auch gleich statistische Kennwerte der Bilder hinzugefügt werden können.

Es gibt zwei Möglichkeiten:

data.im2=data.frame(cycles=NA,shift=NA,image=NA,mean=NA,sd=NA,max=NA)
result = list()
for(row in data.im) {
  # row ist Referenz auf eine data.im Zeile!
  row2 = copy(row)
  row2$image=as.matrix(row$image,mode='float32')
  row2$mean=mean(row$image)
  row2$sd=sd(row$image)
  row2$max=max(row$image)
  data.im2=rbind(data.im2,row2)
}

Man kann aber auch "in-place" Datenrahmen verändern (die Kopie der ursprünglichen Tabelle ist aber nicht erforderlich, aber sinnvoll da das Original die integrierten Bilddaten enthält):

data.im2=copy(data.im)
data.im2$image=lapply(data.im$image,function (im) {
  as.matrix(im,mode='float32')/100
})

Die Bilddaten in einem Datenrahmen. Die shift=true Bilder sind azentrische Ausschnitte von Originalbildern (größeres Format) mit stärkeren Intensitätsinhomogenität.

 ▸ 
[]
 ✗ 
 ≡ 

Aufgabe 2. Ergänze die Datentabelle mit den Spalten mean, sd, median sowie min und max. Diese sollen für jedes Bild die statische Analyse der Bilder enthalten.


Statische Analyse der Bilder

 ▸ 
[]
 ✗ 
 ≡ 


Aufgabe 3. Ergänze nun die Datentabelle mit den Spalten hp und vp. Diese sollen für jedes Bild die geglätteten h/v Profile enthalten.


H/V Profile der Bilder gemäß obiger Berechnung

 ▸ 
[]
 ✗ 
 ≡ 


Aufgabe 4. Homogenisiere alle Bilder. Teste das Ergebnise durch einen Plot.


Homogenisierung der Bilder und Speicherung in der Tabelle

 ▸ 
[]
 ✗ 
 ≡ 




Hilfe



Einreichung (Assignment #2025-41328)



Prüfen



Bewerten (Lehrer)




Created by the NoteBook Compiler Ver. 1.41.2 (c) Dr. Stefan Bosse (Thu Dec 04 2025 09:12:26 GMT+0100 (Central European Standard Time))