AÇIKLAMA
C++ Builder 6 projesidir.
Resim işleme ve filtre uygulama konusunda ayarlanan filtreyi resime uygular. Resim işleme konusunda örnek teşkil eder. Program içindeki ayarlara göre Alçak yada Yüksek Geçiren filtreyi resime uygular.
Programın Tamamını Aşağıdaki Linkten İndirebilirsiniz
Program Kodu:
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit1.h" #include <math.h> #include <jpeg.hpp> #include "Mixfft.c" //--------------------------------------------------------------------------- #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(); Graphics::TBitmap *pBitmap3 = new Graphics::TBitmap(); TJPEGImage *jp = new TJPEGImage(); Byte *ptr, *ptr2; double **resim, **resim_imag, **resim2, **resim2_imag; void fft(int n,double are[],double aim[],double bre[],double bim[]); double **Huv, maks1, min1; double **resim_filtered_fft, **resim_filtered_fft_imag, **resim_filtered, **resim_filtered_imag; int en, boy; //--------------------------------------------------------------------------- // 2-D FFT kodu (Tek boyutlu FFT yardımıyla oluşturuldu). void Mat_FFT2(double **Output_real, double **Output_imag, double **Input_real, double **Input_imag, int width, int height) { int i, j; double *T_re, *T_im, *R_re, *R_im; T_re=new double[height]; T_im=new double[height]; R_re=new double[height]; R_im=new double[height]; for(i=0; i<height; i++) fft(width, Input_real[i], Input_imag[i], Output_real[i], Output_imag[i]); for(i=0; i<width; i++) { for(j=0; j<height; j++) { T_re[j] = Output_real[j][i]; T_im[j] = Output_imag[j][i]; } fft(height, T_re, T_im, R_re, R_im); for(j=0; j<height; j++) { Output_real[j][i] = R_re[j]; Output_imag[j][i] = R_im[j]; } } delete[] T_re; delete[] T_im; delete[] R_re; delete[] R_im; } //--------------------------------------------------------------------------- // Inverse FFT kodu void Mat_IFFT2(double **Output_real, double **Output_imag, double **Input_real, double **Input_imag, int width, int height) { int i, j; double *T_re, *T_im, *R_re, *R_im; T_re=new double[height]; T_im=new double[height]; R_re=new double[height]; R_im=new double[height]; for(i=0; i<height; i++) ifft(width, Input_real[i], Input_imag[i], Output_real[i], Output_imag[i]); for(i=0; i<width; i++) { for(j=0; j<height; j++) { T_re[j] = Output_real[j][i]; T_im[j] = Output_imag[j][i]; } ifft(height, T_re, T_im, R_re, R_im); for(j=0; j<height; j++) { Output_real[j][i] = R_re[j]; Output_imag[j][i] = R_im[j]; } } delete[] T_re; delete[] T_im; delete[] R_re; delete[] R_im; } //--------------------------------------------------------------------------- // 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ı OpenDialog1->Execute(); double deger, temp; maks1=-1000000000; min1=1000000000; //resimle ilgili oluşturulan matrislerin bellekte tutulduğu yerler serbest bırakılıyor for(int i=0; i<boy; i++) delete[] resim[i]; delete[] resim; for(int i=0; i<boy; i++) delete[] resim_imag[i]; delete[] resim_imag; for(int i=0; i<boy; i++) delete[] resim2[i]; delete[] resim2; for(int i=0; i<boy; i++) delete[] resim2_imag[i]; delete[] resim2_imag; for(int i=0; i<boy; i++) delete[] Huv[i]; delete[] Huv; for(int i=0; i<boy; i++) delete[] resim_filtered_fft[i]; delete[] resim_filtered_fft; for(int i=0; i<boy; i++) delete[] resim_filtered_fft_imag[i]; delete[] resim_filtered_fft_imag; for(int i=0; i<boy; i++) delete[] resim_filtered[i]; delete[] resim_filtered; for(int i=0; i<boy; i++) delete[] resim_filtered_imag[i]; delete[] resim_filtered_imag; // Resim açılıyor (jpg resimler de destekleniyor) for(int i=0; i<OpenDialog1->Files->Count; i++) { //açılan dosya jpg mi, bmp mi? if(OpenDialog1->FileName.SubString(OpenDialog1->FileName.Length()-2,3)=="jpg") { // jpeg ise TJPEGImage yapısı ile okunuyor be bmp'e atanıyor jp->LoadFromFile(OpenDialog1->Files[0].Strings[i]); pBitmap->Assign(jp); pBitmap2->Assign(jp); } else { pBitmap->LoadFromFile(OpenDialog1->Files[0].Strings[i]); pBitmap2->LoadFromFile(OpenDialog1->Files[0].Strings[i]); } // Açılan resimlerin 8 bit olması durumunda, yapılacak okumanın doğru olması için pBitmap->PixelFormat=pf24bit; pBitmap2->PixelFormat=pf24bit; en=pBitmap->Width; boy=pBitmap->Height; } // Matrisler için gerekli bellek tahsisi yapılıyor resim=new double*[boy]; for(int i=0; i<boy; i++) resim[i]=new double[en]; resim_imag=new double*[boy]; for(int i=0; i<boy; i++) resim_imag[i]=new double[en]; resim2=new double*[boy]; for(int i=0; i<boy; i++) resim2[i]=new double[en]; resim2_imag=new double*[boy]; for(int i=0; i<boy; i++) resim2_imag[i]=new double[en]; Huv=new double*[boy]; for(int i=0; i<boy; i++) Huv[i]=new double[en]; resim_filtered_fft=new double*[boy]; for(int i=0; i<boy; i++) resim_filtered_fft[i]=new double[en]; resim_filtered_fft_imag=new double*[boy]; for(int i=0; i<boy; i++) resim_filtered_fft_imag[i]=new double[en]; resim_filtered=new double*[boy]; for(int i=0; i<boy; i++) resim_filtered[i]=new double[en]; resim_filtered_imag=new double*[boy]; for(int i=0; i<boy; i++) resim_filtered_imag[i]=new double[en]; // Resim okunarak gri seviyeye dönüştürüldü ve frekans domeninde ortalanması için (-1)^(x+y) ile çarpılıyor for (int i=0; i<boy; i++) { ptr = (Byte *)pBitmap->ScanLine[i]; for (int j=0; j<en; j++) { resim[i][j]=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); resim_imag[i][j]=0; resim2_imag[i][j]=0; } } // Açılan resim dosyası ekranda gösteriliyor Image1->Width=en; Image1->Height=boy; Image1->Picture->Assign(pBitmap); // Resmin FFT'si alınıyor Mat_FFT2(resim2, resim2_imag, resim, resim_imag, en, boy); //Resimin fftsinin doğal logaritması 0-255 arasına açılarak ekrana basılıyor for (int i=0; i<boy; i++) { ptr = (Byte *)pBitmap->ScanLine[i]; for (int j=0; j<en; j++) { if(deger>maks1) maks1=deger; if(deger<min1) min1=deger; } } for (int i=0; i<boy; i++) { ptr = (Byte *)pBitmap->ScanLine[i]; for (int j=0; j<en; j++) { ptr[j*3]=deger; ptr[j*3+1]=deger; ptr[j*3+2]=deger; } } // Resmin FFT'si ekrana basılıyor. pBitmap2->Assign(pBitmap); Image2->Width=en; Image2->Height=boy; Image2->Picture->Assign(pBitmap); } //--------------------------------------------------------------------------- //Uygula butonuna tıklandığında yapılacak işlemler void __fastcall TForm1::Button2Click(TObject *Sender) { int yaricap=StrToInt(Edit1->Text); int filtre_tipi=0; double n_degeri; // Filtrenin türü belirleniyor (alçak geçiren ya da yüksek geçiren) filtre_tipi=ComboBox2->ItemIndex; // H(u,v) filtresi oluşturuluyor... if(ComboBox1->ItemIndex==0) //Ideal Filtering yapılacaksa { for (int i=0; i<boy; i++) { ptr = (Byte *)pBitmap->ScanLine[i]; for (int j=0; j<en; j++) { { Huv[i][j]=1-filtre_tipi; } else { Huv[i][j]=0+filtre_tipi; } ptr[j*3]=ptr[j*3+1]=ptr[j*3+2]=Huv[i][j]*255; } } } if(ComboBox1->ItemIndex==1) //Butterworth Filtering yapılacaksa { n_degeri=Edit2->Text.ToDouble(); for (int i=0; i<boy; i++) { ptr = (Byte *)pBitmap->ScanLine[i]; for (int j=0; j<en; j++) { ptr[j*3]=ptr[j*3+1]=ptr[j*3+2]=Huv[i][j]*255; } } } if(ComboBox1->ItemIndex==2) //Gaussian Filtering yapılacaksa { for (int i=0; i<boy; i++) { ptr = (Byte *)pBitmap->ScanLine[i]; for (int j=0; j<en; j++) { Huv[i][j]=fabs(filtre_tipi-exp(-((i-boy/2)*(i-boy/2)+(j-en/2)*(j-en/2))/(double)(2*yaricap*yaricap))); ptr[j*3]=ptr[j*3+1]=ptr[j*3+2]=Huv[i][j]*255; } } } // Filtre görüntüleri ekrana yansıtılıyor Image3->Width=en; Image3->Height=boy; Image3->Picture->Assign(pBitmap); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button3Click(TObject *Sender) { double deger; byte eklenecek; // resmin fft'si filtre ile çarpılıyor... for (int i=0; i<boy; i++) { ptr = (Byte *)pBitmap2->ScanLine[i]; for (int j=0; j<en; j++) { resim_filtered_fft[i][j]=Huv[i][j]*resim2[i][j]; resim_filtered_fft_imag[i][j]=Huv[i][j]*resim2_imag[i][j]; } } // Zaman domenine geçiliyor Mat_IFFT2(resim_filtered, resim_filtered_imag, resim_filtered_fft, resim_filtered_fft_imag, en, boy); // Eğer yüksek geçiren filtre ise görüntüye 128 ekleniyor (daha iyi gözükmesi için) if(ComboBox2->ItemIndex==1) eklenecek=128; else eklenecek=0; // Filtrelenmiş görüntü ekrana basılıyor for (int i=0; i<boy; i++) { ptr = (Byte *)pBitmap2->ScanLine[i]; for (int j=0; j<en; j++) { deger+=eklenecek; if(deger>255) deger=255; if(deger<0) deger=0; ptr[j*3]=deger; ptr[j*3+1]=deger; ptr[j*3+2]=deger; } } Image4->Width=pBitmap2->Width; Image4->Height=pBitmap2->Height; Image4->Picture->Assign(pBitmap2); } //--------------------------------------------------------------------------- void __fastcall TForm1::ComboBox1Change(TObject *Sender) { // eğer butterworth filtresi seçilmiş ise n değeri de kullanıcıdan girilebilecek if(ComboBox1->ItemIndex==1) { Label2->Visible=true; Edit2->Visible=true; } else { Label2->Visible=false; Edit2->Visible=false; } } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { // başlangıç ayarları yapılıyor... en=boy=1; resim=new double*[1]; for(int i=0; i<1; i++) resim[i]=new double[1]; resim_imag=new double*[1]; for(int i=0; i<1; i++) resim_imag[i]=new double[1]; resim2=new double*[1]; for(int i=0; i<1; i++) resim2[i]=new double[1]; resim2_imag=new double*[1]; for(int i=0; i<1; i++) resim2_imag[i]=new double[1]; Huv=new double*[1]; for(int i=0; i<1; i++) Huv[i]=new double[1]; resim_filtered_fft=new double*[1]; for(int i=0; i<1; i++) resim_filtered_fft[i]=new double[1]; resim_filtered_fft_imag=new double*[1]; for(int i=0; i<1; i++) resim_filtered_fft_imag[i]=new double[1]; resim_filtered=new double*[1]; for(int i=0; i<1; i++) resim_filtered[i]=new double[1]; resim_filtered_imag=new double*[1]; for(int i=0; i<1; i++) resim_filtered_imag[i]=new double[1]; } //---------------------------------------------------------------------------
| Yorumlar |
|
Powered by !JoomlaComment 3.26

