Grafische Datenverarbeitung
Digitale Bildverarbeitung

11 und 12  Bereichssegmentierung 1

Erzeugung eines Grauwerthistogramms
Parameter:
NofGV: höchster zu bearbeitender Grauwert (üblicherweise 255)
MaxAcc: maximaler Histogrammeintrag, auf den nach der Erstellung des Histogramms normiert werden soll
Sqrt: Schalter, ob die Histogrammeinträge nach Erstellung des Histogramms durch ihre jeweiligen Quadratwurzeln zu ersetzen sind
Image: Grauwertbild (quadratisch)
Histo: Feld zur Speicherung des Histogramms
static void Histogram(int NofGV, int MaxAcc, boolean Sqrt, byte[][] Image, int[] Histo)
{
int gv, Max;
int imSize = Image.length;
// Initialisierung
for (gv=0; gv<NofGV; gv++) Histo[gv] = 0;
// Berechnung des Histgramms
Max=0;
for (int r=0; r<imSize; r++) {
for (int c=0; c<imSize; c++) {
gv = Image[r][c];
Histo[gv]++;
if (Histo[gv] > Max) Max = Histo[gv];
}
}
if (Sqrt) {
// Skalierung mit Wurzelfunktion
for (gv=0; gv<NofGV; gv++)
if (Histo[gv])
Histo[gv] = (int) Math.sqrt(Histo[gv]);
Max = (int) sqrt(Max);
}
// Normierung des Histogramms
for (gv=0; gv<NofGV; gv++)
Histo[gv] = (int) (((long)Histo[gv] * MaxAcc)/Max);
}

Glättung eines Grauwerthistogramms
Aufgabe: Verbesserung der nachfolgenden Bestimmung der lokalen Minima
Parameter:
NofGV: höchster zu bearbeitender Grauwert
Width: Anzahl benachbarter Histogrammeinträge, die zur Mittelwertbildung herangezogen werden sollen
Histo: Ursprüngliches Histogramm
Smooth: Geglättetes Histogramm
static void SmoothHistogram(int NofGV, int Width, int[] Histo, int[] Smooth)
{
int Cen;
long h;
Cen = Width/2;
for (int gv=0; gv<NofGV; gv++) Smooth[gv] = 0;
// Mittelwertbildung
for (int gv=0; gv<=NofGV-Width; gv++) {
h=0;
for (int i=gv; i<gv+Width; i++)
h += Histo[i];
Smooth[gv+Cen] = (int)(h/Width);
}
}

Bestimmung lokaler Minima im Grauwerthistogramm
Parameter:
NofGV: höchster zu bearbeitender Grauwert
MinDown: minimale Anzahl absteigender Histogrammeinträge zur Detektion eines Histogrammabstiegs
MinUp: minimale Anzahl aufsteigender Histogrammeinträge zur Detektion eines Histogrammanstiegs
Histo: Histogramm
Thres: Vector für die Indizes der gefundenen lokalen Minima bzw. Schwellwerte
static void LocMin (int NofGV, int MinDown, int MinUp, int[] Histo, Vector Thres)
{
int Down, Up, i;
Thres.add(new Integer(0));
for (int d=0; d<NofGV; d++) {
Down = NofDown(NofGV, d, Histo);
if (Down>=MinDown) {
for (int u=d+Down; u<NofGV; u++) {
Up = NofUp(NofGV, u, Histo);
if (Up>=MinUp) {
i = d+Down + (u-d-Down)/2
Thres.add(new Integer(i));
d = u+Up;
break;
}
}
}
}
Thres.add(new Integer(NofGV-1));
}

Berechnung des Labelbildes
Parameter:
n: Anzahl der Schwellen
Thres: Vector, in dem die anzuwendenden Schwellen abgelegt sind
Image: Ursprungsbild
ThresIm: Labelbild
static void ThresIm(int n, Vector Thres, byte[][] Image, byte[][] ThresIm)
{
int imSize = Image.length;
// Umwandlung des Vectors in ein Feld
Object[] t = Thres.toarray();
for (int r=0; r<imSize; r++)
for (int c=0; c<imSize; c++)
{
// Suche zwischen welchen Schwellwerten
// der Grauwert liegt
Integer gv = new Integer(Image[r][c]);
int i = Math.abs(Arrays.binarySearch(t, gv));
ThresIm[r][c] = (byte)i;
}
}