【问题标题】:Cumulative distribution function: how to calculate it in discrete case累积分布函数:如何在离散情况下计算它
【发布时间】:2010-02-17 16:13:51
【问题描述】:

我有一些值和它们的可能性,实际上是图像的直方图。 我的目标是使用以下公式均衡该直方图:
(来源:wikimedia.org

为了使用这个公式,我将直方图除以图像像素数。所以我得到了一个归一化的直方图(概率值)。 然后对于图像的每个像素,我使用上面的公式计算了一个新值,所以我只是对归一化直方图的元素求和。 例如,值为 23 的像素获得一个新值,该值计算为归一化直方图从 0 到 23 的元素之和。 历史 [0] + ... + 历史 [23]。 然后将总和乘以 255 得到 0 到 255 之间的值(不是 0 到 1 之间)

该方法效果很好,我在书中看到了一些结果,但就我而言,我的实现效果不佳,实际上是错误的,有人看到我的方法中的错误吗?

【问题讨论】:

  • 你能告诉我们你的源代码吗?
  • 我已经解决了这个问题,感谢您和两位回答我的人,这对我很有帮助!

标签: image-processing


【解决方案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;
    }

【讨论】:

    【解决方案2】:

    您似乎在描述正确的算法;有关直方图均衡化的另一个指针,请参见此处:

    http://en.wikipedia.org/wiki/Histogram_equalization#Implementation

    我怀疑错误不在于算法,而在于您的实现。您是否检查过直方图是否合理?代码是否相当短,以便您可以发布它?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-22
      • 2014-09-07
      • 1970-01-01
      • 2012-08-15
      • 1970-01-01
      • 1970-01-01
      • 2010-10-23
      相关资源
      最近更新 更多