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.
|
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]];
}