Implementasi Dan Perbandingan Optimum Notch Filter Dan Band Reject Filter Untuk Mereduksi Periodic Noise Pada Citra Digital
LISTING PROGRAM
1.
Form Pengujian ONF dan BRF
using System;
using System.Collections.Generic; using System.ComponentModel; using System.Data;
using System.Drawing;
using System.Drawing.Imaging; using System.Linq;
using System.Text;
using System.Threading.Tasks; using System.Windows.Forms; namespace SelectiveFilter2 {
public partial class Form1 : Form {
double waktu = 0.0; bool noise;
int[,] dataA; int[,] dataB; struct COMPLEX {
public double real, imag;
public COMPLEX(double x, double y) {
real = x; imag = y; }
public float Magnitude() {
return ((float)Math.Sqrt(real * real + imag * imag)); }
public float Phase() {
return ((float)Math.Atan(imag / real)); }
}
byte[,] r_data; byte[,] g_data; byte[,] b_data; FFT ImgFFT; public Form1() {
InitializeComponent(); }
private void bukaGambarToolStripMenuItem_Click(object sender, EventArgs e)
(2)
openFileDialog.InitialDirectory = "";
openFileDialog.Filter = "Bitmap files(*.bmp)|*.bmp|Jpeg Files(*.jpg)|*.jpg|All valid files " +
"(*.bmp/*.jpg)|*.bmp/*.jpg"; openFileDialog.FilterIndex = 2;
openFileDialog.RestoreDirectory = true;
if (DialogResult.OK == openFileDialog.ShowDialog()) {
this.AutoScroll = true; this.citraAsli.Image = new Bitmap(openFileDialog.FileName);
this.Invalidate();
Bitmap b = new Bitmap((Bitmap)this.citraAsli.Image); dataA = new int[b.Height,b.Height];
dataB = new int[b.Height,b.Height]; if (b.Width == b.Height)
{
LL.Text = b.Width.ToString(); TT.Text = b.Height.ToString(); noise = false;
BitmapData bmdata = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadWrite,
PixelFormat.Format24bppRgb); int stride = bmdata.Stride;
System.IntPtr Scan0 = bmdata.Scan0; unsafe
{
byte* p = (byte*)(void*)Scan0; int nOffset = stride - b.Width * 3; r_data = new byte[b.Width, b.Height]; g_data = new byte[b.Width, b.Height]; b_data = new byte[b.Width, b.Height]; for (int y = 0; y < b.Height; ++y) {
for (int x = 0; x < b.Width; ++x) {
b_data[x, y] = p[0]; g_data[x, y] = p[1]; r_data[x, y] = p[2]; p += 3;
}
p += nOffset; }
}
Bitmap Is = new Bitmap((Bitmap)this.citraAsli.Image);
Sinu_noise periodik = new Sinu_noise(Is); periodik.Period = 200;
(3)
citraNoise.Image = periodik.ResultImage; Bitmap Is4 = new
Bitmap((Bitmap)this.citraAsli.Image);
selectiveFilter.CitraAbu2(Is4); Citra_Gray.Image = null;
Citra_Gray.Image = Is4;
for (int i = 0; i < dataA.GetLength(1); i++) {
for (int j = 0; j < dataA.GetLength(1); j++) {
dataA[i, j] = Is4.GetPixel(i, j).R; }
}
Bitmap Is2 = new Bitmap((Bitmap)this.citraNoise.Image);
selectiveFilter.CitraAbu2(Is2); citraAbu.Image = null;
citraAbu.Image = Is2; Bitmap Is3 = new Bitmap((Bitmap)this.citraAbu.Image);
ImgFFT = new FFT(Is3); ImgFFT.ForwardFFT(); ImgFFT.FFTShift();
ImgFFT.FFTPlot(ImgFFT.FFTShifted);
citraSpektrum.Image = (Image)ImgFFT.FourierPlot; Bitmap aa = new
Bitmap((Bitmap)this.Citra_Gray.Image); Bitmap bb = new Bitmap((Bitmap)this.citraAbu.Image); }
else {
citraAsli.Image = null;
MessageBox.Show("Lebar dan Tinggi gambar harus sama!", "Gagal", MessageBoxButtons.OK, MessageBoxIcon.Error); }
} }
private void simpanGambarToolStripMenuItem_Click(object sender, EventArgs e)
{
Application.Exit(); }
private void groupBox2_Enter(object sender, EventArgs e) {
(4)
private void button1_Click(object sender, EventArgs e) {
if ((citraAsli.Image != null) ||(citraAbu.Image!=null)) {
DateTime satu, dua; double W, D0, n;
if ((W1.Text != "") || (D01.Text != "") || (n1.Text != ""))
{
try {
W = Convert.ToDouble(W1.Text); D0 = Convert.ToDouble(D01.Text); n = Convert.ToDouble(n1.Text); Bitmap Is3 = new
Bitmap((Bitmap)this.citraAbu.Image);
ImgFFT = new FFT(Is3); satu = DateTime.Now; ImgFFT.ForwardFFT(); ImgFFT.FFTShift();
ImgFFT.FFTPlot(ImgFFT.FFTShifted); citraSpektrum.Image =
(Image)ImgFFT.FourierPlot;
ImgFFT.RemoveFFTShift();
double[,] a = new double[ImgFFT.Obj.Width, ImgFFT.Obj.Height];
selectiveFilter.Band_Reject(a, W, D0, ImgFFT.Obj.Width, ImgFFT.Obj.Height, 1, (int)n);
for (int p = 0; p < 5; p++) {
for (int v = 0; v < ImgFFT.Obj.Height; v++)
{
for (int u = 0; u < ImgFFT.Obj.Width; u++)
{
ImgFFT.FFTNormal[u, v].real *= a[u, v];
ImgFFT.Output[u, v].real = ImgFFT.FFTNormal[u, v].real;
ImgFFT.FFTNormal[u, v].imag *= a[u, v];
ImgFFT.Output[u, v].imag = ImgFFT.FFTNormal[u, v].imag;
} } }
ImgFFT.RemoveFFTShift(); ImgFFT.InverseFFT(); dua = DateTime.Now;
(5)
BR_ideal.Image = (Image)ImgFFT.Obj; Bitmap bb;
if (noise == false) {
bb= new Bitmap((Bitmap)this.BR_ideal.Image);
for (int i = 0; i < dataB.GetLength(1); i++)
{
for (int j = 0; j < dataB.GetLength(1); j++)
{
dataB[i, j] = bb.GetPixel(i, j).R;
} }
MSE1.Text = MSEPSNR.HitungMSE2(dataA, dataB).ToString();
PSNR1.Text =
MSEPSNR.HitungPSNR(Convert.ToDouble(MSE1.Text)).ToString(); RT1.Text =
(seli.TotalMilliseconds).ToString(); }
satu = DateTime.Now; ImgFFT = new FFT(Is3); ImgFFT.ForwardFFT(); ImgFFT.FFTShift();
ImgFFT.FFTPlot(ImgFFT.FFTShifted); citraSpektrum.Image =
(Image)ImgFFT.FourierPlot;
ImgFFT.RemoveFFTShift();
selectiveFilter.Band_Reject(a, W, D0, ImgFFT.Obj.Width, ImgFFT.Obj.Height, 2, (int)n);
for (int p = 0; p < 1; p++) {
for (int v = 0; v < ImgFFT.Obj.Height; v++)
{
for (int u = 0; u < ImgFFT.Obj.Width; u++)
{
ImgFFT.FFTNormal[u, v].real *= a[u, v];
ImgFFT.Output[u, v].real = ImgFFT.FFTNormal[u, v].real;
ImgFFT.FFTNormal[u, v].imag *= a[u, v];
ImgFFT.Output[u, v].imag = ImgFFT.FFTNormal[u, v].imag;
} } }
(6)
ImgFFT.RemoveFFTShift(); ImgFFT.InverseFFT(); dua = DateTime.Now;
BR_B.Image = (Image)ImgFFT.Obj; if (noise == false)
{
bb = new Bitmap((Bitmap)this.BR_B.Image); for (int i = 0; i < dataB.GetLength(1); i++)
{
for (int j = 0; j < dataB.GetLength(1); j++)
{
dataB[i, j] = bb.GetPixel(i, j).R;
} }
MSE2.Text = MSEPSNR.HitungMSE2(dataA, dataB).ToString();
PSNR2.Text =
MSEPSNR.HitungPSNR(Convert.ToDouble(MSE2.Text)).ToString(); seli = dua.Subtract(satu); RT2.Text =
(seli.TotalMilliseconds).ToString(); }
satu = DateTime.Now; ImgFFT = new FFT(Is3); ImgFFT.ForwardFFT(); ImgFFT.FFTShift();
ImgFFT.FFTPlot(ImgFFT.FFTShifted); citraSpektrum.Image =
(Image)ImgFFT.FourierPlot;
ImgFFT.RemoveFFTShift();
selectiveFilter.Band_Reject(a, W, D0, ImgFFT.Obj.Width, ImgFFT.Obj.Height, 3, (int)n);
for (int p = 0; p < 8; p++) {
for (int v = 0; v < ImgFFT.Obj.Height; v++)
{
for (int u = 0; u < ImgFFT.Obj.Width; u++)
{
ImgFFT.FFTNormal[u, v].real *= a[u, v];
ImgFFT.Output[u, v].real = ImgFFT.FFTNormal[u, v].real;
ImgFFT.FFTNormal[u, v].imag *= a[u, v];
ImgFFT.Output[u, v].imag = ImgFFT.FFTNormal[u, v].imag;
} }
(7)
}
ImgFFT.RemoveFFTShift(); ImgFFT.InverseFFT(); dua = DateTime.Now;
BR_G.Image = (Image)ImgFFT.Obj; if (noise == false)
{
bb = new Bitmap((Bitmap)this.BR_G.Image); for (int i = 0; i < dataB.GetLength(1); i++)
{
for (int j = 0; j < dataB.GetLength(1); j++)
{
dataB[i, j] = bb.GetPixel(i, j).R;
} }
MSE3.Text = MSEPSNR.HitungMSE2(dataA, dataB).ToString();
PSNR3.Text =
MSEPSNR.HitungPSNR(Convert.ToDouble(MSE3.Text)).ToString(); seli = dua.Subtract(satu); RT3.Text =
(seli.TotalMilliseconds).ToString(); }
MessageBox.Show("Proses Filter selesai, tekan tombol simpan untuk menyimpan gambar", "Sukses",
MessageBoxButtons.OK, MessageBoxIcon.Information); }
catch (Exception ex) {
MessageBox.Show("Masukkan angka, bukan Huruf", "GAGAL!", MessageBoxButtons.OK, MessageBoxIcon.Error); }
} } }
private void button2_Click(object sender, EventArgs e) {
if ((citraAsli.Image != null) || (citraAbu.Image != null))
{
double D0, n;
DateTime satu, dua; int x1x, x2x, y1y, y2y;
if ((DO2.Text != "") || (n2.Text != "") || (x1.Text != "") || (x2.Text != "") || (y1.Text != "") || (y2.Text != "")) {
try {
D0 = Convert.ToDouble(DO2.Text); n = Convert.ToDouble(n2.Text);
(8)
x1x = Convert.ToInt32(x1.Text); x2x = Convert.ToInt32(x2.Text); y1y = Convert.ToInt32(y1.Text); y2y = Convert.ToInt32(y2.Text); Bitmap Is3 = new
Bitmap((Bitmap)this.citraAbu.Image);
satu = DateTime.Now; ImgFFT = new FFT(Is3); ImgFFT.ForwardFFT(); ImgFFT.FFTShift();
ImgFFT.FFTPlot(ImgFFT.FFTShifted); citraSpektrum.Image =
(Image)ImgFFT.FourierPlot;
double[,] a = new double[ImgFFT.Obj.Width, ImgFFT.Obj.Height];
int[,] K = { { x1x, y1y }, { x2x, y2y } }; selectiveFilter.Optimum_notch(a, K, D0, ImgFFT.Obj.Width, ImgFFT.Obj.Height, 1, (int)n);
ImgFFT.RemoveFFTShift(); for (int p = 0; p < 1; p++) {
for (int v = 0; v < ImgFFT.Obj.Height; v++)
{
for (int u = 0; u < ImgFFT.Obj.Width; u++)
{
//MessageBox.Show(a[u, v].ToString());
ImgFFT.FFTNormal[u, v].real *= a[u, v];
ImgFFT.Output[u, v].real = ImgFFT.FFTNormal[u, v].real;
ImgFFT.FFTNormal[u, v].imag *= a[u, v];
ImgFFT.Output[u, v].imag = ImgFFT.FFTNormal[u, v].imag;
} } }
ImgFFT.RemoveFFTShift(); ImgFFT.InverseFFT(); dua = DateTime.Now; TimeSpan seli;
ONF_I.Image = (Image)ImgFFT.Obj; Bitmap bb;
if (noise == false) {
bb = new Bitmap((Bitmap)this.ONF_I.Image);
for (int i = 0; i < dataB.GetLength(1); i++)
(9)
for (int j = 0; j < dataB.GetLength(1); j++)
{
dataB[i, j] = bb.GetPixel(i, j).R;
} }
MSE4.Text = MSEPSNR.HitungMSE2(dataA, dataB).ToString();
PSNR4.Text =
MSEPSNR.HitungPSNR(Convert.ToDouble(MSE4.Text)).ToString(); seli = dua.Subtract(satu); RT4.Text =
(seli.TotalMilliseconds).ToString(); }
satu = DateTime.Now; ImgFFT = new FFT(Is3); ImgFFT.ForwardFFT(); ImgFFT.FFTShift();
ImgFFT.FFTPlot(ImgFFT.FFTShifted); citraSpektrum.Image =
(Image)ImgFFT.FourierPlot;
double[,] a1 = new double[ImgFFT.Obj.Width, ImgFFT.Obj.Height];
int[,] K1 = { { x1x, y1y }, { x2x, y2y } }; selectiveFilter.Optimum_notch(a1, K1, D0, ImgFFT.Obj.Width, ImgFFT.Obj.Height, 2, (int)n);
ImgFFT.RemoveFFTShift(); for (int p = 0; p < 1; p++) {
for (int v = 0; v < ImgFFT.Obj.Height; v++)
{
for (int u = 0; u < ImgFFT.Obj.Width; u++)
{
//MessageBox.Show(a[u, v].ToString());
ImgFFT.FFTNormal[u, v].real *= a1[u, v];
ImgFFT.Output[u, v].real = ImgFFT.FFTNormal[u, v].real;
ImgFFT.FFTNormal[u, v].imag *= a1[u, v];
ImgFFT.Output[u, v].imag = ImgFFT.FFTNormal[u, v].imag;
} } }
ImgFFT.RemoveFFTShift(); ImgFFT.InverseFFT(); dua = DateTime.Now;
ONF_B.Image = (Image)ImgFFT.Obj; if (noise == false)
(10)
bb = new Bitmap((Bitmap)this.ONF_B.Image);
for (int i = 0; i < dataB.GetLength(1); i++)
{
for (int j = 0; j < dataB.GetLength(1); j++)
{
dataB[i, j] = bb.GetPixel(i, j).R;
} }
MSE5.Text = MSEPSNR.HitungMSE2(dataA, dataB).ToString();
PSNR5.Text =
MSEPSNR.HitungPSNR(Convert.ToDouble(MSE5.Text)).ToString(); seli = dua.Subtract(satu); RT5.Text =
(seli.TotalMilliseconds).ToString(); }
satu = DateTime.Now; ImgFFT = new FFT(Is3); ImgFFT.ForwardFFT(); ImgFFT.FFTShift();
ImgFFT.FFTPlot(ImgFFT.FFTShifted); citraSpektrum.Image =
(Image)ImgFFT.FourierPlot;
double[,] a2 = new double[ImgFFT.Obj.Width, ImgFFT.Obj.Height];
int[,] K2 = { { x1x, y1y }, { x2x, y2y } }; selectiveFilter.Optimum_notch(a2, K2, D0, ImgFFT.Obj.Width, ImgFFT.Obj.Height, 3, (int)n);
ImgFFT.RemoveFFTShift(); for (int p = 0; p < 1; p++) {
for (int v = 0; v < ImgFFT.Obj.Height; v++)
{
for (int u = 0; u < ImgFFT.Obj.Width; u++)
{
//MessageBox.Show(a[u, v].ToString());
ImgFFT.FFTNormal[u, v].real *= a2[u, v];
ImgFFT.Output[u, v].real = ImgFFT.FFTNormal[u, v].real;
ImgFFT.FFTNormal[u, v].imag *= a2[u, v];
ImgFFT.Output[u, v].imag = ImgFFT.FFTNormal[u, v].imag;
} } }
(11)
ImgFFT.RemoveFFTShift(); ImgFFT.InverseFFT(); dua = DateTime.Now;
ONF_G.Image = (Image)ImgFFT.Obj; if (noise == false)
{
//aa = new Bitmap((Bitmap)this.Citra_Gray.Image); bb = new Bitmap((Bitmap)this.ONF_G.Image);
for (int i = 0; i < dataB.GetLength(1); i++)
{
for (int j = 0; j < dataB.GetLength(1); j++)
{
dataB[i, j] = bb.GetPixel(i, j).R;
} }
MSE6.Text = MSEPSNR.HitungMSE2(dataA, dataB).ToString();
PSNR6.Text =
MSEPSNR.HitungPSNR(Convert.ToDouble(MSE6.Text)).ToString(); seli = dua.Subtract(satu); RT6.Text =
(seli.TotalMilliseconds).ToString(); }
MessageBox.Show("Proses Filter selesai, tekan tombol simpan untuk menyimpan gambar", "Sukses",
MessageBoxButtons.OK, MessageBoxIcon.Information); }
catch (Exception ex) {
} } } }
private void Form1_Load(object sender, EventArgs e) {
waktu = 0.0; noise = false; }
private void timerx_Tick(object sender, EventArgs e) {
}
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
Application.Exit(); }
(12)
public void SimpanMetod(PictureBox abc) {
if (abc.Image != null) {
Bitmap copy = new Bitmap((Bitmap)abc.Image);
SaveFileDialog saveFileDialog = new SaveFileDialog(); saveFileDialog.InitialDirectory = "";
saveFileDialog.Filter = "Bitmap Files(*.bmp)|*.bmp|Jpeg Files(*.jpg)|*.jpg|All valid files(*.bmp/*.jpg)|*.bmp/*.jpg";
saveFileDialog.FilterIndex = 2;
saveFileDialog.RestoreDirectory = true;
if (DialogResult.OK == saveFileDialog.ShowDialog()) {
copy.Save(saveFileDialog.FileName); }
} }
private void button3_Click(object sender, EventArgs e) {
SimpanMetod(BR_ideal); }
private void button4_Click(object sender, EventArgs e) {
SimpanMetod(BR_B); }
private void button5_Click(object sender, EventArgs e) {
SimpanMetod(BR_G); }
private void button6_Click(object sender, EventArgs e) {
SimpanMetod(ONF_I); }
private void button7_Click(object sender, EventArgs e) {
SimpanMetod(ONF_B); }
private void button8_Click(object sender, EventArgs e) {
SimpanMetod(ONF_G); }
private void petunjukToolStripMenuItem_Click(object sender, EventArgs e)
{
Form3 bc = new Form3(); bc.ShowDialog();
}
private void tentangToolStripMenuItem_Click(object sender, EventArgs e)
(13)
{
Form4 po = new Form4(); po.ShowDialog();
}
private void bukaGambarNoiseToolStripMenuItem_Click(object sender, EventArgs e)
{
OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.InitialDirectory = "";
openFileDialog.Filter = "Bitmap files(*.bmp)|*.bmp|Jpeg Files(*.jpg)|*.jpg|All valid files " +
"(*.bmp/*.jpg)|*.bmp/*.jpg"; openFileDialog.FilterIndex = 2;
openFileDialog.RestoreDirectory = true;
if (DialogResult.OK == openFileDialog.ShowDialog()) {
this.AutoScroll = true; Form5 po = new Form5(); po.citraAbu.Image = new Bitmap(openFileDialog.FileName);
po.Invalidate();
Bitmap Is3 = new Bitmap((Bitmap)po.citraAbu.Image); po.LL.Text = Is3.Width.ToString();
po.TT.Text = Is3.Height.ToString(); if (Is3.Width == Is3.Height)
{
noise = true;
ImgFFT = new FFT(Is3); ImgFFT.ForwardFFT(); ImgFFT.FFTShift();
ImgFFT.FFTPlot(ImgFFT.FFTShifted); po.citraSpektrum.Image =
(Image)ImgFFT.FourierPlot;
this.Hide(); po.ShowDialog(); this.Show(); }
else {
MessageBox.Show("Lebar dan Tinggi gambar harus sama!", "Gagal", MessageBoxButtons.OK, MessageBoxIcon.Error); }
} }
private void button9_Click(object sender, EventArgs e) {
SimpanMetod(Citra_Gray); }
} }
(14)
2.
Form Implementasi ONF dan BRF
using System;
using System.Collections.Generic; using System.ComponentModel; using System.Data;
using System.Drawing; using System.Linq; using System.Text;
using System.Threading.Tasks; using System.Windows.Forms; namespace SelectiveFilter2 {
public partial class Form5 : Form {
FFT ImgFFT; public Form5() {
InitializeComponent(); }
private void button1_Click(object sender, EventArgs e) {
DateTime satu, dua; double W, D0, n;
if ((W1.Text != "") || (D01.Text != "") || (n1.Text != ""))
{
try {
W = Convert.ToDouble(W1.Text); D0 = Convert.ToDouble(D01.Text); n = Convert.ToDouble(n1.Text); Bitmap Is3 = new
Bitmap((Bitmap)this.citraAbu.Image);
ImgFFT = new FFT(Is3); satu = DateTime.Now; ImgFFT.ForwardFFT(); ImgFFT.FFTShift();
ImgFFT.FFTPlot(ImgFFT.FFTShifted);
citraSpektrum.Image = (Image)ImgFFT.FourierPlot; ImgFFT.RemoveFFTShift();
double[,] a = new double[ImgFFT.Obj.Width, ImgFFT.Obj.Height];
selectiveFilter.Band_Reject(a, W, D0, ImgFFT.Obj.Width, ImgFFT.Obj.Height, 1, (int)n);
for (int p = 0; p < 5; p++) {
for (int v = 0; v < ImgFFT.Obj.Height; v++) {
for (int u = 0; u < ImgFFT.Obj.Width; u++)
(15)
ImgFFT.FFTNormal[u, v].real *= a[u, v];
ImgFFT.Output[u, v].real = ImgFFT.FFTNormal[u, v].real;
ImgFFT.FFTNormal[u, v].imag *= a[u, v];
ImgFFT.Output[u, v].imag = ImgFFT.FFTNormal[u, v].imag;
} } }
ImgFFT.RemoveFFTShift(); ImgFFT.InverseFFT(); dua = DateTime.Now;
TimeSpan seli = dua.Subtract(satu); BR_ideal.Image = (Image)ImgFFT.Obj;
satu = DateTime.Now; ImgFFT = new FFT(Is3); ImgFFT.ForwardFFT(); ImgFFT.FFTShift();
ImgFFT.FFTPlot(ImgFFT.FFTShifted);
citraSpektrum.Image = (Image)ImgFFT.FourierPlot; ImgFFT.RemoveFFTShift();
selectiveFilter.Band_Reject(a, W, D0, ImgFFT.Obj.Width, ImgFFT.Obj.Height, 2, (int)n);
for (int p = 0; p < 1; p++) {
for (int v = 0; v < ImgFFT.Obj.Height; v++) {
for (int u = 0; u < ImgFFT.Obj.Width; u++)
{
ImgFFT.FFTNormal[u, v].real *= a[u, v];
ImgFFT.Output[u, v].real = ImgFFT.FFTNormal[u, v].real;
ImgFFT.FFTNormal[u, v].imag *= a[u, v];
ImgFFT.Output[u, v].imag = ImgFFT.FFTNormal[u, v].imag;
} } }
ImgFFT.RemoveFFTShift(); ImgFFT.InverseFFT(); dua = DateTime.Now;
BR_B.Image = (Image)ImgFFT.Obj; satu = DateTime.Now;
(16)
ImgFFT = new FFT(Is3); ImgFFT.ForwardFFT(); ImgFFT.FFTShift();
ImgFFT.FFTPlot(ImgFFT.FFTShifted);
citraSpektrum.Image = (Image)ImgFFT.FourierPlot; ImgFFT.RemoveFFTShift();
selectiveFilter.Band_Reject(a, W, D0, ImgFFT.Obj.Width, ImgFFT.Obj.Height, 3, (int)n);
for (int p = 0; p < 8; p++) {
for (int v = 0; v < ImgFFT.Obj.Height; v++) {
for (int u = 0; u < ImgFFT.Obj.Width; u++)
{
ImgFFT.FFTNormal[u, v].real *= a[u, v];
ImgFFT.Output[u, v].real = ImgFFT.FFTNormal[u, v].real;
ImgFFT.FFTNormal[u, v].imag *= a[u, v];
ImgFFT.Output[u, v].imag = ImgFFT.FFTNormal[u, v].imag;
} } }
ImgFFT.RemoveFFTShift(); ImgFFT.InverseFFT(); dua = DateTime.Now;
BR_G.Image = (Image)ImgFFT.Obj;
MessageBox.Show("Proses Filter selesai, tekan tombol simpan untuk menyimpan gambar", "Sukses",
MessageBoxButtons.OK, MessageBoxIcon.Information); }
catch (Exception ex) {
MessageBox.Show("Masukkan angka, bukan Huruf", "GAGAL!", MessageBoxButtons.OK, MessageBoxIcon.Error);
} } }
private void button2_Click(object sender, EventArgs e) {
double D0, n;
DateTime satu, dua; int x1x, x2x, y1y, y2y;
if ((DO2.Text != "") || (n2.Text != "") || (x1.Text != "") || (x2.Text != "") || (y1.Text != "") || (y2.Text != "")) {
try {
D0 = Convert.ToDouble(DO2.Text); n = Convert.ToDouble(n2.Text);
(17)
x1x = Convert.ToInt32(x1.Text); x2x = Convert.ToInt32(x2.Text); y1y = Convert.ToInt32(y1.Text); y2y = Convert.ToInt32(y2.Text); Bitmap Is3 = new
Bitmap((Bitmap)this.citraAbu.Image); satu = DateTime.Now; ImgFFT = new FFT(Is3); ImgFFT.ForwardFFT(); ImgFFT.FFTShift();
ImgFFT.FFTPlot(ImgFFT.FFTShifted);
citraSpektrum.Image = (Image)ImgFFT.FourierPlot; double[,] a = new double[ImgFFT.Obj.Width,
ImgFFT.Obj.Height];
int[,] K = { { x1x, y1y }, { x2x, y2y } }; selectiveFilter.Optimum_notch(a, K, D0, ImgFFT.Obj.Width, ImgFFT.Obj.Height, 1, (int)n);
ImgFFT.RemoveFFTShift(); for (int p = 0; p < 1; p++) {
for (int v = 0; v < ImgFFT.Obj.Height; v++) {
for (int u = 0; u < ImgFFT.Obj.Width; u++)
{
//MessageBox.Show(a[u, v].ToString());
ImgFFT.FFTNormal[u, v].real *= a[u, v];
ImgFFT.Output[u, v].real = ImgFFT.FFTNormal[u, v].real;
ImgFFT.FFTNormal[u, v].imag *= a[u, v];
ImgFFT.Output[u, v].imag = ImgFFT.FFTNormal[u, v].imag;
} } }
ImgFFT.RemoveFFTShift(); ImgFFT.InverseFFT(); dua = DateTime.Now;
ONF_I.Image = (Image)ImgFFT.Obj;
satu = DateTime.Now; ImgFFT = new FFT(Is3); ImgFFT.ForwardFFT(); ImgFFT.FFTShift();
ImgFFT.FFTPlot(ImgFFT.FFTShifted);
citraSpektrum.Image = (Image)ImgFFT.FourierPlot; double[,] a1 = new double[ImgFFT.Obj.Width, ImgFFT.Obj.Height];
(18)
int[,] K1 = { { x1x, y1y }, { x2x, y2y } }; selectiveFilter.Optimum_notch(a1, K1, D0, ImgFFT.Obj.Width, ImgFFT.Obj.Height, 2, (int)n);
ImgFFT.RemoveFFTShift(); for (int p = 0; p < 1; p++) {
for (int v = 0; v < ImgFFT.Obj.Height; v++) {
for (int u = 0; u < ImgFFT.Obj.Width; u++)
{
//MessageBox.Show(a[u, v].ToString());
ImgFFT.FFTNormal[u, v].real *= a1[u, v];
ImgFFT.Output[u, v].real = ImgFFT.FFTNormal[u, v].real;
ImgFFT.FFTNormal[u, v].imag *= a1[u, v];
ImgFFT.Output[u, v].imag = ImgFFT.FFTNormal[u, v].imag;
} } }
ImgFFT.RemoveFFTShift(); ImgFFT.InverseFFT(); dua = DateTime.Now;
ONF_B.Image = (Image)ImgFFT.Obj; satu = DateTime.Now;
ImgFFT = new FFT(Is3); ImgFFT.ForwardFFT(); ImgFFT.FFTShift();
ImgFFT.FFTPlot(ImgFFT.FFTShifted);
citraSpektrum.Image = (Image)ImgFFT.FourierPlot; double[,] a2 = new double[ImgFFT.Obj.Width, ImgFFT.Obj.Height];
int[,] K2 = { { x1x, y1y }, { x2x, y2y } }; selectiveFilter.Optimum_notch(a2, K2, D0, ImgFFT.Obj.Width, ImgFFT.Obj.Height, 3, (int)n);
ImgFFT.RemoveFFTShift(); for (int p = 0; p < 1; p++) {
for (int v = 0; v < ImgFFT.Obj.Height; v++) {
for (int u = 0; u < ImgFFT.Obj.Width; u++)
{
//MessageBox.Show(a[u, v].ToString());
ImgFFT.FFTNormal[u, v].real *= a2[u, v];
ImgFFT.Output[u, v].real = ImgFFT.FFTNormal[u, v].real;
(19)
ImgFFT.FFTNormal[u, v].imag *= a2[u, v];
ImgFFT.Output[u, v].imag = ImgFFT.FFTNormal[u, v].imag;
} } }
ImgFFT.RemoveFFTShift(); ImgFFT.InverseFFT(); dua = DateTime.Now;
ONF_G.Image = (Image)ImgFFT.Obj;
MessageBox.Show("Proses Filter selesai, tekan tombol simpan untuk menyimpan gambar", "Sukses",
MessageBoxButtons.OK, MessageBoxIcon.Information); }
catch (Exception ex) {
} } }
public void SimpanMetod(PictureBox abc) {
if (abc.Image != null) {
Bitmap copy = new Bitmap((Bitmap)abc.Image);
SaveFileDialog saveFileDialog = new SaveFileDialog(); saveFileDialog.InitialDirectory = "";
saveFileDialog.Filter = "Bitmap Files(*.bmp)|*.bmp|Jpeg Files(*.jpg)|*.jpg|All valid files(*.bmp/*.jpg)|*.bmp/*.jpg";
saveFileDialog.FilterIndex = 2;
saveFileDialog.RestoreDirectory = true;
if (DialogResult.OK == saveFileDialog.ShowDialog()) {
copy.Save(saveFileDialog.FileName); }
} }
private void button3_Click(object sender, EventArgs e) {
SimpanMetod(BR_ideal); }
private void button4_Click(object sender, EventArgs e) {
SimpanMetod(BR_B); }
private void button5_Click(object sender, EventArgs e) {
(20)
}
private void button6_Click(object sender, EventArgs e) {
SimpanMetod(ONF_I); }
private void button7_Click(object sender, EventArgs e) {
SimpanMetod(ONF_B); }
private void button8_Click(object sender, EventArgs e) {
SimpanMetod(ONF_G); }
} }
3.
Kelas Selective_Filter
using System;
using System.Collections.Generic; using System.Linq;
using System.Text;
using System.Threading.Tasks; using System.Drawing;
using System.Drawing.Drawing2D; using System.Drawing.Imaging; namespace SelectiveFilter2 {
class selectiveFilter {
public static bool CitraAbu2(Bitmap b) {
BitmapData bmData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height),
ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
int stride = bmData.Stride;
System.IntPtr Scan0 = bmData.Scan0;
byte[,] grayx = new byte[b.Width, b.Height]; unsafe
{
byte* p = (byte*)(void*)Scan0; int nOffset = stride - b.Width * 3; for (int y = 0; y < b.Height; ++y) {
for (int x = 0; x < b.Width; ++x) {
grayx[x, y] =(byte) ((p[0] + p[1] + p[2]) / 3);
p += 3; }
p += nOffset; }
(21)
byte* p1 = (byte*)(void*)Scan0; for (int y = 0; y < b.Height; ++y) {
for (int x = 0; x < b.Width; ++x) {
p1[0] = grayx[x, y]; p1[1] = grayx[x, y]; p1[2] = grayx[x, y]; p1 += 3;
}
p1 += nOffset; }
}
b.UnlockBits(bmData); return true;
}
public static void Band_Reject(double[,] H, double W, double D0, int x, int y, int tipe, int n)
{
double[,] D = new double[x, y]; //hitung nilai D[u,v]
for (int v = 0; v < y; v++) {
for (int u = 0; u < x; u++) {
D[u, v] = Math.Sqrt((u * u) + (v * v)); //MessageBox.Show(D[u, v].ToString()); }
}
//hitung nilai filter H[u,v] for (int v = 0; v < y; v++) {
for (int u = 0; u < x; u++) {
if (tipe == 1) {
if ((D[u, v] < (D0 - (W / 2))) || (D[u, v] > (D0 + (W / 2))))
H[u, v] = 1; else
H[u, v] = 0; }
if (tipe == 2) {
H[u, v] = 1 / (1 + Math.Pow((D[u, v] * W) / (Math.Pow(D[u, v], 2) - Math.Pow(D0, 2)), 2 * n));
}
if (tipe == 3) {
H[u, v] = 1 (Math.Pow(Math.E,
-(Math.Pow((Math.Pow(D[u, v], 2) - Math.Pow(D0, 2) / (D[u, v] * W)), 2))));
} } }
(22)
}
public static void Optimum_notch(double[,] H, int[,] K, double D0, int x, int y, int tipe, int n)
{
double[,] D1 = new double[x, y]; double[,] D2 = new double[x, y]; double[,] H1 = new double[x, y]; double[,] H2 = new double[x, y]; //hitung nilai D1[u,v] dan D2[u,v] //D1-->Dk, D2-->D-k
for (int v = 0; v < y; v++) {
for (int u = 0; u < x; u++) {
D1[u, v] = Math.Sqrt((Math.Pow((u + K[0, 0]), 2)) + (Math.Pow((v + K[0, 1]), 2)));
D2[u, v] = Math.Sqrt((Math.Pow((u - K[1, 0]), 2)) + (Math.Pow((v - K[1, 1]), 2)));
} }
//hitung nilai filter H[u,v] for (int v = 0; v < y; v++) {
for (int u = 0; u < x; u++) {
if (tipe == 1) {
if ((D1[u, v] <= D0) || D2[u, v] <= D0) H[u, v] = 0;
else
H[u, v] = 1; }
if (tipe == 2) {
H1[u, v] = 1 / (1 + Math.Pow((D0 / D1[u, v]), 2 * n));
H2[u, v] = 1 / (1 + Math.Pow((D0 / D2[u, v]), 2 * n));
H[u, v] = H1[u, v] * H2[u, v]; }
if (tipe == 3) {
H1[u, v] = 1 - Math.Pow(Math.E, -((D1[u, v] * D1[u, v]) / (2 * D0 * D0)));
H2[u, v] = 1 - Math.Pow(Math.E, -((D2[u, v] * D2[u, v]) / (2 * D0 * D0)));
H[u, v] = H1[u, v] * H2[u, v]; }
} } }
(23)
} }
4.
Kelas MSEPSNR
using System;
using System.Collections.Generic; using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace SelectiveFilter2 {
class MSEPSNR {
public static double HitungMSE2(int[,] a, int[,] b) {
double total = 0;
for (int i = 0; i < a.GetLength(1); i++) {
for (int j = 0; j < a.GetLength(1); j++) {
total += Math.Abs(Math.Pow(a[i, j] - b[i, j], 2));
} }
return total / Math.Pow(a.GetLength(1), 2); }
public static double HitungPSNR(double x) {
double hasil, kali;
kali = (255) / Math.Sqrt(x); hasil = 20 * Math.Log10(kali); return hasil;
} } }
5.
Kelas Sinu_Noise
using System;
using System.Collections.Generic; using System.Linq;
using System.Text;
using System.Threading.Tasks; using System.Drawing;
using System.Drawing.Imaging; namespace SelectiveFilter2 {
class Sinu_noise {
private Bitmap sourceBitmap; /// <summary>
/// Source image. /// </summary>
(24)
public Bitmap SourceBitmap {
get { return sourceBitmap; } set { sourceBitmap = value; } }
private Bitmap resultImage; /// <summary>
/// Result image. /// </summary>
public Bitmap ResultImage {
get {
BuildImage();
return resultImage; }
set { resultImage = value; } }
private Color vignetteColor = Color.Black; public Color VignetteColor
{
get { return vignetteColor; } set { vignetteColor = value; } }
private int period = 20; public int Period
{
get { return period; } set { period = value; } }
private double fade = 1; public double Fade
{
get { return fade; } set
{
if (fade > 1) {
fade = 1; }
if (fade < 0) {
fade = 0; }
fade = value; }
}
public Sinu_noise(Bitmap bmp) {
sourceBitmap = bmp;
(25)
//BuildImage(); }
private void BuildImage() {
for (int i = 0; i < sourceBitmap.Width - 1; i++) {
for (int j = 0; j < sourceBitmap.Height - 1; j++) {
//int dX = Math.Min(i, sourceBitmap.Width - i); // int dY = Math.Min(j, sourceBitmap.Height - j); double k = fade * Math.Sin(j * period);
Color color = sourceBitmap.GetPixel(i, j); resultImage.SetPixel(i, j,
DrawUtils.SuperpositionColor(DrawUtils.GetGrayColor(color), color, k));
} } } } }
6.
Kelas FFT
using System;
using System.Collections.Generic; using System.Linq;
using System.Text;
using System.Threading.Tasks; using System.Drawing;
using System.Drawing.Imaging; using System.Drawing.Drawing2D; namespace SelectiveFilter2 {
struct COMPLEX {
public double real, imag;
public COMPLEX(double x, double y) {
real = x; imag = y; }
public float Magnitude() {
return ((float)Math.Sqrt(real * real + imag * imag)); }
public float Phase() {
return ((float)Math.Atan(imag / real)); }
}
class FFT {
public Bitmap Obj; public Bitmap FourierPlot; public Bitmap PhasePlot;
(26)
public int[,] GreyImage; public float[,] FourierMagnitude; public float[,] FourierPhase; float[,] FFTLog; float[,] FFTPhaseLog; public int[,] FFTNormalized; public int[,] FFTPhaseNormalized int nx, ny; int Width, Height;
COMPLEX[,] Fourier;
public COMPLEX[,] FFTShifted; public COMPLEX[,] Output; public COMPLEX[,] FFTNormal; public COMPLEX[,] OutputTemp; public FFT(Bitmap Input) {
Obj = Input;
Width = nx = Input.Width; Height = ny = Input.Height;
OutputTemp = new COMPLEX[Width, Height]; ReadImage();
}
public FFT(int[,] Input) {
GreyImage = Input;
Width = nx = Input.GetLength(0); Height = ny = Input.GetLength(1); }
public FFT(COMPLEX[,] Input) {
nx = Width = Input.GetLength(0); ny = Height = Input.GetLength(1); Fourier = Input;
}
private void ReadImage() {
int i, j;
GreyImage = new int[Width, Height]; Bitmap image = Obj;
BitmapData bitmapData1 = image.LockBits(new Rectangle(0, 0, image.Width, image.Height),
ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
unsafe {
byte* imagePointer1 = (byte*)bitmapData1.Scan0; for (i = 0; i < bitmapData1.Height; i++)
{
for (j = 0; j < bitmapData1.Width; j++) {
(27)
GreyImage[j, i] = (int)((imagePointer1[0] + imagePointer1[1] + imagePointer1[2]) / 3.0);
//4 bytes per pixel imagePointer1 += 4; }//end for j
//4 bytes per pixel
imagePointer1 += bitmapData1.Stride - (bitmapData1.Width * 4);
}//end for i }//end unsafe
image.UnlockBits(bitmapData1); return;
}
public Bitmap Displayimage() {
int i, j;
Bitmap image = new Bitmap(Width, Height);
BitmapData bitmapData1 = image.LockBits(new Rectangle(0, 0, Width, Height),
ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
unsafe {
byte* imagePointer1 = (byte*)bitmapData1.Scan0; for (i = 0; i < bitmapData1.Height; i++)
{
for (j = 0; j < bitmapData1.Width; j++) {
// write the logic implementation here imagePointer1[0] = (byte)GreyImage[j, i]; imagePointer1[1] = (byte)GreyImage[j, i]; imagePointer1[2] = (byte)GreyImage[j, i]; imagePointer1[3] = (byte)255;
//4 bytes per pixel imagePointer1 += 4; }//end for j
//4 bytes per pixel
imagePointer1 += (bitmapData1.Stride - (bitmapData1.Width * 4));
}//end for i }//end unsafe
image.UnlockBits(bitmapData1); return image;// col;
}
public Bitmap Displayimage(int[,] image) {
int i, j;
Bitmap output = new Bitmap(image.GetLength(0), image.GetLength(1));
BitmapData bitmapData1 = output.LockBits(new Rectangle(0, 0, image.GetLength(0), image.GetLength(1)),
ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
unsafe {
(28)
for (i = 0; i < bitmapData1.Height; i++) {
for (j = 0; j < bitmapData1.Width; j++) {
imagePointer1[0] = (byte)image[j, i]; imagePointer1[1] = (byte)image[j, i]; imagePointer1[2] = (byte)image[j, i]; imagePointer1[3] = 255;
//4 bytes per pixel imagePointer1 += 4; }//end for j
//4 bytes per pixel
imagePointer1 += (bitmapData1.Stride - (bitmapData1.Width * 4));
}//end for i }//end unsafe
output.UnlockBits(bitmapData1); return output;// col;
}
public void ForwardFFT() {
int i, j;
Fourier = new COMPLEX[Width, Height]; Output = new COMPLEX[Width, Height];
for (i = 0; i <= Width - 1; i++) for (j = 0; j <= Height - 1; j++)
{
Fourier[i, j].real = (double)GreyImage[i, j]; Fourier[i, j].imag = 0;
}
Output = FFT2D(Fourier, nx, ny, 1); return;
}
public void FFTShift() {
int i, j;
FFTShifted = new COMPLEX[nx, ny]; for (i = 0; i <= (ny / 2) - 1; ++i) {
for (j = 0; j <= (nx / 2) - 1; ++j) {
FFTShifted[i + (nx / 2), j + (ny / 2)] = Output[i, j];
FFTShifted[i, j] = Output[i + (nx / 2), j + (ny / 2)];
FFTShifted[i + (nx / 2), j] = Output[i, j + (ny / 2)];
FFTShifted[i, j + (nx / 2)] = Output[i + (nx / 2), j];
} }
return; }
(29)
public void RemoveFFTShift() {
int i, j;
FFTNormal = new COMPLEX[nx, ny]; for (i = 0; i <= (nx / 2) - 1; i++) for (j = 0; j <= (ny / 2) - 1; j++) {
FFTNormal[i + (nx / 2), j + (ny / 2)] = FFTShifted[i, j];
FFTNormal[i, j] = FFTShifted[i + (nx / 2), j + (ny / 2)];
FFTNormal[i + (nx / 2), j] = FFTShifted[i, j + (ny / 2)];
FFTNormal[i, j + (nx / 2)] = FFTShifted[i + (nx / 2), j];
} return; }
public void FFTPlot(COMPLEX[,] Output) {
int i, j; float max;
FFTLog = new float[nx, ny]; FFTPhaseLog = new float[nx, ny]; FourierMagnitude = new float[nx, ny]; FourierPhase = new float[nx, ny]; FFTNormalized = new int[nx, ny]; FFTPhaseNormalized = new int[nx, ny]; for (i = 0; i <= Width - 1; i++) for (j = 0; j <= Height - 1; j++) {
FourierMagnitude[i, j] = Output[i, j].Magnitude();
FourierPhase[i, j] = Output[i, j].Phase(); FFTLog[i, j] = (float)Math.Log(1 +
FourierMagnitude[i, j]);
FFTPhaseLog[i, j] = (float)Math.Log(1 + Math.Abs(FourierPhase[i, j]));
}
//Generating Magnitude Bitmap max = FFTLog[0, 0];
for (i = 0; i <= Width - 1; i++) for (j = 0; j <= Height - 1; j++) {
if (FFTLog[i, j] > max) max = FFTLog[i, j]; }
for (i = 0; i <= Width - 1; i++) for (j = 0; j <= Height - 1; j++) {
FFTLog[i, j] = FFTLog[i, j] / max; }
(30)
for (i = 0; i <= Width - 1; i++) for (j = 0; j <= Height - 1; j++) {
FFTNormalized[i, j] = (int)(2000 * FFTLog[i, j]); }
//Transferring Image to Fourier Plot
FourierPlot = Displayimage(FFTNormalized); //generating phase Bitmap
FFTPhaseLog[0, 0] = 0; max = FFTPhaseLog[1, 1];
for (i = 0; i <= Width - 1; i++) for (j = 0; j <= Height - 1; j++) {
if (FFTPhaseLog[i, j] > max) max = FFTPhaseLog[i, j]; }
for (i = 0; i <= Width - 1; i++) for (j = 0; j <= Height - 1; j++) {
FFTPhaseLog[i, j] = FFTPhaseLog[i, j] / max; }
for (i = 0; i <= Width - 1; i++) for (j = 0; j <= Height - 1; j++) {
FFTPhaseNormalized[i, j] = (int)(255 * FFTPhaseLog[i, j]);
}
//Transferring Image to Fourier Plot
PhasePlot = Displayimage(FFTPhaseNormalized); }
public void FFTPlot() {
int i, j; float max;
FFTLog = new float[nx, ny]; FFTPhaseLog = new float[nx, ny]; FourierMagnitude = new float[nx, ny]; FourierPhase = new float[nx, ny]; FFTNormalized = new int[nx, ny]; FFTPhaseNormalized = new int[nx, ny]; for (i = 0; i <= Width - 1; i++) for (j = 0; j <= Height - 1; j++) {
FourierMagnitude[i, j] = Output[i, j].Magnitude();
FourierPhase[i, j] = Output[i, j].Phase(); FFTLog[i, j] = (float)Math.Log(1 +
FourierMagnitude[i, j]);
FFTPhaseLog[i, j] = (float)Math.Log(1 + Math.Abs(FourierPhase[i, j]));
}
//Generating Magnitude Bitmap max = FFTLog[0, 0];
(31)
for (i = 0; i <= Width - 1; i++) for (j = 0; j <= Height - 1; j++) {
if (FFTLog[i, j] > max) max = FFTLog[i, j]; }
for (i = 0; i <= Width - 1; i++) for (j = 0; j <= Height - 1; j++) {
FFTLog[i, j] = FFTLog[i, j] / max; }
for (i = 0; i <= Width - 1; i++) for (j = 0; j <= Height - 1; j++) {
FFTNormalized[i, j] = (int)(1000 * FFTLog[i, j]); }
//Transferring Image to Fourier Plot
FourierPlot = Displayimage(FFTNormalized); //generating phase Bitmap
max = FFTPhaseLog[0, 0];
for (i = 0; i <= Width - 1; i++) for (j = 0; j <= Height - 1; j++) {
if (FFTPhaseLog[i, j] > max) max = FFTPhaseLog[i, j]; }
for (i = 0; i <= Width - 1; i++) for (j = 0; j <= Height - 1; j++) {
FFTPhaseLog[i, j] = FFTPhaseLog[i, j] / max; }
for (i = 0; i <= Width - 1; i++) for (j = 0; j <= Height - 1; j++) {
FFTPhaseNormalized[i, j] = (int)(2000 * FFTLog[i, j]);
}
//Transferring Image to Fourier Plot
PhasePlot = Displayimage(FFTPhaseNormalized); }
public void InverseFFT() {
//Initializing Fourier Transform Array int i, j;
//Calling Forward Fourier Transform Output = new COMPLEX[nx, ny];
Output = FFT2D(Fourier, nx, ny, -1); Obj = null;
for (i = 0; i <= Width - 1; i++) for (j = 0; j <= Height - 1; j++) {
(32)
}
Obj = Displayimage(GreyImage); return;
}
public void InverseFFT(COMPLEX[,] Fourier) {
//Initializing Fourier Transform Array int i, j;
Output = new COMPLEX[nx, ny];
Output = FFT2D(Fourier, nx, ny, -1); for (i = 0; i <= Width - 1; i++) for (j = 0; j <= Height - 1; j++) {
GreyImage[i, j] = (int)Output[i, j].Magnitude(); }
Obj = Displayimage(GreyImage); return;
}
public COMPLEX[,] FFT2D(COMPLEX[,] c, int nx, int ny, int dir)
{
int i, j;
int m;//Power of 2 for current number of points double[] real;
double[] imag;
COMPLEX[,] output;//=new COMPLEX [nx,ny]; output = c; // Copying Array
// Transform the Rows real = new double[nx]; imag = new double[nx]; for (j = 0; j < ny; j++) {
for (i = 0; i < nx; i++) {
real[i] = c[i, j].real; imag[i] = c[i, j].imag; }
m = (int)Math.Log((double)nx, 2); FFT1D(dir, m, ref real, ref imag); for (i = 0; i < nx; i++)
{
output[i, j].real = real[i]; output[i, j].imag = imag[i]; }
}
// Transform the columns real = new double[ny];
(33)
imag = new double[ny]; for (i = 0; i < nx; i++) {
for (j = 0; j < ny; j++) {
real[j] = output[i, j].real; imag[j] = output[i, j].imag; }
// Calling 1D FFT Function for Columns m = (int)Math.Log((double)ny, 2); FFT1D(dir, m, ref real, ref imag); for (j = 0; j < ny; j++)
{
output[i, j].real = real[j]; output[i, j].imag = imag[j]; }
}
// return(true); return (output); }
private void FFT1D(int dir, int m, ref double[] x, ref double[] y)
{
long nn, i, i1, j, k, i2, l, l1, l2; double c1, c2, tx, ty, t1, t2, u1, u2, z; /* Calculate the number of points */ nn = 1;
for (i = 0; i < m; i++) nn *= 2;
/* Do the bit reversal */ i2 = nn >> 1;
j = 0;
for (i = 0; i < nn - 1; i++) {
if (i < j) {
tx = x[i]; ty = y[i]; x[i] = x[j]; y[i] = y[j]; x[j] = tx; y[j] = ty; }
k = i2;
while (k <= j) {
j -= k; k >>= 1; }
j += k; }
/* Compute the FFT */ c1 = -1.0;
c2 = 0.0; l2 = 1;
(34)
for (l = 0; l < m; l++) {
l1 = l2; l2 <<= 1; u1 = 1.0; u2 = 0.0;
for (j = 0; j < l1; j++) {
for (i = j; i < nn; i += l2) {
i1 = i + l1;
t1 = u1 * x[i1] - u2 * y[i1]; t2 = u1 * y[i1] + u2 * x[i1]; x[i1] = x[i] - t1;
y[i1] = y[i] - t2; x[i] += t1;
y[i] += t2; }
z = u1 * c1 - u2 * c2; u2 = u1 * c2 + u2 * c1; u1 = z;
}
c2 = Math.Sqrt((1.0 - c1) / 2.0); if (dir == 1)
c2 = -c2;
c1 = Math.Sqrt((1.0 + c1) / 2.0); }
/* Scaling for forward transform */ if (dir == 1)
{
for (i = 0; i < nn; i++) {
x[i] /= (double)nn; y[i] /= (double)nn; }
}
return; }
} }
(1)
public void RemoveFFTShift() {
int i, j;
FFTNormal = new COMPLEX[nx, ny]; for (i = 0; i <= (nx / 2) - 1; i++) for (j = 0; j <= (ny / 2) - 1; j++) {
FFTNormal[i + (nx / 2), j + (ny / 2)] = FFTShifted[i, j];
FFTNormal[i, j] = FFTShifted[i + (nx / 2), j + (ny / 2)];
FFTNormal[i + (nx / 2), j] = FFTShifted[i, j + (ny / 2)];
FFTNormal[i, j + (nx / 2)] = FFTShifted[i + (nx / 2), j];
} return; }
public void FFTPlot(COMPLEX[,] Output) {
int i, j; float max;
FFTLog = new float[nx, ny]; FFTPhaseLog = new float[nx, ny]; FourierMagnitude = new float[nx, ny]; FourierPhase = new float[nx, ny]; FFTNormalized = new int[nx, ny]; FFTPhaseNormalized = new int[nx, ny]; for (i = 0; i <= Width - 1; i++) for (j = 0; j <= Height - 1; j++) {
FourierMagnitude[i, j] = Output[i, j].Magnitude();
FourierPhase[i, j] = Output[i, j].Phase(); FFTLog[i, j] = (float)Math.Log(1 +
FourierMagnitude[i, j]);
FFTPhaseLog[i, j] = (float)Math.Log(1 + Math.Abs(FourierPhase[i, j]));
}
//Generating Magnitude Bitmap max = FFTLog[0, 0];
for (i = 0; i <= Width - 1; i++) for (j = 0; j <= Height - 1; j++) {
if (FFTLog[i, j] > max) max = FFTLog[i, j]; }
for (i = 0; i <= Width - 1; i++) for (j = 0; j <= Height - 1; j++) {
FFTLog[i, j] = FFTLog[i, j] / max; }
(2)
for (i = 0; i <= Width - 1; i++) for (j = 0; j <= Height - 1; j++) {
FFTNormalized[i, j] = (int)(2000 * FFTLog[i, j]); }
//Transferring Image to Fourier Plot
FourierPlot = Displayimage(FFTNormalized); //generating phase Bitmap
FFTPhaseLog[0, 0] = 0; max = FFTPhaseLog[1, 1];
for (i = 0; i <= Width - 1; i++) for (j = 0; j <= Height - 1; j++) {
if (FFTPhaseLog[i, j] > max) max = FFTPhaseLog[i, j]; }
for (i = 0; i <= Width - 1; i++) for (j = 0; j <= Height - 1; j++) {
FFTPhaseLog[i, j] = FFTPhaseLog[i, j] / max; }
for (i = 0; i <= Width - 1; i++) for (j = 0; j <= Height - 1; j++) {
FFTPhaseNormalized[i, j] = (int)(255 * FFTPhaseLog[i, j]);
}
//Transferring Image to Fourier Plot
PhasePlot = Displayimage(FFTPhaseNormalized);
}
public void FFTPlot() {
int i, j; float max;
FFTLog = new float[nx, ny]; FFTPhaseLog = new float[nx, ny]; FourierMagnitude = new float[nx, ny]; FourierPhase = new float[nx, ny]; FFTNormalized = new int[nx, ny]; FFTPhaseNormalized = new int[nx, ny]; for (i = 0; i <= Width - 1; i++) for (j = 0; j <= Height - 1; j++) {
FourierMagnitude[i, j] = Output[i, j].Magnitude();
FourierPhase[i, j] = Output[i, j].Phase(); FFTLog[i, j] = (float)Math.Log(1 +
FourierMagnitude[i, j]);
FFTPhaseLog[i, j] = (float)Math.Log(1 + Math.Abs(FourierPhase[i, j]));
}
//Generating Magnitude Bitmap max = FFTLog[0, 0];
(3)
for (i = 0; i <= Width - 1; i++) for (j = 0; j <= Height - 1; j++) {
if (FFTLog[i, j] > max) max = FFTLog[i, j]; }
for (i = 0; i <= Width - 1; i++) for (j = 0; j <= Height - 1; j++) {
FFTLog[i, j] = FFTLog[i, j] / max; }
for (i = 0; i <= Width - 1; i++) for (j = 0; j <= Height - 1; j++) {
FFTNormalized[i, j] = (int)(1000 * FFTLog[i, j]); }
//Transferring Image to Fourier Plot
FourierPlot = Displayimage(FFTNormalized); //generating phase Bitmap
max = FFTPhaseLog[0, 0];
for (i = 0; i <= Width - 1; i++) for (j = 0; j <= Height - 1; j++) {
if (FFTPhaseLog[i, j] > max) max = FFTPhaseLog[i, j]; }
for (i = 0; i <= Width - 1; i++) for (j = 0; j <= Height - 1; j++) {
FFTPhaseLog[i, j] = FFTPhaseLog[i, j] / max; }
for (i = 0; i <= Width - 1; i++) for (j = 0; j <= Height - 1; j++) {
FFTPhaseNormalized[i, j] = (int)(2000 * FFTLog[i, j]);
}
//Transferring Image to Fourier Plot
PhasePlot = Displayimage(FFTPhaseNormalized);
}
public void InverseFFT() {
//Initializing Fourier Transform Array int i, j;
//Calling Forward Fourier Transform Output = new COMPLEX[nx, ny];
Output = FFT2D(Fourier, nx, ny, -1); Obj = null;
for (i = 0; i <= Width - 1; i++) for (j = 0; j <= Height - 1; j++) {
(4)
}
Obj = Displayimage(GreyImage); return;
}
public void InverseFFT(COMPLEX[,] Fourier) {
//Initializing Fourier Transform Array int i, j;
Output = new COMPLEX[nx, ny];
Output = FFT2D(Fourier, nx, ny, -1); for (i = 0; i <= Width - 1; i++) for (j = 0; j <= Height - 1; j++) {
GreyImage[i, j] = (int)Output[i, j].Magnitude(); }
Obj = Displayimage(GreyImage); return;
}
public COMPLEX[,] FFT2D(COMPLEX[,] c, int nx, int ny, int dir)
{
int i, j;
int m;//Power of 2 for current number of points double[] real;
double[] imag;
COMPLEX[,] output;//=new COMPLEX [nx,ny]; output = c; // Copying Array
// Transform the Rows real = new double[nx]; imag = new double[nx]; for (j = 0; j < ny; j++) {
for (i = 0; i < nx; i++) {
real[i] = c[i, j].real; imag[i] = c[i, j].imag; }
m = (int)Math.Log((double)nx, 2); FFT1D(dir, m, ref real, ref imag); for (i = 0; i < nx; i++)
{
output[i, j].real = real[i]; output[i, j].imag = imag[i]; }
}
// Transform the columns real = new double[ny];
(5)
imag = new double[ny]; for (i = 0; i < nx; i++) {
for (j = 0; j < ny; j++) {
real[j] = output[i, j].real; imag[j] = output[i, j].imag; }
// Calling 1D FFT Function for Columns m = (int)Math.Log((double)ny, 2); FFT1D(dir, m, ref real, ref imag); for (j = 0; j < ny; j++)
{
output[i, j].real = real[j]; output[i, j].imag = imag[j]; }
}
// return(true); return (output); }
private void FFT1D(int dir, int m, ref double[] x, ref double[] y)
{
long nn, i, i1, j, k, i2, l, l1, l2; double c1, c2, tx, ty, t1, t2, u1, u2, z; /* Calculate the number of points */ nn = 1;
for (i = 0; i < m; i++) nn *= 2;
/* Do the bit reversal */ i2 = nn >> 1;
j = 0;
for (i = 0; i < nn - 1; i++) {
if (i < j) {
tx = x[i]; ty = y[i]; x[i] = x[j]; y[i] = y[j]; x[j] = tx; y[j] = ty; }
k = i2;
while (k <= j) {
j -= k; k >>= 1; }
j += k; }
/* Compute the FFT */ c1 = -1.0;
c2 = 0.0; l2 = 1;
(6)
for (l = 0; l < m; l++) {
l1 = l2; l2 <<= 1; u1 = 1.0; u2 = 0.0;
for (j = 0; j < l1; j++) {
for (i = j; i < nn; i += l2) {
i1 = i + l1;
t1 = u1 * x[i1] - u2 * y[i1]; t2 = u1 * y[i1] + u2 * x[i1]; x[i1] = x[i] - t1;
y[i1] = y[i] - t2; x[i] += t1;
y[i] += t2; }
z = u1 * c1 - u2 * c2; u2 = u1 * c2 + u2 * c1; u1 = z;
}
c2 = Math.Sqrt((1.0 - c1) / 2.0); if (dir == 1)
c2 = -c2;
c1 = Math.Sqrt((1.0 + c1) / 2.0); }
/* Scaling for forward transform */ if (dir == 1)
{
for (i = 0; i < nn; i++) {
x[i] /= (double)nn; y[i] /= (double)nn; }
}
return; }
} }