title: I need to do a histogram stretch
body: <p>I have an array of BitmapFrames and need to do a histogram stretch. I know this is different from a histogram equalization, and what the final outcome is... sorta. the problem is I have absolutely no idea what to do after I get the histogram.</p>
  
  <p>So far my code creates an array for the histogram so I know how many pixels of each value i have. But after that I don't know what to do.</p>
  
  <p>this is the code I have so far... right now it makes the histogram and then histogram equalizes... which is NOT what I want... I was just trying to learn more about histograms</p>
  
  <pre><code>[Cmdlet(VerbsData.ConvertTo, "HistoStretch")]
  public class HistoStretchCmdlet : PSCmdlet
  {
      private BitmapFrame[] bFrame, outFrame;
      private BitmapSource src;
      private double pixelsize;
      private byte[] pixels, outPixels;
      private byte MAX_VAL;
      private int[] histogram;
      private int cf, start;
  
      [Parameter(ValueFromPipeline = true,
          ValueFromPipelineByPropertyName = true), ValidateNotNullOrEmpty]
      public BitmapFrame[] Bitmap
      {
          get
          {
              return bFrame;
          }
          set
          {
              bFrame = value;
          }
      }
  
      protected override void ProcessRecord()
      {
          base.ProcessRecord();
          Console.Write("Applying a histogram stretch to the image...\n\n");
          outFrame = new BitmapFrame[bFrame.Length];
          for (int c = 0; c &lt; bFrame.Length; c++)
          {
              MAX_VAL = (byte)((1 &lt;&lt; bFrame[c].Format.BitsPerPixel) - 1);
              histogram = new int[MAX_VAL + 1];
              for (int i = 0; i &lt;= MAX_VAL; i++)
              {
                  histogram[i] = 0;
              }
  
              pixelsize = bFrame[c].PixelWidth * bFrame[c].PixelHeight;
              pixels = new byte[(int)pixelsize];
              outPixels = new byte[(int)pixelsize];
              bFrame[c].CopyPixels(pixels,(int)bFrame[c].Width * (bFrame[c].Format.BitsPerPixel / 8),0);
  
              for (int i = 0; i &lt; pixelsize; i++)
              {
                  histogram[(int)pixels[i]] = histogram[(int)pixels[i]] + 1;
              }
              for (int i = 0; i &lt;= MAX_VAL; i++)
              {
                  Console.Write("{0}: {1}\n", i, histogram[i]);
              }
              for (int i = 0; i &lt;= MAX_VAL; i++)
              {
                  if (histogram[i] &gt;= 1)
                  {
                      start = i;
                      break;
                  }
              }
  
              for (int i = 0; i &lt; pixelsize; i++)
              {
                  cf = 0;
                  for (int g = 0; g &lt;= MAX_VAL; g++)
                  {
                      cf += histogram[g];
                      if (g == pixels[i])
                      {
                          break;
                      }
                  }
                  outPixels[i] = (byte)(cf * (MAX_VAL / pixelsize));
              }
  
              src = BitmapSource.Create(bFrame[c].PixelWidth, bFrame[c].PixelHeight, bFrame[c].DpiX, bFrame[c].DpiY,
                  bFrame[c].Format, bFrame[c].Palette, outPixels, (int)(bFrame[c].Width * (bFrame[c].Format.BitsPerPixel / 8)));
              outFrame[c] = BitmapFrame.Create(src);
          }
          WriteObject(outFrame);
      }
  }
  </code></pre>
  
  <hr>
  
  <p>this is what the histograms should look like according to my teacher: </p>
  
  <p><a href="http://www.fileden.com/files/2009/8/18/2547657/histostretch.PNG" rel="nofollow noreferrer">http://www.fileden.com/files/2009/8/18/2547657/histostretch.PNG</a></p>
  
  <p>I ran the code above... and got a straight black image. 
  here's my code:</p>
  
  <pre><code>outFrame = new BitmapFrame[bFrame.Length];
          for (int c = 0; c &lt; bFrame.Length; c++)
          {
              MAX_VAL = (byte)((1 &lt;&lt; bFrame[c].Format.BitsPerPixel) - 1);
              histogram = new int[MAX_VAL + 1];
              for (int i = 0; i &lt;= MAX_VAL; i++)
              {
                  histogram[i] = 0;
              }
  
              pixelsize = bFrame[c].PixelWidth * bFrame[c].PixelHeight;
              pixels = new byte[(int)pixelsize];
              outPixels = new byte[(int)pixelsize];
              bFrame[c].CopyPixels(pixels,(int)bFrame[c].Width * (bFrame[c].Format.BitsPerPixel / 8),0);
              max = pixels[0];
              min = pixels[0];
  
              for (int i = 0; i &lt; pixelsize; i++)
              {
                  histogram[(int)pixels[i]] = histogram[(int)pixels[i]] + 1;
                  if((int)pixels[i] &gt; max)
                      max = pixels[i];
                  if((int)pixels[i] &lt; min)
                      min = pixels[i];
              }
  
              dynamic = max - min;
  
              for (int i = 0; i &lt; pixelsize; i++)
              {
                  outPixels[i] = (byte)(((pixels[i] - min) / dynamic) * MAX_VAL);
              }
  </code></pre>