AÇIKLAMA
C++ Builder 6 projesidir.
Resim üzerinde histogram eşitleme ve eşleme işlemlerini gerçekleştirir.
Programın Tamamını Aşağıdaki Linkten İndirebilirsiniz
Program Kodu:
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit1.h" #include <math.h> //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" //Değişken atamaları yapılıyor... TForm1 *Form1; Graphics::TBitmap *pBitmap = new Graphics::TBitmap(); Graphics::TBitmap *pBitmap2 = new Graphics::TBitmap(); int hist[256]; int hist2[256]; double oyf[256]; double odf[256]; double odf2[256]; int donusum[256]; double oyf_desired[256]; double odf_desired[256]; int sayac; double fark; Byte *ptr, *ptr2; //--------------------------------------------------------------------------- // Programın constructor'ı __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- //Resim aç butonuna tıklandığında yapılacak işlemler... void __fastcall TForm1::Button1Click(TObject *Sender) { // Diyalog kutusu ile resim alındı ve değişkenlere atandı OpenPictureDialog1->Execute(); for(int i=0; i<OpenPictureDialog1->Files->Count; i++) { pBitmap->LoadFromFile(OpenPictureDialog1->Files[0].Strings[i]); pBitmap2->LoadFromFile(OpenPictureDialog1->Files[0].Strings[i]); } // hist dizisinin içeriği 0'landı. for(int i=0; i<256; i++) hist[i]=0; // Resim okunarak resim gri seviyeye dönüştürüldü ve histogramı belirlendi for (int i=0; i<pBitmap->Height; i++) { ptr = (Byte *)pBitmap->ScanLine[i]; for (int j=0; j<pBitmap->Width; j++) { hist[(int)(ptr[j*3]*0.11+ptr[j*3+1]*0.59+ptr[j*3+2]*0.30)]++; ptr[j*3]=ptr[j*3+1]=ptr[j*3+2]=(int)(ptr[j*3]*0.11+ptr[j*3+1]*0.59+ptr[j*3+2]*0.30); } } Image1->Width=pBitmap->Width; Image1->Height=pBitmap->Height; Image1->Picture->Assign(pBitmap); // oyf hesaplandı ve ekrana histogram çizdirildi Chart1->Series[0]->Clear(); for(int i=0; i<256; i++) { oyf[i]=(double)hist[i]/(pBitmap->Width*pBitmap->Height); Chart1->Series[0]->AddXY(i, hist[i], "", clRed); } // olasılık dağılım fonk. hesaplandı ve ekrana çizdirildi Chart4->Series[0]->Clear(); odf[0]=oyf[0]; for(int i=1; i<256; i++) { odf[i]=oyf[i]+odf[i-1]; Chart4->Series[0]->AddXY(i, odf[i], "", clGreen); } } //--------------------------------------------------------------------------- //Uygula butonuna tıklandığında yapılacak işlemler void __fastcall TForm1::Button2Click(TObject *Sender) { // ön setlemeler (temizleme işlemleri) Chart2->Series[0]->Clear(); Chart5->Series[0]->Clear(); Chart3->Series[0]->Clear(); Chart6->Series[0]->Clear(); for(int i=0; i<256; i++) hist2[i]=0; if(ComboBox1->ItemIndex==0) //Histogram Equalization yapılacaksa { // gerekli dönüşüm işlemi dönüşüm isimli lookup table'da tutuluyor ve ekrana istenilen histogram ile odf. çizdiriliyor for(int i=0; i<256; i++) { Chart2->Series[0]->AddXY(i, pBitmap->Width*pBitmap->Height/256, "", clRed); Chart5->Series[0]->AddXY(i, (double)(i+1)/256.0, "", clGreen); } } else //Histogram Matching yapılacaksa { sayac=0; for(int i=0; i<256; i++) { // İstenilen olasılık dağılım fonk. hesaplanıyor ve resmin odf ile karşılaştırılıyor fark=odf[i]-odf_desired[sayac]; for(int j=sayac+1; j<256; j++) { { fark=odf[i]-odf_desired[j]; sayac=j; } else break; } // dönüşüm lookup table'ı oluşturuluyor ve ekrana istenilen histogram ile odf. çizdiriliyor donusum[i]=sayac; Chart2->Series[0]->AddXY(i, (double)(i+1)/256.0*pBitmap->Width*pBitmap->Height, "", clRed); Chart5->Series[0]->AddXY(i, odf_desired[i], "", clGreen); } } //donusum lookup tanle'ına göre dönüşüm gerçekleştiriliyor ve oluşan görüntünün histogramı hesaplanıyor for (int i=0; i<pBitmap->Height; i++) { ptr = (Byte *)pBitmap->ScanLine[i]; ptr2= (Byte *)pBitmap2->ScanLine[i]; for (int j=0; j<pBitmap->Width; j++) { ptr2[j*3]=ptr2[j*3+1]=ptr2[j*3+2]=donusum[ptr[j*3]]; hist2[ptr2[j*3]]++; } } // oluşan görüntünün odf. hesaplanıyor odf2[0]=(double)hist2[0]/(double)(pBitmap->Width*pBitmap->Height); for(int i=1; i<256; i++) odf2[i]=odf2[i-1]+(double)hist2[i]/(double)(pBitmap->Width*pBitmap->Height); // oluşan görüntünün histogramı ile odf çizdiriliyor for(int i=0; i<256; i++) { Chart3->Series[0]->AddXY(i, hist2[i], "", clBlue); Chart6->Series[0]->AddXY(i, odf2[i], "", clBlue); } // Görüntüler ekrana yansıtılıyor Image2->Width=pBitmap2->Width; Image2->Height=pBitmap2->Height; Image2->Picture->Assign(pBitmap2); } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { // hist. matching'de istenilen oyf ve odf. sabit olduğundan sadece form oluşturuluyorken hesaplanıyor for(int i=0; i<256; i++) oyf_desired[i]=(double)((double)i)/(255*128); odf_desired[0]=oyf_desired[0]; for(int i=1; i<256; i++) odf_desired[i]=oyf_desired[i]+odf_desired[i-1]; } //---------------------------------------------------------------------------
| Yorumlar |
|
Powered by !JoomlaComment 3.26

