public Bitmap wyrownajHistogramGlobalnie_ver2(int iloscKlas)
{
this.iloscKlas = iloscKlas;
double[] s_hist_eq = new double[iloscOdcieniSzarosci];
double[] sum_of_hist = new double[iloscOdcieniSzarosci];
int[] final_eq = new int[iloscOdcieniSzarosci];
int[] min_max = new int[2];
int[] binary_limits = new int[iloscKlas];
Bitmap obrazWy = new Bitmap(obrazWe.Width, obrazWe.Height);
wartosciHistogramu = new int[iloscOdcieniSzarosci];
wartosciHistogramuWy = new int[iloscOdcieniSzarosci];
wartosciHistogramuWy2 = new int[iloscOdcieniSzarosci];
for (int k1 = 0; k1 < obrazWe.Height; k1++)
for (int k2 = 0; k2 < obrazWe.Width; k2++)
wartosciHistogramu[obrazWe.GetPixel(k1, k2).R]++;
min_max = _min_max(wartosciHistogramu);
int n = obrazWe.Width * obrazWe.Height;
for (int i = min_max[0]; i < min_max[1]; i++) // pdf of image
s_hist_eq[i] = (double)wartosciHistogramu[i] / (double)n;
sum_of_hist[min_max[0]] = s_hist_eq[min_max[0]];
Color c;
int t;
for (int i = min_max[0]+1; i < min_max[1]; i++) // cdf of image
sum_of_hist[i] = sum_of_hist[i - 1] + s_hist_eq[i];
for (int i = 0; i < obrazWe.Height; i++)
{
for (int j = 0; j < obrazWe.Width; j++)
{
c = obrazWe.GetPixel(i, j);
t = (int)(sum_of_hist[c.R] * 255.0);
t = (int)(((double)t * (double)(min_max[1] - min_max[0])) / 255.0) + min_max[0];
c = Color.FromArgb(t, t, t);
obrazWy.SetPixel(i, j, c);
}
}
for (int k1 = 0; k1 < obrazWy.Height; k1++)
for (int k2 = 0; k2 < obrazWy.Width; k2++)
wartosciHistogramuWy[obrazWy.GetPixel(k1, k2).R]++;
binary_limits = binary_limits_finder_ver2(wartosciHistogramuWy, wartosciHistogramuWy.Sum(), min_max); // wyznaczenie przedzialow w ktorych mieszcza sie odpowiednie kolory
wartosciHistogramuWy2 = group_histo_ver2(wartosciHistogramuWy, binary_limits, min_max); // przesuniecie histogramow do wyznaczonych wczesniej przedzialow
for (int i = 0; i < obrazWe.Height; i++)
{
for (int j = 0; j < obrazWe.Width; j++)
{
c = obrazWy.GetPixel(i, j);
t = wartosciHistogramuWy2[c.R];
c = Color.FromArgb(t, t, t);
obrazWy.SetPixel(i, j, c);
}
}
return obrazWy;
}