public override int[][] TransformImage(Hashtable source)
 {
     if(source == null)
         return null;
     else
     {
         int[][] input = (int[][])source["image"];
         int mask = (int)source["mask"];
         double count = (double)(255.0 / (mask * mask)); //square mask
     ColorHistogram h = new ColorHistogram(mask, mask);
         int width = input.Length;
         int height = input[0].Length;
     Func<Histogram, int, byte> fn = (hi,current) => (byte)(count * (double)hi[0, current + 1]);
     Func<int,int,IEnumerable<int>> grabNeighborhood = (px, py) => input.GrabNeighborhood(px, py, width, height, mask);
         for(int x = 0; x < width; x++)
         {
             int[] iX = input[x];
       Func<int,IEnumerable<int>> gX = (py) => grabNeighborhood(x,py);
             //close over these values
             for(int y = 0; y < height; y++)
             {
     Color c = Color.FromArgb(iX[y]);
     h.Repurpose(gX(y));
     iX[y] = Color.FromArgb(255, fn(h.Red, (int)c.R),
                                 fn(h.Green, (int)c.G),
                                 fn(h.Blue, (int)c.B)).ToArgb();
             }
         }
         return input;
     }
 }