逐点图像处理 - 直方图均衡(处理)

时间:2012-04-12 15:56:55

标签: java image-processing processing

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

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?

另外,我很困惑的另一件事是,即使在对直方图进行标准化后,我如何能够使用扩展像素值重新创建图像?

1 个答案:

答案 0 :(得分:0)

首先获得CDF(累积分布函数)。这基本上就是你的“传播函数”,但你应该将它标准化,使其从0变为1(除以像素数,使用双精度数。)

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

的值

或者只做y = cdf(x)并将min-max值线性重新映射到0-255范围,它基本上是相同的。

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