| 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.
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:
Es gibt verschiedene Merkmale von Bilder, i.A. statistischer Art:
Lese "Learning R Programming" Kun Ren,2023
Lese Modul A, Abschnitt "Einführung in die R(+) Programmiersprache".
Lese "Vorverarbeitung und Bildverbesserung", F. Puente León, KIT, 2016
|
▸
[] |
✗
≡
|
Ein Histogramm gibt die Intensitätsverteilung eines Bildes an. Diese ist eine Häufigkeit (Pixelwerte) von Intensitäten in diskreten Intervallen (bins).
|
▸
[] |
✗
≡
|
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.
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):
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.
|
▸
[] |
✗
≡
|
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.
|
▸
[] |
✗
≡
|
draw.gaussian erzeugt eine gaussförmige Beluchtungsinhomogenität die multiplikatib auf das Originalbild angewendet wirdapply(..) berechnet die Profile durch orthogonale Integration der Intensitäten (liefert Vektor)signal::filter wendet einen einfachen Mittelwertfilter auf die Profilvektoren anreshape korrigiert durch lineare Interpolation den durch die Filterung geschrumpften Vektor und expandiert iweder auf 100 Elementematrix(v,..,byrow) erzeugt durch repitierende Einfügung des Vektors v entweder zeilen- oder spaltenweise eine Korrekturmatrix, die dann noch mit den Extremwerten des jeweiligen Profils korrigiert wird.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?
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
})
|
▸
[] |
✗
≡
|
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.
|
▸
[] |
✗
≡
|
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.
|
▸
[] |
✗
≡
|
Aufgabe 4. Homogenisiere alle Bilder. Teste das Ergebnise durch einen Plot.
|
▸
[] |
✗
≡
|