2010-02-17 114 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