public Bitmap wyrownajHistogramGlobalnie(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[] 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];
wartosciHistogramuWy3 = 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]++;
calculate_histogram_in();
int n = obrazWe.Width * obrazWe.Height;
for (int i = 0; i < iloscOdcieniSzarosci; i++) // pdf of image
s_hist_eq[i] = (double)wartosciHistogramu[i] / (double)n;
sum_of_hist[0] = s_hist_eq[0];
Color c;
int t;
for (int i = 1; i < iloscOdcieniSzarosci; 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);
c = Color.FromArgb(t, t, t);
obrazWy.SetPixel(i, j, c);
}
}
// --- Histogram Wy ---
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(wartosciHistogramuWy, wartosciHistogramuWy.Sum()); // wyznaczenie przedzialow w ktorych mieszcza sie odpowiednie kolory
wartosciHistogramuWy2 = group_histo(wartosciHistogramuWy, binary_limits); // 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);
}
}
calculate_histogram_out(obrazWy);
mw.label1.Text = "";
return obrazWy;
}