Frekans Domeni Filtreleme

DrogbA

Forum Üyesi
Katılım
27 Ara 2020
Mesajlar
3,440
Tepkime puanı
0
Puanları
36
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:
//---------------------------------------------------------------------------
 
#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];
}
//---------------------------------------------------------------------------
 

Nutella

Bayan Üye
Özel Üye
Katılım
2 Ocak 2021
Mesajlar
3,559
Tepkime puanı
0
Puanları
36
Cinsiyet
  1. Bayan
Takım
Galatasaray
Paylaşım için teşekkürler.
 
metal işleme
Üst