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];
}
//---------------------------------------------------------------------------