2

我真的对这种技术感到困惑。我知道直方图是每个值的频率(我正在处理灰度图像)并且我已经制作了一种方法来做到这一点:

int[] populateHist (PImage x)
{
  x.loadPixels();
  int[] out = new int[256];
  for (int i = 0; i < x.pixels.length; i++)
  {
     out[(int)red(x.pixels[i])]++;
  }
  return out;
}

以及累积数组的扩展函数:

int[] spreadFunc (int[] a)
{
  int[] out = new int[256];
  for (int i = 0; i < a.length; i++)
  {
    if (i == 0)
    {
      out[i] = (a[i]);
    }
    else
    out[i] = (a[i]) + (a[i-1]);
  }
  return out;
}

下一步是对这些值进行归一化,那么取最大值并将所有值除以相同的某个数字,这样最大值现在是 255 是否正确?

另外,我感到困惑的另一件事是,即使在对直方图进行归一化之后,我如何才能使用散布像素值重新创建图像?

4

1 回答 1

0

首先,您获得 CDF(累积分布函数)。这基本上是您的“扩展函数”,但您应该对其进行规范化,使其从 0 变为 1(除以像素数,使用双精度数)。

其次,您重新映射像素的值y = cdf(x)*255

或者只是y = cdf(x) 将最小值-最大值线性地重新映射到 0-255 范围,这基本上是一样的。

参见例如http://en.wikipedia.org/wiki/Histogram_equalization#Implementation

于 2012-04-12T19:30:53.070 回答