12,453,672 members (92,723 online)
alternative version

47.7K views
23 bookmarked
Posted

Photometric Normalisation Algorithms

, 14 Nov 2006 CPOL
 Rate this:
Pre-processing faces images in order to increase the performance of verification and recognition algorithms

Output of multiscale retinex algorithm.

Introduction

The variation of illumination conditions of an object can produce large changes in the image plane, significantly impairing the performance of face verification and recognition algorithms. I present three photometric normalisation algorithms for use in pre-processing face images in order to be used in verification and recognition algorithms. Mainly I follow the ideas of paper "A Comparison of Photometric Normalisation Algorithms for Face Verification", James Short, Josef Kittler and Kieron Messer(2004) and "Lighting Normalization Algorithms for Face Verification", Guillaume Heusch, Fabien Cardinaux, Sebastien Marcel(2005). Multiscale retinex method is coded exactly like the theory says. The anisotropic and isotropic smoothing methods have a little modifications but essentially they are the same. If you want to see more details about them, you can see the papers previously mentioned.

Using the Code

You can apply the multiscale retinex method like:

```MultiscaleRetinex retinex = new MultiscaleRetinex
(param.Sigmas, param.Widths, param.FilterSize);
picFiltered.Image = retinex.Apply((Bitmap)bitmap.Clone());```

This is the code of multiscale retinex algorithm:

```public override unsafe Bitmap Apply(Bitmap bitmap)
{
int count = sigmas.Length;
Bitmap bmp;
double[,] sum = new double[bitmap.Width, bitmap.Height];

for (int i = 0; i < count;i++ )
{
bmp = new GaussianBlur(sigmas[i], size).Apply(bitmap);
sum = SumBitmap(bmp,sum,widths[i]);
}
return Normalise(DivBitmap(bitmap, sum));
}```

You can apply the isotropic smoothing method like:

```IsotropicSmoothing iso = new IsotropicSmoothing(param.Value);
picFiltered.Image = iso.Apply((Bitmap)bitmap.Clone());```

This is the code of isotropic smoothing algorithm:

```public override unsafe Bitmap Apply(Bitmap bitmap)
{
Bitmap = bitmap;
Point size = PixelSize;
double[,] src = new double[size.X, size.Y];
bool first = true;
byte N, S, E, W, A;
double Lw, Le, Ls, Ln, tmp, min = 0, max = 0;

LockBitmap();

for (int y = 0; y < size.Y ; y++)
{
PixelData* pPixel = PixelAt(0, y);
for (int x = 0; x < size.X ; x++)
{
tmp = pPixel->gray;

//Applying the process to all pixels of image except to the borders
if ((x > 0) && (x < size.X-1) && (y > 0) && (y < size.Y-1))
{
A = pPixel->gray;           //current
E = PixelAt(x, y+1)->gray;  //east
S = PixelAt(x+1, y)->gray;  //south
N = PixelAt(x-1, y)->gray;  //north
W = PixelAt(x, y-1)->gray;  //west

//Ld refers to the derivative with respect to
//each of the four adjacent neighbouring pixels
Lw = A - W;
Le = A - E;
Ln = A - N;
Ls = A - S;

//Isotropic smoothing
tmp = A + smooth * (Ln + Ls + Le + Lw);
}

src[x, y] = tmp;

//Computing the min and max values from all pixels of image
if (first) { min = max = tmp; first = false; }
else
{
if (tmp < min) min = tmp;
else
if (tmp > max) max = tmp;
}
pPixel++;
}
}
UnlockBitmap();
return Normalise(src, min, max);
}```

Output of isotropic smoothing algorithm.

You can apply the anisotropic smoothing method like:

```AnisotropicSmoothing anis = new AnisotropicSmoothing(param.Value);
picFiltered.Image = anis.Apply((Bitmap)bitmap.Clone());```

This is the code of anisotropic smoothing algorithm:

```public override unsafe Bitmap Apply(Bitmap bitmap)
{
Bitmap = bitmap;
Point size = PixelSize;
double[,] src = new double[size.X,size.Y];
bool first = true;
byte N, S, E, W, A;
double Lw, Le, Ls, Ln, pw, pe, ps, pn, eps = .1, tmp, min = 0, max = 0;

LockBitmap();

for (int y = 0; y < size.Y; y++)
{
PixelData* pPixel = PixelAt(0, y);
for (int x = 0; x < size.X; x++)
{
tmp = pPixel->gray;

//Applying the process to all pixels of image except to the borders
if ((x > 0) && (x < size.X-1) && (y > 0) && (y < size.Y-1))
{
A = pPixel->gray;           //current
E = PixelAt(x, y+1)->gray;  //east
S = PixelAt(x+1, y)->gray;  //south
N = PixelAt(x-1, y)->gray;  //north
W = PixelAt(x, y-1)->gray;  //west

//Ld refers to the derivative with respect to
//each of the four adjacent neighbouring pixels
Lw = A - W;
Le = A - E;
Ln = A - N;
Ls = A - S;

//Weber’s contrast inverse
pw = Math.Min(A, W) / (Math.Abs(A - W) + eps);
pe = Math.Min(A, E) / (Math.Abs(A - E) + eps);
pn = Math.Min(A, N) / (Math.Abs(A - N) + eps);
ps = Math.Min(A, S) / (Math.Abs(A - S) + eps);

//Anisotropic smoothing
tmp = A + smooth * (Ln * pn + Ls * ps + Le * pe + Lw * pw);
}

src[x, y] = tmp;

//Computing the min and max values from all pixels of image
if (first) { min = max = tmp; first = false; }
else
{
if (tmp < min) min = tmp;
else
if (tmp > max) max = tmp;
}
pPixel++;
}
}
UnlockBitmap();
return Normalise(src,min, max);
}```

Output of anisotropic smoothing algorithm.

Versions

• 1.0 14 Nov 2006

Share

 Web Developer Cuba
No Biography provided

You may also be interested in...

 Pro Pro

 First Prev Next
 how to setup mutiscale retinex config? poi11922-Nov-12 0:36 poi119 22-Nov-12 0:36
 My vote of 5 manoj kumar choubey26-Feb-12 21:46 manoj kumar choubey 26-Feb-12 21:46
 Weird output Tolga Birdal8-Nov-09 5:26 Tolga Birdal 8-Nov-09 5:26
 Bit color without loose face details Ariston Darmayuda22-Mar-07 7:26 Ariston Darmayuda 22-Mar-07 7:26
 Re: Bit color without loose face details Christian Graus22-Mar-07 7:37 Christian Graus 22-Mar-07 7:37
 Re: Bit color without loose face details mosquets22-Mar-07 9:51 mosquets 22-Mar-07 9:51
 Re: Bit color without loose face details Ariston Darmayuda25-Mar-07 3:42 Ariston Darmayuda 25-Mar-07 3:42
 Color Image japacheco22-Jan-07 10:43 japacheco 22-Jan-07 10:43
 Re: Color Image mosquets23-Jan-07 4:05 mosquets 23-Jan-07 4:05
 How can I enhance the original image by the output of Multi Scale Retinex? Brian Lau3-Dec-06 19:54 Brian Lau 3-Dec-06 19:54
 Re: How can I enhance the original image by the output of Multi Scale Retinex? mosquets4-Dec-06 4:17 mosquets 4-Dec-06 4:17
 Last Visit: 31-Dec-99 18:00     Last Update: 29-Aug-16 8:22 Refresh 1