Nadesłany przez Tomasz Lubiński, 12 października 2005 01:00
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.Pobierz pełne rozwiązanie.
Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.
Histogram_c - wyrownanie/Unit1.cpp:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
double LUTr[256], LUTg[256], LUTb[256], LUTgray[256];
//---------------------------------------------------------------------------
//przelicz nowe wartosci tablicy LUT
//wyswietl wartosci tablicy LUT
void TForm1::UpdateLUT(double *D, double *LUT, int series)
{
int i;
double D0min;
//znajdz pierwszą niezerową wartosc dystrybuanty
i = 0 ;
while (D[i] == 0) i++;
D0min = D[i];
for (i=0; i<256; i++)
LUT[i] = (((D[i] - D0min) / (1 - D0min)) * (256 - 1)) ;
Chart3->SeriesList->Series[series]->Clear();
Chart3->SeriesList->Series[series]->AddArray(LUT, 255);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int i, j, rvalue, gvalue, bvalue, grayvalue;
double sumR, sumG, sumB, sumGray, numberOfPixels;
double r[256], g[256], b[256], gray[256];
double Dr[256], Dg[256], Db[256], Dgray[256];
TColor color;
for (i=0; i<256; i++)
{
r[i] = 0;
g[i] = 0;
b[i] = 0;
gray[i] = 0;
}
//oblicz dystrybuante
for (i=0; i<ObrazKolorowy->Width; i++)
for (j=0; j<ObrazKolorowy->Height; j++)
{
color = ObrazKolorowy->Canvas->Pixels[i][j];
r[GetRValue(color)]++;
g[GetGValue(color)]++;
b[GetBValue(color)]++;
color = ObrazMono->Canvas->Pixels[i][j];
gray[GetRValue(color)]++;
}
numberOfPixels = (ObrazMono->Width) * (ObrazMono->Height);
sumR = 0;
sumG = 0;
sumB = 0;
sumGray = 0;
for (i=0; i<256; i++)
{
sumR += (r[i]/numberOfPixels);
sumG += (g[i]/numberOfPixels);
sumB += (b[i]/numberOfPixels);
sumGray += (gray[i]/numberOfPixels);
Dr[i] += sumR;
Dg[i] += sumG;
Db[i] += sumB;
Dgray[i] += sumGray;
}
//przelicz tablice LUT, tak by wyrownac histogram
UpdateLUT(Dr, LUTr, 1);
UpdateLUT(Dg, LUTg, 2);
UpdateLUT(Db, LUTb, 3);
UpdateLUT(Dgray, LUTgray, 0);
for (i=0; i<256; i++)
{
r[i] = 0;
g[i] = 0;
b[i] = 0;
gray[i] = 0;
}
for (i=0; i<ObrazKolorowy->Width; i++)
for (j=0; j<ObrazKolorowy->Height; j++)
{
color = ObrazKolorowy->Canvas->Pixels[i][j];
rvalue = GetRValue(color);
gvalue = GetGValue(color);
bvalue = GetBValue(color);
//zmien wartosc wedlug tablicy LUT
color = (TColor)(LUTr[rvalue] +
((int)LUTg[gvalue] << 8) +
((int)LUTb[bvalue] << 16));
//oblicz histogram
WynikKolorowy->Canvas->Pixels[i][j] = color;
r[GetRValue(color)]++;
g[GetGValue(color)]++;
b[GetBValue(color)]++;
}
Histogram1->SeriesList->Series[0]->Clear();
Histogram1->SeriesList->Series[1]->Clear();
Histogram1->SeriesList->Series[2]->Clear();
Histogram1->SeriesList->Series[0]->AddArray(r, 255);
Histogram1->SeriesList->Series[1]->AddArray(g, 255);
Histogram1->SeriesList->Series[2]->AddArray(b, 255);
for (i=0; i<ObrazMono->Width; i++)
for (j=0; j<ObrazMono->Height; j++)
{
color = ObrazMono->Canvas->Pixels[i][j];
grayvalue = GetRValue(color);
//zmien wartosc wedlug tablicy LUT
color = (TColor)(LUTgray[grayvalue] +
((int)LUTgray[grayvalue] << 8) +
((int)LUTgray[grayvalue] << 16));
//oblicz histogram
WynikMono->Canvas->Pixels[i][j] = color;
gray[GetRValue(color)]++;
}
Histogram2->SeriesList->Series[0]->Clear();
Histogram2->SeriesList->Series[0]->AddArray(gray, 255);
}
//---------------------------------------------------------------------------

