Nadesłany przez Tomasz Lubiński, 13 września 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 - rozciaganie/Unit1.cpp:
//Histogram - rozciąganie histogramu //(c) 2005 Tomasz Lubinski //www.algorytm.org //--------------------------------------------------------------------------- #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]; //--------------------------------------------------------------------------- //zmień wartosc jasnosci i kontrastu //przelicz nowe wartosci tablicy LUT //wyswietl wartosci tablicy LUT void TForm1::UpdateLUT(double a, int b, double *LUT, int series) { int i; for (i=0; i<256; i++) if ((a*(i+b)) > 255) LUT[i] = 255; else if ((a*(i+b)) < 0) LUT[i] = 0; else LUT[i] = (a*(i+b)); 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; int rmin, gmin, bmin, graymin, rmax, gmax, bmax, graymax; double r[256], g[256], b[256], gray[256]; TColor color; for (i=0; i<256; i++) { r[i] = 0; g[i] = 0; b[i] = 0; gray[i] = 0; } //znajdz minimum i maksimum kazdej skladowej rmin = 255; gmin = 255; bmin = 255; graymin = 255; rmax = 1; gmax = 1; bmax = 1; graymax = 1; 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); if (rvalue > rmax) rmax = rvalue; if (gvalue > gmax) gmax = gvalue; if (bvalue > bmax) bmax = bvalue; if (rvalue < rmin) rmin = rvalue; if (gvalue < gmin) gmin = gvalue; if (bvalue < bmin) bmin = bvalue; } for (i=0; i<ObrazMono->Width; i++) for (j=0; j<ObrazMono->Height; j++) { color = ObrazMono->Canvas->Pixels[i][j]; grayvalue = GetRValue(color); if (grayvalue > graymax) graymax = grayvalue; if (grayvalue < graymin) graymin = grayvalue; } //przelicz tablice LUT, tak by rozciagnac histogram UpdateLUT(255.0/(rmax-rmin), -rmin, LUTr, 1); UpdateLUT(255.0/(gmax-gmin), -gmin, LUTg, 2); UpdateLUT(255.0/(bmax-bmin), -bmin, LUTb, 3); UpdateLUT(255.0/(graymax-graymin), -graymin, LUTgray, 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<ObrazKolorowy->Width; i++) for (j=0; j<ObrazKolorowy->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); } //---------------------------------------------------------------------------