Digitale Bildverarbeitung

11 Bereichssegmentierung 2

Bestimmung eines Binärbildes der aktuellen Region
Parameter:
m: Marke der zu bearbeitenden Region
markIm: Eingabebild, das die markierten Regionen
regImg: Ausgabebild (Binärbild), in dem die zu bearbeitenden Region gespeichert ist
static void loadRegIm(int m, int[][] markIm,byte[][] regIm)
{
for (int r=0; r<markIm.length; r++)
for (int c=0; c<markIm.length; c++)
if (markIm[r][c] == m)
regIm[r][c] = 1;
else
regIm[r][c] = 0;
}

Berechnung des Flächeninhalts für eine Region
Parameter:
regImg: Binärbild, in dem die zu bearbeitende Region gespeichert ist

static int countPixel(byte[][] regIm)
{
int imSize = regIm.length;
int n=0;
for (int r=0; r<imSize; r++)
for (int c=0; c<imSize; c++)
if (regIm[r][c]>0)
n++;
return n;
}

Berechnung des Schwerpunkts für eine Region
Parameter:
regImg: Binärbild, in dem die zu bearbeitende Region gespeichert ist

Point centOfGrav(byte[][] regIm)
{
int n=0;
long yc=0, xc=0;
int imSize = regIm.length;
 for (int r=0; r<imSize; r++)
  for (int c=0; c<imSize; c++)
   if (regIm[r][c]>0) {
    yc += r;
    xc += c;
    n++;
    }
return new Point( xc/n, yc/n );
}

Berechnung des Umrissbildes
Parameter:
regImg: Binärbild, in dem die zu bearbeitende Region gespeichert ist
outlImg: Ausgabebild (Binärbild), in dem der Umriss der zu bearbeitenden Region gespeichert ist

static void genOutLine(byte[][] regIm, byte[][] outlIm)
{
int imSize = regIm.length;
for (int r=0; r<imSize; r++)
for (int c=0; c<imSize; c++)
outlIm [r][c] = 0;
for (int r=0; r<imSize; r++)
for (int c=1; c<imSize; c++)
if (regIm[r][c-1]==0 && regIm[r][c]>0)
outlIm[r][c] = 1;
else if (regIm[r][c-1]>0 && regIm[r][c]==0)
outlIm[r][c-1] = 1;
for (int r=1; r<imSize; r++)
for (int c=0; c<imSize; c++)
if (regIm[r-1][c]==0 && regIm[r][c]>0)
outlIm[r][c] = 1;
else if (regIm[r-1][c]>0 && regIm[r][c]==0)
outlIm[r-1][c] = 1;
}

Berechnung des Umfangs für eine Region
Parameter:
outlImg: Binärbild, in dem der Umriss der zu bearbeitenden Region gespeichert ist

static int perimeter(byte[][] outlIm)
{
int imSize = outlIm.length;
int n=0;
for (int r=0; r<imSize; r++)
for (int c=0; c<imSize; c++)
if (outlIm[r][c]>0)
n++;
return n;
}

Berechnung polarer Abstandsmaße
Parameter:
cenGra: Schwerpunkt der Region
outlImg: Binärbild, in dem der Umriss der zu bearbeitenden Region gespeichert ist
static PolTyp polarCheck(Point CenGra, byte[][] outlIm)
{
float d, dy, dx;
int imSize = outlIm.length;
float min = 2*imSize;
float max = 0;
long mean = 0;
int n = 0;
for (int r=0; r<imSize; r++)
for (int c=0; c<imSize; c++)
if (outlIm[r][c]>0) {
dy = cenGra.y - r;
dx = cenGra.x - c;
d = (float) Math.sqrt(dy*dy + dx*dx);
if (d<min)
min = d;
else if (d>max)
max = d;
mean += d;
n++;
}
mean /= n;
// Normiertes Minimum und Maximum
return new PolTyp( min/mean, max/mean);
}