Digitale Bildverarbeitung

3 Punktoperationen

Was versteht man unter Punktoperationen bei einem Bild?
Operation, bei welcher der neue Grau- oder Farbwert eines Bildpunktes nur von seinem ursprünglichen Grau- oder Farbwert abhängt
Für einen Bildpunkt werden insbesondere keine benachbarten Bildpunkte in die Berechnung einbezogen.
Beispiele:
Bild Addition/Division/Multiplication mit einer Konstante/ Histogrammglätung

Ortunabhängige- vs. abhängige Transformation
Unabhängig: Bildpunkte mit gleichem Grauwert werden unabhängig von ihrer Lage mit Bild gleich transformiert.
Abhängig: Die Transformation des Grauwertes eines Bildpunktes hängt auch von dessen Lage im Bild ab.
Ortsunabhängige Grauwerttransformationen können durch eine Tabelle (engl. Look up table, LUT) realisiert werden, wobei der Index dem alten Grauwert und der unter einem Index

Grauwerthistogramm
Das Grauwerthistogramm gibt für jeden Grauwert f eines Bildes die Häufigkeit h(f) seines Auftretens an.
 
20 20 20 20 20 20 20 40
160 60 60 60 60 60 60 40
160 60 70 70 70 70 60 40
160 60 70 80 80 70 60 40
160 60 70 80 80 70 60 40
160 60 70 70 70 70 60 40
160 60 60 60 60 60 60 40
120 120 120 120 120 120 120 120

2D-Histogramme
2D-Histogramme werden benutzt, um Unterschiede zwischen 2 Bildern zu ermitteln. Hierbei nimmt man die beiden Eingangsbilder und erzeugt daraus ein Ergebnisbild. Zunächst schaut man sich den ersten Punkt (0/0) in Bild 1 an. Nehmen wir einmal an, dieser hat den Wert 100. Wir schauen uns nun den gleichen Punkt in Bild 2 an. Dieser hat den Wert 200. Wir erhöhen daher den Wert des Pixels an (100/200) im Ergebnisbild um 1. So verfahren wir mit jedem Punkt in den beiden Bildern. Das Endprodukt ist ein sog. 2D-Histogramm. Im Idealfall (wenn beide Bilder gleich sind) liegen die Pixel alle auf einer diagonalen Linie. Das kommt dadurch zustande, daß eben nur Pixel dort gesetzt werden, wo die Helligkeiten (und damit die X und Y-Koordinaten im Endbild) gleich sind. Dies entspricht einer Geraden mit der Gleichung f(x)=x (was eine Diagonale ist). Andersherum, je stärker sich die Bilder unterscheiden, desto weniger sieht unser Ergebnisbild einer Diagonalen ähnlich.

Vorgabe der Verstärkung und des mittleren Grauwerts des Ergebnisbildes
ziel(p) = Versterkung * quelle(p) + mittlererGrauwert
mWert=for(x,y..) summe(x,y)/x+y
[x][y]=1.5 * [x][y]+mWert
1. Berechnung einer Look-Up-Tabelle für die Grauwertabbildung
2. Berechnung der neuen Grauwerte für jeden Bildpunkt mit Hilfe der Look-Up-Tabelle

Histogrammglättung, Histogrammebnungu
Einsatz der kumulativen Verteilungsfunktion


H(0)=...1/(8*8)*28=7/16....=H(6)=7/16
H(7)=3/4
H(8)=...=H(14)=15/16
H(15) = 1H(14)=1
Die neuen Grauwerte können mit Hilfe der kumulativen Verteilungsfunktion berechnet werden:
1. g = (Q-1)*H(f)
versucht annähernd eine Gleichverteilung herzustellen (Klassische Histogrammglättung)
2. g = (Q-1)*(H(f)-H(0))/(H(Q-1)-H(0))
dehnt die Grauwerte entsprechend der kumulativen Verteilungsfunktion, wobei sichergestellt wird, dass der Grauwert 0 auf 0 abgebildet wird.

Arithmetische Operationen verknüpfen zwei oder mehrere Bilder pixelweise.

LUT für Grauwert-Invertierung
Parameter:
lut: aktuelle Look-Up-Tabelle
Code:
static void invert(byte[] lut)
{
// max. zuläsiger Grauwert

maxGV = lut.length;
for (int gv=0; gv<maxGV; gv++)
  lut[gv] = (byte) (maxGV-gv-1);
}

LUT für Kontrastverstärkung
Parameter
loGV: untere Grenze des Grauwertbereichs
hiGV: obere Grenze des Grauwertbereichs
lut: aktuelle Look-Up-Tabelle
Code:
static void stretch(int loGV, int hiGV, byte[] lut)
{
long gvn;
int maxGV = lut.length;
for (int gv=0; gv<maxGV; gv++) {
if (loGV<=gv && gv<hiGV) {
 gvn = gv - loGV;
 gvn = (gvn * (maxGV-1)) / (hiGV-loGV);
 lut[gv] = (byte) gvn;
}
else
 lut[gv] = (byte) ((gv<loGV) ? 0 : (maxGV-1));
}
}

LUT für Markierung
Parameter
loGV: untere Grenze des Grauwertbereichs
hiGV: obere Grenze des Grauwertbereichs
color: gewünschter Grauwert
lut: aktuelle Look-Up-Tabelle
Code:
static void mark(int loGV, int hiGV, byte color, byte[] lut)
{
int maxGV = lut.length;
for (int gv=0; gv<maxGV; gv++)
if (loGV<=gv && gv<hiGV)
 lut[gv] = color;
else
 lut[gv] = (byte) gv;
}

Anwendung einer LUT
Parameter:
lut: aktuelle Look-Up-Tabelle
image: (quadratisches) Bild
Code:
static void lutOp(byte[] lut, byte[][] image)
{
int n = image.length;
for (int r=0; r<n; r++)
 for (int c=0; c<n; c++)
  image[r][c] = lut[image[r][c]];
}