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