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); } //---------------------------------------------------------------------------