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 になるようにするのは正しいですか?

また、私が混乱しているもう1つのことは、ヒストグラムを正規化した後でも、拡散したピクセル値で画像をどのように再作成できるのでしょうか?

4

1 に答える 1

0

まず、CDF (累積分布関数) を取得します。これは基本的に「拡散関数」ですが、0 から 1 になるように正規化する必要があります (ピクセル数で割り、2 倍を使用します)。

次に、ピクセルの値を再マッピングしますy = cdf(x)*255

またはy = cdf(x) 、最小値と最大値を 0 ~ 255 の範囲に線形に再マップします。基本的には同じことです。

たとえば、http: //en.wikipedia.org/wiki/Histogram_equalization#Implementationを参照してください。

于 2012-04-12T19:30:53.070 に答える