Frekans Domeni Filtreleme

Ahbap

Harbi Üye
Forum Üyesi
Katılım
29 Mayıs 2019
Mesajlar
8,562
Tepkime puanı
2
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];
}
//---------------------------------------------------------------------------
 

DarK

< MasaLFM.Net >
Forum Üyesi
Katılım
1 Nisan 2019
Mesajlar
620
Tepkime puanı
0
emeğine yüreğine sağlık
 

Nutella

Harbi Üye
Bayan Üye
Özel Üye
Katılım
2 Ocak 2021
Mesajlar
9,432
Tepkime puanı
8
Cinsiyet
  1. Bayan
Takım
Galatasaray
Paylaşım için teşekkürler.
 
İçerik sağlayıcı "paylaşım" sitelerinden biri olan Harbimekan.Com Forum, Eğlence ve Güncel Paylaşım Platformu Adresimizde 5651 Sayılı Kanun’un 8. Maddesine ve T.C.K’nın 125. Maddesine göre TÜM ÜYELERİMİZ yaptıkları paylaşımlardan sorumludur. Harbimekan.Com sitesindeki konular yada mesajlar hakkında yapılacak tüm hukuksal Şikayetler için info@harbimekan.com yada iletişim sayfası üzerinden iletişime geçilmesi halinde ilgili kanunlar ve yönetmelikler çerçevesinde en geç 3 Gün (72 Saat) içerisinde Forum yönetimi olarak tarafımızdan gereken işlemler yapılacaktır.

Bu Site, Bilim ve Sağlık Haber Ajansı Üyesidir.

Yığıntı - 8kez - kaynak mağazam - Uğur Ağdaş