IRCForumları - IRC ve mIRC Kullanıcılarının Buluşma Noktası
  sohbet

Yeni Konu aç Cevapla
 
LinkBack Seçenekler Stil
Alt 11 Temmuz 2014, 10:17   #1
Çevrimdışı
Kullanıcıların profil bilgileri misafirlere kapatılmıştır.
IF Ticaret Sayısı: (0)
IF Ticaret Yüzdesi:(%)
Frekans Domeni Filtreleme




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.

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
//--------------------------------------------------------------------------- #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[i][j]*=pow(-1,(i+j)); 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++) { deger=log(0.05+sqrt(resim2[i][j]*resim2[i][j]+resim2_imag[i][j]*resim2_imag[i][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++) { deger=(log(0.05+sqrt(resim2[i][j]*resim2[i][j]+resim2_imag[i][j]*resim2_imag[i][j]))-min1)/(maks1-min1)*255; 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++) { if(sqrt((i-boy/2)*(i-boy/2)+(j-en/2)*(j-en/2))<yaricap) { 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++) { Huv[i][j]=fabs(filtre_tipi-1/(1+pow(sqrt((i-boy/2)*(i-boy/2)+(j-en/2)*(j-en/2))/yaricap,2*n_degeri))); 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=resim_filtered[i][j]*pow(-1,i+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]; } //---------------------------------------------------------------------------


 
Alıntı ile Cevapla

IRCForumlari.NET Reklamlar
sohbet odaları sohbet odaları Benimmekan Mobil Sohbet
Cevapla

Etiketler
domeni, filtreleme, frekans


Konuyu Toplam 1 Üye okuyor. (0 Kayıtlı üye ve 1 Misafir)
 
Seçenekler
Stil

Yetkileriniz
Konu Acma Yetkiniz Yok
Cevap Yazma Yetkiniz Yok
Eklenti Yükleme Yetkiniz Yok
Mesajınızı Değiştirme Yetkiniz Yok

BB code is Açık
Smileler Açık
[IMG] Kodları Açık
HTML-Kodu Kapalı
Trackbacks are Kapalı
Pingbacks are Açık
Refbacks are Açık


Benzer Konular
Konu Konuyu Başlatan Forum Cevaplar Son Mesaj
Tempshunda nick filtreleme asuss Unreal IRCd 2 04 Haziran 2014 23:28
Dil Filtreleme DaDaS CR Makaleler 0 14 Ocak 2012 23:03
Paket Filtreleme uLas Ağ, Network ve Networking 0 13 Eylül 2009 18:17
reklam engelelme cümle filtreleme kurugaddere mIRC Scripting Sorunları 4 25 Haziran 2009 00:58
İçerik Filtreleme Uygulaması Julw Bilgisayar Donanımı 0 06 Kasım 2007 12:30