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

Java 逐点图像处理-直方图均衡化(处理),java,image-processing,processing,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[]populateH

我真的被这种技术弄糊涂了。。我知道直方图是每个值的频率(我正在处理灰度图像),我已经提出了一种方法:

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[]populateHist(PImage x)
{
x、 loadPixels();
int[]out=新的int[256];
对于(int i=0;i
以及累积阵列的扩展函数:

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;
}
int[]spreadFunc(int[]a)
{
int[]out=新的int[256];
for(int i=0;i
下一步是规范化这些值,因此取最大值并将所有值除以相同的特定数字是否正确,以便最大值现在为255

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

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

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

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

参见eg

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

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

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