Nadesłany przez Tomasz Lubiński, 27 sierpnia 2008 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 - ekspozycja/Unit1.cpp:
//Histogram - zmiana ekspozycji //(c) 2008 Tomasz Lubinski //www.algorytm.org //--------------------------------------------------------------------------- #include <vcl.h> #include <math.h> #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- double LUT[256]; //--------------------------------------------------------------------------- //wyswietl wartosci tablicy LUT void TForm1::UpdateLUT() { Chart3->SeriesList->Series[0]->Clear(); Chart3->SeriesList->Series[0]->AddArray(LUT, 255); } //--------------------------------------------------------------------------- //zmień wartosc kontrastu i przelicz nowe wartosci tablicy LUT void __fastcall TForm1::UpDown1Click(TObject *Sender, TUDBtnType Button) { int i; double a; a = StrToFloat(Edit1->Text); if (Button == btNext) a += 0.05; else a -= 0.05; if (a < 0.05) a = 0.05; Edit1->Text = FloatToStr(a); for (i=0; i<256; i++) if ((a*i) > 255) LUT[i] = 255; else LUT[i] = a*i; UpdateLUT(); } //--------------------------------------------------------------------------- //zainicjuj tablice LUT void __fastcall TForm1::FormCreate(TObject *Sender) { int i; for (i=0; i<256; i++) LUT[i] = i; UpdateLUT(); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { int i, j, rvalue, gvalue, bvalue, grayvalue; 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; } 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)(LUT[rvalue] + ((int)LUT[gvalue] << 8) + ((int)LUT[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) LUT[grayvalue] + ((int)LUT[grayvalue] << 8) + ((int)LUT[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); } //---------------------------------------------------------------------------