2010-02-17 190 views
0

我有一些值及其可能性,图像的直方图实际。 我的目标是均衡使用这个公式,直方图: alt text http://upload.wikimedia.org/math/1/a/d/1ad81c5bfdd01016c7019a33dd1faea1.png累积分布函数:如何计算的离散情况下

为了使用此式I由图像的像素的数目devided直方图。所以我得到了一个归一化的直方图(概率值)。 然后对于图像的每个像素,我使用上面的公式计算出一个新值,所以我只是对归一化直方图的元素进行求和。 对于具有值23的示例性像素得到其被计算为归一化的直方图的元素的总和为0〜23 HIST一个新的值[0] + ... + HIST [23]。 然后将总和乘以255得到0到25​​5之间的值(不在0和1之间)

该方法给出了很好的结果,我在本书中看到了一些结果,但在我的案例中,我的实现没有得到好的结果,这是错误实际上,没有任何人看到我的方法错误了吗?

+0

你能告诉我们你的源代码吗? – Andres 2010-02-17 21:32:02

+0

我已经解决了这个问题,感谢你和两位回答我的人,这真的帮助了我! – maximus 2010-03-02 15:09:39

回答

1

这是C#中的一个实现。在我来说,我正常化直方图当我完成来计算的话。它可能会帮助你

public void Histogram(double[] histogram, Rectangle roi) 
     { 
      BitmapData data = Util.SetImageToProcess(image, roi); 

      if (image.PixelFormat != PixelFormat.Format8bppIndexed) 
       return; 

      if (histogram.Length < Util.GrayLevels) 
       return; 

      histogram.Initialize(); 
      int width = data.Width; 
      int height = data.Height; 
      int offset = data.Stride - width; 

      unsafe 
      { 
       byte* ptr = (byte*)data.Scan0; 

       for (int y = 0; y < height; ++y) 
       { 
        for (int x = 0; x < width; ++x, ++ptr) 
         histogram[ptr[0]]++; 

        ptr += offset; 
       } 
      } 
      image.UnlockBits(data); 

      NormalizeHistogram(histogram, height * width); 
     } 

     public void NormalizeHistogram(double[] histogram, int imageArea) 
     { 
      for (int i = 0; i < histogram.Length; ++i) 
       histogram[i] = (double)histogram[i]/imageArea; 
     } 

public void HistogramEqualization(double[] histogram) 
     { 
      double[] cdf = new double[Util.GrayLevels]; 

      double sum = 0; 
      for (int i = 0; i < Util.GrayLevels; i++) 
      { 
       sum += histogram[i]; 
       cdf[i] = sum; 
      } 

      BitmapData data = Util.SetImageToProcess(image); 

      unsafe 
      { 
       byte* ptr = (byte*)data.Scan0; 
       int offset = data.Stride - data.Width; 
       int width = data.Width; 
       int height = data.Height; 

       for(int y = 0; y < height; y++) 
       { 
        for (int x = 0; x < width; ++x, ++ptr) 
         ptr[0] = (byte)(cdf[ptr[0]] * ((byte)Util.MaxGrayLevel)); 

       } 
       ptr += offset; 
      } 
      image.UnlockBits(data); 
     } 



    static public BitmapData SetImageToProcess(Bitmap image, Rectangle roi) 
    { 
     if (image != null) 
      return image.LockBits(
       roi, 
       ImageLockMode.ReadWrite, 
       image.PixelFormat); 

     return null; 
    } 
+0

谢谢!它真的帮了大忙! – maximus 2010-03-02 15:10:15