void HomeToolStripMenuptemClickobject sender, EventArgs
e {
Form a = new MainForm; this.Dispose;
a.ShowDialog;
}
void HelpToolStripMenuptemClickobject sender, EventArgs
e {
Form b = new Help; this.Dispose;
b.ShowDialog;
}
void openClickobject sender, EventArgs e
{
try
{
OpenFileDialog open = new OpenFileDialog;
open.Filter = Image File.bmp|.bmp;
if open.ShowDialog == DialogResult.OK
{
Bitmap gbr = new Bitmapopen.FileName; if gbr.Width = 500 gbr.Height = 500
{
var fileinfo = new Filepnfoopen.FileName;
gbrAsli.SizeMode = PictureBoxSizeMode.StretchImage;
gbrAsli.ImageLocation = open.FileName;
NmFile.Text = open.SafeFileName.ToString; Bitmap bit = new Bitmapopen.FileName;
ukuran1.Text
= fileinfo.Length 1024.ToString + KB;
nilaiAsli = fileinfo.Length 1024;
height.Text = bit.Height.ToString; width.Text = bit.Width.ToString;
gbrAsli.Image = bit; }
else MessageBox.ShowGambar tidak boleh melebihi
500x500 piksel, Warning; }
tulis
StreamWriter tulis_r = new StreamWriterD:\\Retri Scrib\\cicilan program\\Notepad\\gbr_asli_red.txt, false;
StreamWriter tulis_g = new StreamWriterD:\\Retri Scrib\\cicilan program\\Notepad\\gbr_asli_green.txt, false;
StreamWriter tulis_b = new StreamWriterD:\\Retri Scrib\\cicilan program\\Notepad\\gbr_asli_blue.txt, false;
Bitmap asli = BitmapgbrAsli.Image;
int[,] gambarasli_r = new int[1, asli.Width asli.Height];
int[,] gambarasli_g = new int[1, asli.Width asli.Height];
int[,] gambarasli_b = new int[1, asli.Width asli.Height];
gambarasli_r = notepad_merahasli; gambarasli_g = notepad_hijauasli;
gambarasli_b = notepad_biruasli; for int i = 0; i 1; i++
{
for int j = 0; j gambarasli_r.Length; j++
{
tulis_r.Writegambarasli_r[i, j].ToString +
\t; }
}
tulis_r.Close; for int i = 0; i 1; i++
{
for int j = 0; j gambarasli_g.Length; j++
{
tulis_g.Writegambarasli_g[i, j].ToString +
\t; }
}
tulis_g.Close; for int i = 0; i 1; i++
{
for int j = 0; j gambarasli_b.Length; j++
{
tulis_b.Writegambarasli_b[i, j].ToString +
\t; }
}
tulis_b.Close;
}
catch Exception v
{
MessageBox.ShowBatal;
} }
Bitmap arithmeticmeanBitmap image
{
int xi = image.Width; int yi = image.Height;
double red = 0, green = 0, blue = 0; double jlhred = 0, jlhgreen = 0, jlhblue = 0;
Bitmap finalimage = new Bitmapxi, yi; for int i = 0; i xi - 2; i++
{
for int j = 0; j yi - 2; j++
{
for int k = i; k = i + 2; k++
{
for int l = j; l = j + 2; l++
{
red = image.GetPixelk, l.R; if red == 0
red = 255;
green = image.GetPixelk, l.G; if green == 0
green = 255;
blue = image.GetPixelk, l.B; if blue == 0
blue = 255; jlhred += red;
jlhgreen += green; jlhblue += blue;
} }
double RED = Math.Roundjlhred 9, 0; double GREEN = Math.Roundjlhgreen 9, 0;
double BLUE = Math.Roundjlhblue 9, 0;
jlhred = 0; jlhgreen = 0; jlhblue = 0;
finalimage.SetPixeli + 1, j + 1, Color.FromA rgb255, intRED, intGREEN, intBLUE;
} }
return finalimage; }
void FilteringClickobject sender, EventArgs e
{
if gbrAsli.Image = null
{
Stopwatch watch = new Stopwatch; running time watch.Start;
gbrFiltering.Image
= arithmeticmeanBitmapgbrAsli.Image; watch.Stop;
RTfilter.Text =
Math.RoundConvert.ToDecimalwatch.ElapsedMilliseconds 1000, 4 .ToString + Sekon;
MSE1.Text
= MSEBitmapgbrAsli.Image, BitmapgbrFiltering.Image.ToString
; PSNR1.Text
= PSNRConvert.ToDoubleMSE1.Text.ToString;
}
else
{
MessageBox.ShowGambar belum dimasukkan;
} }
double MSEBitmap imageAsli, Bitmap imageHasil
{
double sum = 0; double pxAsli, pxHasil, MSE;
for int i = 0; i imageAsli.Height; i++ height
{
for int j = 0; j imageAsli.Width; j++ width
{
pxAsli = imageAsli.GetPixelj, i.R; pxHasil = imageHasil.GetPixelj, i.R;
sum += Math.PowpxAsli - pxHasil, 2;
} }
MSE =
Math.Floorsum imageAsli.Height imageAsli.Width;
return MSE; }
double PSNRdouble MSE
{
double PSNR1 = Math.Round10 Math.Log10Math.Pow255, 2 MSE;
return PSNR1; }
void KompresiClickobject sender, EventArgs e
{
if gbrFiltering.Image = null
{
Stopwatch watch = new Stopwatch;
watch.Start; Bitmap image = new BitmapgbrFiltering.Image;
int xi = image.Width; int yi = image.Height;
double red = 0, green = 0, blue = 0;
array red,green blue yg beda
double[] RED = new double[xi yi]; double[] GREEN = new double[xi yi];
double[] BLUE = new double[xi yi];
array red green blue kseluruhan
double[] arrayred = new double[xi yi]; double[] arraygreen = new double[xi yi];
double[] arrayblue = new double[xi yi]; int acuan = 0, acuan1 = 0, acuan2 = 0, pos = 0, pos1
= 0, pos2 = 0, jumred = 1, jumgreen = 1, jumblue = 1, temp = 0, temp1 = 0, temp2 = 0;
jlh array rgb
double[] kompressred = new double[xi yi]; double[] kompressgreen = new double[xi yi];
double[] kompressblue = new double[xi yi]; double panjang;
for int i = 0; i xi; i++
{
for int j = 0; j yi; j++
{
red = image.GetPixelj, i.R; if red == 0
red = 255;
green = image.GetPixelj, i.G; if green == 0
green = 255;
blue = image.GetPixelj, i.B; if blue == 0
blue = 255; arrayred[acuan] = red;
arraygreen[acuan] = green; arrayblue[acuan] = blue;
pengecekan red yang sama jika tidak sama
if arrayred[pos] = arrayred[acuan]
{ menyimpan hasil red yang sama
kompressred[temp] = jumred; pengecekan jumlah red lebih dari 3
if jumred = 1
{ menulis pixel kompress
RED[temp] = arrayred[pos]; }
variable untuk simpan jumlah kompress temp++;
mengembalikan kembali nilai variabel jumlah red
jumred = 1; variable pindah untuk posisi pixel yg
terkompress pos = acuan;
jika sama }
else
{ menambah nilai kompress
jumred++;
if acuan + 1 == xi yi
{ menyimpan jumlah kompress
kompressred[temp] = jumred + 1; }
} acuan++;
if arraygreen[pos1] = arraygreen[acuan1]
{ kompressgreen[temp1] = jumgreen;
if jumgreen = 1
{ GREEN[temp1] = arraygreen[pos1];
} temp1++;
jumgreen = 1; pos1 = acuan1;
}
else
{ menambah nilai kompress
jumgreen++;
if acuan1 + 1 == xi yi
{ menyimpan jumlah kompress
kompressgreen[temp1] = jumgreen + 1; }
} acuan1++;
if arrayblue[pos2] = arrayblue[acuan2]
{
kompressblue[temp2] = jumblue;
if jumblue = 1
{ BLUE[temp2] = arrayblue[pos2];
} temp2++;
jumblue = 1; pos2 = acuan2;
} jika sama
else
{ menambah nilai kompress
jumblue++; pengecekan akhir pixel
if acuan2 + 1 == xi yi
{ menyimpan jumlah kompress
kompressblue[temp2] = jumblue + 1; }
} variable untuk indek simpan arrayred
acuan2++; }
} panjang = temp;
if temp1 panjang
{ panjang = temp1;
}
if temp2 panjang
{ panjang = temp2;
}
int xii = intMath.Sqrtpanjang - 1; int ret = 0;
Bitmap finalimage = new Bitmapxii, xii; for int i = 0; i xii; i++
{
for int j = 0; j xii; j++
{
finalimage.SetPixelj, i, Color.FromArgb255, intRED[ret], intGREEN[ret], intBLUE[ret];
ret++; }
} gbrKompresi.Image = finalimage;
watch.Stop;
RT2.Text =
Math.RoundConvert.ToDecimalwatch.ElapsedMilliseconds 1000, 4 .ToString + Sekon;
StreamWriter tulis_r = new StreamWriterD:\\Retri Scrib\\cicilan program\\Notepad\\jlh_red_komfil.txt, false;
StreamWriter tulis_g = new StreamWriterD:\\Retri Scrib\\cicilan program\\Notepad\\jlh_green_komfil.txt, false;
StreamWriter tulis_b = new StreamWriterD:\\Retri Scrib\\cicilan program\\Notepad\\jlh_blue_komfil.txt, false;
StreamWriter tulis_rr = new StreamWriterD:\\Retri Scrib\\cicilan program\\Notepad\\piksel_red_kompres.txt, false;
StreamWriter tulis_gg = new StreamWriterD:\\Retri
Scrib\\cicilan
program\\Notepad\\piksel_green_kompres.txt, false; StreamWriter tulis_bb = new StreamWriterD:\\Retri
Scrib\\cicilan program\\Notepad\\array_blue_kompres.txt, false; for int i = 0; i kompressred.Length; i++
{
tulis_r.Writekompressred[i].ToString + \t;
}
tulis_r.Close; for int i = 0; i kompressgreen.Length; i++
{
tulis_g.Writekompressgreen[i].ToString + \t;
}
tulis_g.Close; for int i = 0; i kompressblue.Length; i++
{
tulis_b.Writekompressblue[i].ToString + \t;
}
tulis_b.Close; for int i = 0; i RED.Length; i++
{
tulis_rr.WriteRED[i].ToString + \t;
}
tulis_rr.Close; for int i = 0; i GREEN.Length; i++
{
tulis_gg.WriteGREEN[i].ToString + \t;
}
tulis_gg.Close; for int i = 0; i BLUE.Length; i++
{
tulis_bb.WriteBLUE[i].ToString + \t;
}
tulis_bb.Close;
}
else
{
MessageBox.ShowBelum ada gambar filtering;
} }
void Button3Clickobject sender, EventArgs e
{
if gbrAsli.Image = null
{
Stopwatch watch = new Stopwatch; watch.Start;
Bitmap image = new BitmapgbrAsli.Image; int xi = image.Width;
int yi = image.Height; double red = 0, green = 0, blue = 0;
array red,green blue yg beda
double[] RED = new double[xi yi]; double[] GREEN = new double[xi yi];
double[] BLUE = new double[xi yi];
array red green blue kseluruhan
double[] arrayred = new double[xi yi]; double[] arraygreen = new double[xi yi];
double[] arrayblue = new double[xi yi]; int acuan = 0, acuan1 = 0, acuan2 = 0, pos = 0, pos1
= 0, pos2 = 0, jumred = 1, jumgreen = 1, jumblue = 1, temp = 0, temp1 = 0, temp2 = 0;
jlh array rgb
double[] kompressred = new double[xi yi]; double[] kompressgreen = new double[xi yi];
double[] kompressblue = new double[xi yi]; double panjang;
for int i = 0; i xi; i++
{
for int j = 0; j yi; j++
{
red = image.GetPixelj, i.R; if red == 0
red = 255;
green = image.GetPixelj, i.G; if green == 0
green = 255;
blue = image.GetPixelj, i.B; if blue == 0
blue = 255; arrayred[acuan] = red;
arraygreen[acuan] = green; arrayblue[acuan] = blue;
pengecekan red yang sama jika tidak sama
if arrayred[pos] = arrayred[acuan]
{ menyimpan hasil red yang sama
kompressred[temp] = jumred; pengecekan jumlah red lebih dari 3
if jumred = 1
{ menulis pixel kompress
RED[temp] = arrayred[pos]; }
variable untuk simpan jumlah kompress temp++;
mengembalikan kembali nilai variabel jumlah red
jumred = 1; variable pindah untuk posisi pixel yg
terkompress pos = acuan;
jika sama }
else
{ menambah nilai kompress
jumred++;
if acuan + 1 == xi yi
{ menyimpan jumlah kompress
kompressred[temp] = jumred + 1; }
} acuan++;
if arraygreen[pos1] = arraygreen[acuan1]
{ kompressgreen[temp1] = jumgreen;
if jumgreen = 1
{ GREEN[temp1] = arraygreen[pos1];
} temp1++;
jumgreen = 1; pos1 = acuan1;
}
else
{ menambah nilai kompress
jumgreen++;
if acuan1 + 1 == xi yi
{ menyimpan jumlah kompress
kompressgreen[temp1] = jumgreen + 1; }
} acuan1++;
if arrayblue[pos2] = arrayblue[acuan2]
{ kompressblue[temp2] = jumblue;
if jumblue = 1
{ BLUE[temp2] = arrayblue[pos2];
} temp2++;
jumblue = 1; pos2 = acuan2;
} jika sama
else
{ menambah nilai kompress
jumblue++; pengecekan akhir pixel
if acuan2 + 1 == xi yi
{ menyimpan jumlah kompress
kompressblue[temp2] = jumblue + 1; }
} variable untuk indek simpan arrayred
acuan2++; }
} panjang = temp;
if temp1 panjang
{ panjang = temp1;
}
if temp2 panjang
{ panjang = temp2;
}
int xii = intMath.Sqrtpanjang - 1; int ret = 0;
Bitmap finalimage = new Bitmapxii, xii; for int i = 0; i xii; i++
{
for int j = 0; j xii; j++
{
finalimage.SetPixelj, i, Color.FromArgb255, intRED[ret], intGREEN[ret], intBLUE[ret];
ret++; }
} gbrAsliKompres.Image = finalimage;
watch.Stop;
RT3.Text =
Math.RoundConvert.ToDecimalwatch.ElapsedMilliseconds 1000, 4 .ToString + Sekon;
StreamWriter tulis_r = new StreamWriterD:\\Retri
Scrib\\cicilan
program\\Notepad\\asli_jlh_red_kompres.txt, false; StreamWriter tulis_g = new StreamWriterD:\\Retri
Scrib\\cicilan
program\\Notepad\\asli_jlh_green_kompres.txt, false; StreamWriter tulis_b = new StreamWriterD:\\Retri
Scrib\\cicilan
program\\Notepad\\asli_jlh_blue_kompres.txt, false; StreamWriter tulis_rr = new StreamWriterD:\\Retri
Scrib\\cicilan
program\\Notepad\\asli_array_red_beda_asli.txt, false; StreamWriter tulis_gg = new StreamWriterD:\\Retri
Scrib\\cicilan
program\\Notepad\\asli_array_green_beda_asli.txt, false; StreamWriter tulis_bb = new StreamWriterD:\\Retri
Scrib\\cicilan
program\\Notepad\\asli_array_blue_beda_asli.txt, false; for int i = 0; i kompressred.Length; i++
{
tulis_r.Writekompressred[i].ToString + \t;
}
tulis_r.Close; for int i = 0; i kompressgreen.Length; i++
{
tulis_g.Writekompressgreen[i].ToString + \t;
}
tulis_g.Close; for int i = 0; i kompressblue.Length; i++
{
tulis_b.Writekompressblue[i].ToString + \t;
}
tulis_b.Close; for int i = 0; i RED.Length; i++
{
tulis_rr.WriteRED[i].ToString + \t;
}
tulis_rr.Close; for int i = 0; i GREEN.Length; i++
{
tulis_gg.WriteGREEN[i].ToString + \t;
}
tulis_gg.Close; for int i = 0; i BLUE.Length; i++
{
tulis_bb.WriteBLUE[i].ToString + \t;
}
tulis_bb.Close;
}
else
{
MessageBox.ShowGambar belum dimasukkan;
} }
void Simpan1Clickobject sender, EventArgs e
{
SaveFileDialog simpan = new SaveFileDialog;
simpan.Filter = image Files| .bmp; simpan.FileName = .bmp;
if simpan.ShowDialog == DialogResult.OK
{
gbrFiltering.Image.Savesimpan.FileName, ImageFor
mat.Bmp;
MessageBox.Showgambar sudah
disimpan, save, MessageBoxButtons.OK, MessageBoxIcon.Informati on;
}
else
{
MessageBox.Showgambar tidak tersimpan ;
} tulis
StreamWriter tulis_r = new StreamWriterD:\\Retri Scrib\\cicilan program\\Notepad\\gbr_filter_red.txt, false;
StreamWriter tulis_g = new StreamWriterD:\\Retri Scrib\\cicilan program\\Notepad\\gbr_filter_green.txt, false;
StreamWriter tulis_b = new StreamWriterD:\\Retri Scrib\\cicilan program\\Notepad\\gbr_filter_blue.txt, false;
Bitmap filter = BitmapgbrFiltering.Image;
int[,] gambarasli_r = new int[1, filter.Width filter.Height];
int[,] gambarasli_g
= new int[1, filter.Width filter.Height]; int[,] gambarasli_b
= new int[1, filter.Width filter.Height]; gambarasli_r = notepad_merahfilter;
gambarasli_g = notepad_hijaufilter; gambarasli_b = notepad_birufilter;
for int i = 0; i 1; i++
{
for int j = 0; j gambarasli_r.Length; j++
{
tulis_r.Writegambarasli_r[i, j].ToString +
\t; }
}
tulis_r.Close; for int i = 0; i 1; i++
{
for int j = 0; j gambarasli_g.Length; j++
{
tulis_g.Writegambarasli_g[i, j].ToString +
\t; }
}
tulis_g.Close; for int i = 0; i 1; i++
{
for int j = 0; j gambarasli_b.Length; j++
{
tulis_b.Writegambarasli_b[i, j].ToString +
\t; }
}
tulis_b.Close;
}
void Simpan2Clickobject sender, EventArgs e
{
SaveFileDialog simpan = new SaveFileDialog;
simpan.Filter = image Files| .bmp; simpan.FileName = .bmp;
if simpan.ShowDialog == DialogResult.OK
{
gbrKompresi.Image.Savesimpan.FileName, ImageForm
at.Bmp;
MessageBox.Showgambar sudah
disimpan, save, MessageBoxButtons.OK, MessageBoxIcon.Informati on;
}
else
{
MessageBox.Showgambar tidak tersimpan ;
}
StreamWriter tulis_r = new StreamWriterD:\\Retri Scrib\\cicilan program\\Notepad\\komfil_red.txt, false;
StreamWriter tulis_g = new StreamWriterD:\\Retri Scrib\\cicilan program\\Notepad\\komfil_green.txt, false;
StreamWriter tulis_b = new StreamWriterD:\\Retri Scrib\\cicilan program\\Notepad\\komfil_blue.txt, false;
Bitmap asli = BitmapgbrKompresi.Image;
int[,] gambarasli_r = new int[1, asli.Width asli.Height];
int[,] gambarasli_g = new int[1, asli.Width asli.Height];
int[,] gambarasli_b = new int[1, asli.Width asli.Height];
gambarasli_r = notepad_merahasli; gambarasli_g = notepad_hijauasli;
gambarasli_b = notepad_biruasli; for int i = 0; i 1; i++
{
for int j = 0; j gambarasli_r.Length; j++
{
tulis_r.Writegambarasli_r[i, j].ToString +
\t; }
}
tulis_r.Close; for int i = 0; i 1; i++
{
for int j = 0; j gambarasli_g.Length; j++
{
tulis_g.Writegambarasli_g[i, j].ToString +
\t; }
}
tulis_g.Close; for int i = 0; i 1; i++
{
for int j = 0; j gambarasli_b.Length; j++
{
tulis_b.Writegambarasli_b[i, j].ToString +
\t; }
}
tulis_b.Close;
}
void Simpan3Clickobject sender, EventArgs e
{
SaveFileDialog simpan = new SaveFileDialog;
simpan.Filter = image Files| .bmp; simpan.FileName = .bmp;
if simpan.ShowDialog == DialogResult.OK
{
gbrAsliKompres.Image.Savesimpan.FileName, ImageF
ormat.Bmp;
MessageBox.Showgambar sudah
disimpan, save, MessageBoxButtons.OK, MessageBoxIcon.Informati on;
}
else
{
MessageBox.Showgambar tidak tersimpan ;
}
StreamWriter tulis_r = new StreamWriterD:\\Retri
Scrib\\cicilan
program\\Notepad\\asli_kompres_red_asli.txt, false; StreamWriter tulis_g = new StreamWriterD:\\Retri
Scrib\\cicilan
program\\Notepad\\asli_kompres_green_asli.txt, false; StreamWriter tulis_b = new StreamWriterD:\\Retri
Scrib\\cicilan
program\\Notepad\\asli_komres_blue_asli.txt, false;
Bitmap asli = BitmapgbrAsliKompres.Image;
int[,] gambarasli_r = new int[1, asli.Width asli.Height];
int[,] gambarasli_g = new int[1, asli.Width asli.Height];
int[,] gambarasli_b = new int[1, asli.Width asli.Height];
gambarasli_r = notepad_merahasli; gambarasli_g = notepad_hijauasli;
gambarasli_b = notepad_biruasli; for int i = 0; i 1; i++
{
for int j = 0; j gambarasli_r.Length; j++
{
tulis_r.Writegambarasli_r[i, j].ToString +
\t; }
}
tulis_r.Close; for int i = 0; i 1; i++
{
for int j = 0; j gambarasli_g.Length; j++
{
tulis_g.Writegambarasli_g[i, j].ToString +
\t; }
}
tulis_g.Close; for int i = 0; i 1; i++
{
for int j = 0; j gambarasli_b.Length; j++
{
tulis_b.Writegambarasli_b[i, j].ToString +
\t; }
}
tulis_b.Close;
}
private void dekompresFilter_Clickobject sender, EventArgs e
{
if gbrKompresi.Image = null
{
Stopwatch watch = new Stopwatch; watch.Start;
double[] kompressred = new double[gbrKompresi.Image.WidthgbrKompresi.Image.Height];
double[] kompressgreen = new double[gbrKompresi.Image.WidthgbrKompresi.Image.Height];
double[] kompressblue = new double[gbrKompresi.Image.WidthgbrKompresi.Image.Height];
double[] jlh_red = new double[1000000]; double[] jlh_green = new double[1000000];
double[] jlh_blue = new double[1000000]; double[] red = new double[1000000];
double[] green = new double[1000000]; double[] blue = new double[1000000];
int a = 0; StreamReader baca3 = new StreamReaderD:\\Retri
Scrib\\cicilan program\\Notepad\\array_blue_kompres.txt;
StreamReader baca2 = new StreamReaderD:\\Retri
Scrib\\cicilan program\\Notepad\\piksel_green_kompres.txt;
StreamReader baca1 = new StreamReaderD:\\Retri
Scrib\\cicilan program\\Notepad\\piksel_red_kompres.txt;
StreamReader baca4 = new StreamReaderD:\\Retri
Scrib\\cicilan program\\Notepad\\jlh_red_komfil.txt;
StreamReader baca5 = new StreamReaderD:\\Retri
Scrib\\cicilan program\\Notepad\\jlh_green_komfil.txt;
StreamReader baca6 = new StreamReaderD:\\Retri
Scrib\\cicilan program\\Notepad\\jlh_blue_komfil.txt;
StreamWriter tulis_red = new StreamWriterD:\\Retri
Scrib\\cicilan
program\\Notepad\\dekompres_red_filter.txt, false;
StreamWriter tulis_green
= new StreamWriterD:\\Retri Scrib\\cicilan program\\Notepad\\dekompres_green_filter.txt, false;
StreamWriter tulis_blue
= new StreamWriterD:\\Retri Scrib\\cicilan program\\Notepad\\dekompres_blue_filter.txt, false;
kompressred = ambil_nilaibaca1; kompressgreen = ambil_nilaibaca2;
kompressblue = ambil_nilaibaca3; jlh_red = ambil_nilaibaca4;
jlh_green = ambil_nilaibaca5; jlh_blue = ambil_nilaibaca6;
for int i
= 0; i gbrKompresi.Image.WidthgbrKompresi.Image.Height; i++ {
for int j = 0; j jlh_red[i]; j++
{ red[a] = kompressred[i];
a++; }
} MessageBox.Showred.ToString;
int b = 0; for int i
= 0; i gbrKompresi.Image.WidthgbrKompresi.Image.Height; i++ {
for int j = 0; j jlh_green[i]; j++
{ green[b] = kompressgreen[i];
b++; }
}
int c = 0; for int i
= 0; i gbrKompresi.Image.WidthgbrKompresi.Image.Height; i++ {
for int j = 0; j jlh_blue[i]; j++
{ blue[c] = kompressblue[i];
c++; }
} membuat matriks
int[,] pixel_red = new int[gbrFiltering.Image.Width , gbrFiltering.Image.Height];
int[,] pixel_green = new int[gbrFiltering.Image.Width , gbrFiltering.Image.Height];
int[,] pixel_blue = new int[gbrFiltering.Image.Width , gbrFiltering.Image.Height];
int indeks = 0;
Bitmap dekompresi
= new BitmapgbrFiltering.Image.Width , gbrFiltering.Image.Height
;
for int i = 0; i gbrFiltering.Image.Width; i++
{
for int j
= 0; j gbrFiltering.Image.Height; j++ {
pixel_red[j, i] =
Convert.Topnt32red[indeks];
pixel_green[j, i] =
Convert.Topnt32green[indeks];
pixel_blue[j, i] =
Convert.Topnt32blue[indeks];
indeks++; }
} buat gbr
for int i = 0; i gbrFiltering.Image.Width; i++
{
for int j
= 0; j gbrFiltering.Image.Height; j++ {
Color newpixel =
Color.FromArgb255, pixel_red[j,i], pixel_green[j,i], pixel_blue[
j,i];
dekompresi.SetPixelj, i, newpixel;
} }
for int i = 0; i gbrFiltering.Image.Width; i++
{
for int j
= 0; j gbrFiltering.Image.Height; j++ {
Color cc = dekompresi.GetPixelj, i; int pixel = cc.R;
tulis_red.Writepixel_red[j,i] + \t;
}
tulis_red.Writetulis_red.NewLine;
}
tulis_red.Close;
for int i = 0; i gbrFiltering.Image.Width; i++
{
for int j
= 0; j gbrFiltering.Image.Height; j++ {
Color cc = dekompresi.GetPixelj, i; int pixel = cc.G;
tulis_green.Writepixel_green[j,i] + \t;
}
tulis_green.Writetulis_green.NewLine;
}
tulis_green.Close; for int i = 0; i gbrFiltering.Image.Width; i++
{
for int j
= 0; j gbrFiltering.Image.Height; j++ {
Color cc = dekompresi.GetPixelj, i; int pixel = cc.B;
tulis_blue.Writepixel_blue[j,i] + \t;
}
tulis_blue.Writetulis_blue.NewLine;
}
tulis_blue.Close;
gbrDekompresiFilter.Image = dekompresi;
watch.Stop;
RT4.Text =
Math.RoundConvert.ToDecimalwatch.ElapsedMilliseconds 1000, 4 .ToString + Sekon;
MSE2.Text
= MSEBitmapgbrFiltering.Image, BitmapgbrDekompresiFilter.Ima ge.ToString;
PSNR2.Text
= PSNRConvert.ToDoubleMSE2.Text.ToString;
}
else
{
MessageBox.Showsalah;
} }
void Simpan4Clickobject sender, EventArgs e
{
SaveFileDialog simpan = new SaveFileDialog;
simpan.Filter = image Files| .bmp; simpan.FileName = .bmp;
if simpan.ShowDialog == DialogResult.OK
{
gbrDekompresiFilter.Image.Savesimpan.FileName, I
mageFormat.Bmp;
MessageBox.Showgambar sudah
disimpan, save, MessageBoxButtons.OK, MessageBoxIcon.Informati on;
}
else
{
MessageBox.Showgambar tidak tersimpan ;
} tulis
StreamWriter tulis_r = new StreamWriterD:\\Retri
Scrib\\cicilan
program\\Notepad\\gbr_dekompresi_filter_red.txt, false; StreamWriter tulis_g = new StreamWriterD:\\Retri
Scrib\\cicilan
program\\Notepad\\gbr_dekompresi_filter_green.txt, false; StreamWriter tulis_b = new StreamWriterD:\\Retri
Scrib\\cicilan
program\\Notepad\\gbr_dekompresi_filter_blue.txt, false;
Bitmap dekompresFilter = BitmapgbrDekompresiFilter.Image;
int[,] gambarasli_r = new int[1, dekompresFilter.Width dekompresFilter.Height];
int[,] gambarasli_g = new int[1, dekompresFilter.Width dekompresFilter.Height];
int[,] gambarasli_b = new int[1, dekompresFilter.Width dekompresFilter.Height];
gambarasli_r = notepad_merahdekompresFilter; gambarasli_g = notepad_hijaudekompresFilter;
gambarasli_b = notepad_birudekompresFilter; for int i = 0; i 1; i++
{
for int j = 0; j gambarasli_r.Length; j++
{
tulis_r.Writegambarasli_r[i, j].ToString +
\t; }
}
tulis_r.Close; for int i = 0; i 1; i++
{
for int j = 0; j gambarasli_g.Length; j++
{
tulis_g.Writegambarasli_g[i, j].ToString +
\t; }
}
tulis_g.Close; for int i = 0; i 1; i++
{
for int j = 0; j gambarasli_b.Length; j++
{
tulis_b.Writegambarasli_b[i, j].ToString +
\t; }
}
tulis_b.Close;
}
void OpenKomasClickobject sender, EventArgs e
{
OpenFileDialog open = new OpenFileDialog;
open.Filter = Image File.bmp|.bmp;
if open.ShowDialog == DialogResult.OK
{
Bitmap gbr = new Bitmapopen.FileName; var fileinfo = new Filepnfoopen.FileName;
gbrAsliKompres.SizeMode = PictureBoxSizeMode.StretchImage;
gbrAsliKompres.ImageLocation = open.FileName;
Bitmap bit = new Bitmapopen.FileName;
ukuran4.Text
= fileinfo.Length 1024.ToString + KB;
nilaiKompres = fileinfo.Length1024;
height2.Text = bit.Height.ToString; width2.Text = bit.Width.ToString;
rasio = 100 - nilaiKompresnilaiAsli100;
RK2.Text
= Math.Roundrasio,2.ToString + ;
gbrAsliKompres.Image = bit; }
}
void OpenDekomfilClickobject sender, EventArgs e
{
OpenFileDialog open = new OpenFileDialog;
open.Filter = Image File.bmp|.bmp;
if open.ShowDialog == DialogResult.OK
{
Bitmap gbr = new Bitmapopen.FileName; var fileinfo = new Filepnfoopen.FileName;
gbrDekompresiFilter.SizeMode = PictureBoxSizeMode.StretchImage;
gbrDekompresiFilter.ImageLocation = open.FileName;
Bitmap bit = new Bitmapopen.FileName;
ukuran5.Text
= fileinfo.Length 1024.ToString + KB; height3.Text = bit.Height.ToString;
width3.Text = bit.Width.ToString;
gbrDekompresiFilter.Image = bit; }
}
DAFTAR RIWAYAT HIDUP
DATA PRIBADI
Nama Lengkap : Retri Witra Nastiti
Jenis Kelamin : Perempuan
Tempat, Tanggal Lahir : Sei Rotan, 30 Desember 1992
Alamat : Jl. Nusa Indah , Gg.Kenanga No.060, Kec. Bt.Kuis
Agama : Islam
E-mail : retri.nastitigmail.com
Pendidikan Terakhir : Universitas Sumatera Utara Medan, Fakultas Ilmu
Komputer dan Teknologi Informasi Jurusan S-1 Ilmu Komputer
PENDIDIKAN FORMAL
2011 – 2015 : S1 Ilmu Komputer Universitas Sumatera Utara, Medan
2009 – 2011 : SMA Negeri 8 Medan
2006 – 2008 : SMP Negeri 1 Percut Sei Tuan
1999 – 2005 : SD Negeri 104230 Batang Kuis
PENGALAMAN ORGANISASI DAN KEGIATAN ILMIAH
Anggota UKMI Al-Khuwarizmi periode 2012-2013 Sekretaris Bidang Kaderisasi UKMI Al-Khuwarizmi tahun 2013
Anggota UKM Sikonek USU tahun 2013-2014 Sekretaris Bidang Kaderisasi KAM Rabbani Fasilkom-TI USU tahun 2014
Sekretaris Departemen Agama Islam PEMA Fasilkom-TI USU tahun 2014 Anggota Majelis Permusyawaratan Mahasiswa Universitas MPMU USU tahun 2014
Anggota UKMI Ad-Dakwah USU tahun 2015
PENGALAMAN PEKERJAAN
Mengajar Privat tahun 2015 Mengajar Ngaji tahun 2015-sekarang
Alasdair, McAndrew. 2004. An Introduction to Digital Image Processing with Matlab. Notes for SCM2511 Image Processing 1, School of Computer Science
and Mathematics Victoria University of Technology.
Alatas, Putri. 2009. Implementasi Teknik Steganografi dengan Metode LSB pada Citra Digital. Tugas Akhir. Fakultas Ilmu Komputer dan Teknologi Informasi.
Sistem Informasi. Universitas Gunadarma.
Faradisa, Irmalia Suryani dan Bara Firmana Budiono. 2011. Implementasi Metode HUFFMAN sebagai Teknik Kompresi CItra.Elektro Eltek: 176-182.
Hariyati, Zulwita. 2014. Implementasi Metode Median Filtering dan Kompresi JPEG Untuk Citra BMP. Skripsi. Medan. Universitas Sumatera Utara.
Jalaludin, A Melita, Y. 2012.Implementasi Metode Run Length Encoding RLE untuk Kompresi Citra.Teknika. Volume 3. Nomor 2. Hal 249-254.
Jannah, Asmaniatul. 2008. Analisis Perbandingan Metode Filter Gaussian, Mean Dan Median Terhadap Reduksi Noise Salt And Peppers. Skripsi. Malang:
Universitas Islam Negeri Malang.
Juma’in Melita, Yuliana. 2011. Kompresi Gambar atau Citra Menggunakan Discrete Cosine Transform. Jurnal. Surabaya: Sekolah Tinggi Teknik
Surabaya.Volume 3. Hal 437- 442.
Kadir, A. dan Susanto, A.2013. Teori dan Aplikasi Pengolahan Citra. ANDI: Yogyakarta.
Kusumanto, RD. Tompunu, A.N. 2011. Pengolahan Citra Digital untuk Mendeteksi Obyek Menggunakan Pengolahan Warna Model Normalisasi RGB. Jurnal
Semantik 2011 .
Neta, M.R.A. 2013. Perbandingan Algoritma Kompresi Terhadap Objek Citra Menggunakan JAVA. Jurnal SEMANTIK 2013: 224 – 230.
Putra, Darma. 2010. Pengolahan Citra Digital. Yogyakarta: ANDI.
Salomon, D. 2007. Variable-length Codes for Data Compression. Springer.
Sholeh, Muhammad Badduring, A. 2012. Rancang Bangun Aplikasi Pengaburan Gambar.
Prosiding Seminar Nasional Aplikasi Sains Teknologi SNAST Periode III, 330-336. Yogyakarta.
Sutoyo, T., Mulyanto, E., Suhartono, V., Nurhayati, O.D. Wijinarto.2009. Teori Pengolahan Citra Digital. ANDI: Yogyakarta.
Syarif, Syafruddin.,dkk. 2012. Sistem Cerdas Deteksi Citra Dengan Metode Discrete Cosine Transform. Prosiding 2012. Makassar: Universitas Hasanuddin.
Volume 6. Hal TE15-1 – TE15-14.
BAB 3 ANALISIS DAN PERANCANGAN SISTEM
3.1 Analisis Sistem
Langkah pertama dalam perancangan sebuah sistem adalah analisis sistem. Tahap ini akan mengidentifikasi seluruh komponen dan kebutuhan sistem agar sistem dapat
berjalan sesuai dengan tujuan penelitian yang diinginkan dan dapat bekerja secara optimal. Adapun pada penelitian ini sistem yang akan dibuat adalah sebuah sistem
yang mampu menampilkan kinerja dari metode arithmetic mean filter dan metode run length encoding pada sebuah citra berformat .bmp.
3.1.1 Analisis Masalah
Perancangan sistem yang dilakukan diharapakan dapat menyelesaikan masalah yang dibangun dalam penelitian ini. Yakni, bagaimana hasil kinerja dari metode run length
encoding dalam mengkompresi sebuah citra digital berformat bmp , dimana citra tersebut telah melalui proses filtering terlebih dahulu menggunakan metode arithmetic
mean filter. Parameter dari penelitian ini adalah Mean Square Error MSE, Peak Signal to Noise Ratio PSNR, ukuran file citra, rasio kompresi dan running time.
3.1.2 Analisis Persyaratan
Analisi persyaratan terbagi atas dua bagian, yaitu persyaratan fungsional dam persyaratan nonfungsional.
3.1.2.1 Persyaratan Fungsional
Persyaratan fungsional adalah tahapan yang menggambarkan dan memaparkan tentang fungsi-fungsi dan kerja yang harus dan dapat dilakukan oleh sistem yang akan
dibangun. Adapun sistem dari implementasi metode Arithmetic Mean Filter dan Run Length Encoding RLE dalam penelitian ini memiliki persyaratan fungsional sebagai
berikut:
1. Sistem mampu menampilkan citra hasil filtering menggunakan metode Arithmetic Mean Filter.
2. Sistem mampu menampilkan citra hasil kompresi menggunakan metode Run Length Encoding RLE.
3. Kinerja dari metode filtering dan kompresi dapat dilihat dengan parameter MSE, PSNR, ukuran file citra, rasio kompresi, dan running time.
4. Citra yang mampu ditampung oleh sistem adalah citra dengan format BMP maksimal dimensi 500 x 500 pixel.
5. Citra yang telah dikompresi dapat didekompresi oleh sistem.
3.1.2.2 Persyaratan Non-Fungsional Persyaratan non-fungsional dari sistem yang akan dirancang dalam penelitian ini
adalah:
1. User friendly, artinya sistem yang dibangun harus mudah digunakan dan difahami oleh user.
2. Citra hasil filtering, kompresi dan dekompresi dapat disimpan dan dalam format BMP.
3. Sistem yang dibangun harus bersifat ekonomis, artinya tidak memerlukan biaya yang besar dalam penggunaannya.
3.1.3 Analisis Proses Sistem yang dibangun dalam penelitian ini akan menampilkan tiga proses penting,
yaitu proses filtering, kompresi, dan dekompresi pada citra BMP. Proses filtering menggunakan metode Arithmetic Mean Filter dan proses kompresi menggunakan
metode Run Length Encoding RLE. Hasil dari masing-masing proses dapat disimpan dengan format keluaran .bmp.
Tahap pertama yang dilakukan adalah citra akan difiltering, kemudian dilakukan kompresi dan terakhir dekompresi. Dalam proses kompresi dan dekompresi, citra yang
akan dieksekusi adalah citra hasil filtering dan citra asli citra tanpa proses filtering yang akan diproses secara bergantian. Hasil kompresi dan dekompresi dari kedua citra
tersebut menggunakan parameter MSE Mean Square Error, PSNR Peak Signal to Noise Ratio, ukuran citra, rasio kompresi, dan running time.
3.1.3.1 Use Case Diagram Use case diagram menggambarkan fungsionalitas sistem secara keseluruhan, dan
menunjukkan bagaimana interaksi antara user dan sistem. Berikut gambar 3.1 use case diagram sistem yang dibangun.
Gambar 3.B. Use Case Diagram
Dari gambar 3.1 di atas menjelaskan bahwa user dapat melakukan proses filtering, kompresi, dan dekompresi.
Berikut ini merupakan spesifikasi Use Case untuk filtering dapat dilihat pada Tabel
3.1.
Tabel 3.B Tabel Use Case Proses filtering dengan Arithmetic Mean Filter
Name Proses filtering dengan Arithmetic Mean Filter
Actor User
Description Melakukan proses filtering menggunakan metode
Arithmetic Mean Filter Preconditions
User mengakses menu testing Basic Flows
1.User menginput citra .bmp untuk di filter 2.Sistem menampilkan citra yang telah diinput
2.User mengakses tombol filtering 3.Sistem menampilkan citra hasil filtering
4.User mengakses tombol simpan Alternative Flows
- Exception Flows
- Post Conditions
User dapat melihat citra hasil filtering
Berikut ini merupakan spesifikasi Use Case untuk kompresi citra dapat dilihat pada
Tabel 3.2.
Tabel 3.2 Tabel Use Case Proses kompresi dengan Run Length Encoding RLE
Name Proses kompresi dengan Run Length Encoding RLE
Actor User
Description Melakukan proses kompresi menggunakan metode Run
Length Encoding RLE Preconditions
User mengakses menu testing Basic Flows
1. User mengakses tombol kompresi untuk citra hasil filtering
2. Sistem menampilkan citra hasil kompresi untuk citra filtering
3. User mengakses tombol simpan 4. Citra tersimpan
5. User mengakses tombol kompresi untuk citra asli 6. Sistem menampilkan citra hasil kompresi untuk citra asli
7. User mengakses tombol simpan 8. Citra tersimpan
Alternative Flows -
Exception Flows -
Post Conditions User dapat melihat citra hasil kompresi
Berikut ini merupakan spesifikasi Use Case untuk de kompresi citra dapat dilihat pada
Tabel 3.3.
Tabel 3.3 Tabel Use Case Proses dekompresi
Name Proses dekompresi
Actor User
Description Melakukan proses dekompresi citra
Preconditions User mengakses menu testing
Basic Flows 1. User mengakses tombol dekompresi untuk citra hasil
filtering 2. Sistem menampilkan citra hasil dekompresi
3. User mengakses tombol simpan untuk citra hasil dekompresi
4. Citra tersimpan 5. User mengakses tombol dekompresi untuk citra asli
6. Sistem menampilkan citra hasil dekompresi 7. User mengakses tombol simpan
8. Citra tersimpan Alternative Flows
- Exception Flows
- Post Conditions
User dapat melihat citra hasil dekompresi
3.1.3.2 Activity Diagram Activity diagram adalah diagram yang menggambarkan alur kegiatan penggunaan
sistem dalam mengeksekusi tujuan yang diinginkan. Berikut ini gambar 3.2 activity diagram proses filtering.
Gambar 3.2 Activity Diagram Proses Filtering
Berikut ini gambar 3.3 menunjukkan activity diagram proses kompresi pada citra.
Gambar 3.3 Activity Diagram Proses Kompresi
Berikut ini gambar 3.4 menunjukkan activity diagram proses dekompresi pada citra.
Gambar 3.4 Activity Diagram Proses Dekompresi
3.1.3.3 Squence Diagram
Squence diagram adalah sebuah diagram yang menggambarkan interaksi antar objek dari sebuah sistem berdasarkan urutan waktu pemrosesan. Berikut ini gambar 3.5
menunjukkan squence diagram sistem dalam penelitian ini.
Gambar 3.5 Sequence Diagram Sistem
3.1.3.4 Analisis Proses Metode Arithmetic Mean Filter
Berikut ini merupakan contoh penggunaan metode arithmetic mean filter. Dimisalkan sebuah matriks citra 6x6 yang dapat dilihat pada tabel 3.4 berikut:
Tabel 3.4 Matriks Citra 6x6
Untuk melakukan proses filtering terlebih dahulu
tentukan ukuran kernel yang
akan digunakan,
maka dalam penelitian ini kernel yang digunakan
adalah kernel
3x3. Kemudian proses filtering
dimulai dari piksel paling kiri atas, seperti berikut:
Kernel 3x3
Matriks citra 6x6
Maka kernel 3x3 yang telah terpilih dilakukan perhitungan sesuai dengan rumus dari metode
arithmetic mean filter, yakni sebagai berikut:
x,y = =
= 40
Hasil dari perhitungan kernel 3x3 di atas menjadi nilai matriks baru pada piksel yang berkoordinat 1,1 atau piksel yang terletak di tengah pada kernel 3x3 yang telah
dipilih, dapat dilihat sebagai berikut: 12 9
4 3
8 9
1 2
22 1 2
8 8
8 3
3 4
3
22 5 3
3 9
9 9
43 4 5
1 2
8 8
7 6
6
44 4 4
4 4
8 6
6 6
5
97 1 2
1 2
4 3
4 3
4 3
12 9 4
3 8
9 1
2
22 1 2
8 8
8 3
3 4
3
22 5 3
3 9
9 9
43 4 5
1 2
8 8
7 6
6
44 4 4
4 4
8 6
6 6
5
97 1 2
1 2
4 3
4 3
4 3
1 2
9 4
3
2 2
1 2
8
2 2
5 3
3
1,1
Kernel 3x3
Matriks Citra 6x6
Lakukan dengan cara yang sama untuk piksel dan
kernel selanjutnya, seperti di bawah ini.
Kernel 3x3
Matriks citra 6x6
x,y = =
= 63
Maka nilai matriks citra sekarang adalah: 1
2 9
4 3
2 2
4 8
2 2
5 3
3 12 9
4 3
8 9
1 2
22 4 8
8 8
3 3
4 3
22 5 3
3 9
9 9
43 4 5
1 2
8 8
7 6
6
44 4 4
4 4
8 6
6 6
5
97 1 2
1 2
4 3
4 3
4 3
12 9 4
3 8
9 1
2
22 1 2
8 8
8 3
3 4
3
22 5 3
3 9
9 9
43 4 5
1 2
8 8
7 6
6
44 4 4
4 4
8 6
6 6
5
97 1 2
1 2
4 3
4 3
4 3
9 4
3 8
1 2
8 8
8
5 3
3 9
12 9 4
3 8
9 1
2
22 4 6
3 8
8 3
3 4
3
22 5 3
3 9
9 9
Piksel tengah dari
kernel 3x3
Begitu seterusnya hingga perhitungan kernel 3x3
mencapai piksel paling kanan bawah, berikut hasil
matriks keseluruhannya pada tabel 3.5.
Tabel 3.5 Hasil Filtering Matriks Citra 6x6
3.1.3.5 Analisis Proses Metode Run Length Encoding RLE
Seperti pada metode filtering sebelumnya, berikut
ini merupakan
contoh penggunaan
metode run length encoding RLE.
Dimisalkan pula
sebuah matriks citra 5x5 yang dapat dilihat pada
tabel 3.6 berikut.
Tabel 3.6 Matriks Citra Hasil Filtering
43 4 5
1 2
8 8
7 6
6
44 4 4
4 4
8 6
6 6
5
97 1 2
1 2
4 3
4 3
4 3
12 9 4
3 8
9 1
2
22 4 6
3 7
6 8
4 3
22 3 5
5 4
6 6
7 4
9
43 3 7
5 3
6 5
7 9
6 6
44 3 9
4 1
5 2
6 4
6 5
97 1 2
1 2
4 3
4 3
4 3
12 9 4
3 8
9 1
2
22 4 6
3 7
6 8
4 3
22 3 5
5 4
6 6
7 4
9
43 3 7
5 3
6 5
7 9
6 6
Proses pertama dalam metode run length encoding adalah nilai matriks citra 5x5 tersebut dibuat dalam bentuk satu baris, seperti berikut ini.
12 90 43 80 90 12 22 40 63 70 68 43 22 35 54 66 74 90 43 37 53 65 79 66 44 39 41 52 64 65 97 12 12 43 43 43
Dari baris matriks citra di atas dapat diketahui bahwa
nilai 12 muncul 1 kali, 80 muncul 1 kali, nilai 88 1
kali, dan seterusnya. Maka di dapat kode RLE nya
seperti berikut ini:
12 1 90 1 43 1 80 1 90 1 12 1 22 1 40 1 63 1 70 1 68 1
43 1 22 1 35 1 54 1 66 1 74 1 90 1 43 1 37 1 53 1 65 1
79 1 66 1 44 1 39 1 41 1 52 1 64 1 65 1 97 1 12 2 43 3
Dari perhitungan di atas terdapat 33 nilai piksel dengan masing jumlahnya yang mengikuti. Maka nilai piksel dan jumlah dari masing-masing nilai piksel tersebut
dapat dikelompokkan dalam bentuk matriks pada tabel 3.7 berikut ini. 44 3
9 4
1 5
2 6
4 6
5
97 1 2
1 2
4 3
4 3
4 3
12 9 4
3 8
9 1
2
22 4 6
3 7
6 8
4 3
22 3 5
5 4
6 6
7 4
9
43 3 7
5 3
6 5
7 9
6 6
44 3 4
5 6 6
Tabel 3.7 Nilai Matriks Citra Setelah Dikompresi
Pembentukan matriks di atas berdasarkan pembulatan hasil akar dari jumlah nilai piksel yang diketahui, dalam hal ini ada 33 buah nilai piksel. Maka pembulatan hasil
akar dari 33 adalah sebagai berikut: .
Maka matriks baru untuk nilai piksel citra setelah dikompresi berdimensi 6x6 seperti yang ditunjukkan pada tabel 3.7 di atas.
Kemudian matriks dari jumlah masing-masing nilai piksel pada citra dapat dilihat pada tabel 3.8 berikut.
Tabel 3.8 Jumlah Masing-Masing Nilai Piksel Citra Terkompres
3.2 Pseudocode Program 9
1 2 4
5 97 1
2 4
3 0 0
1 1
1 1 1
1 1
1 1
1 1 1
1 1
1 1 1
1 1
1 1
1 1 1
1 1
1 1 1
1 1
2 3
0 0
Pseudocode program merupakan salah satu bentukteknik penulisan algoritma dalam menyelesaikan suatu masalah atau tujuan tertentu. Pseudocode menggambarkan
sebuah proses atau algoritma dari program yang akan dibuat, namun tidak terikat dengan bahasa pemrograman terntentu.
3.2.1 Pseudocode Arithmetic Mean Filte
xi - image.Width yi - image.Height
red - 0 green - 0
blue - 0 jlhred - 0
jlhgreen - 0 jlhblue - 0
For i - 0 to xi-2 For j - 0 to yi-2
For k - 0 to i+2 For l - 0 to j+2
If red = 0 red - 255
If green = 0 green - 255
If red = 0 blue - 255
jlhred - jlhred + red jlhgreen - jlhgreen + green
jlhblue - jlhblue + blue hslRED = jlhred9
hslGREEN = jlhgreen9 hslBLUE = jlhblue9
finalimage.SetPixelj + 1, i + 1, Color. FromArgb255, red,green,blue
jlhred - 0 jlhgreen - 0
jlhblue - 0
xi dan yi dideklarasikan sebagai baris dan kolom pada matriks citra yang akan di filtering. Sebelum RGB diproses dalam metode arithmetic mean filter diinisialisasi
sama dengan nol terlebih dahulu begitu juga dengan hasil akhir dari jumlah RGB. Perulangan for untuk memproses kernel 3x3 dari matriks citra. Kemudian nilai piksel
dari masing-masing RGB akan dijumlahkan dan dibagi dengan 9, sesuai dengan algoritma dari arithmetic mean filter dengan menggunakan kernel 3x3.
3.2.2 Pseudocode Run Length Encoding
xi - image.Width yi - image.Height
red - 0 green - 0
blue - 0 []RED - [xiyi]
[]GREEN - [xiyi] []BLUE - [xiyi]
[]arrayred - [xiyi] []arraygreen - [xiyi]
[]arrayblue - [xiyi] []kompressred - [xiyi]
[]kompressgreen - [xiyi] []kompressblue - [xiyi]
acuan - 0 pos,pos1,pos2 - 0
temp,temp1,temp2 - 0 jumred - 1
jumgreen - 1 jumblue - 1
For i - 0 to xi-2{ For j - 0 to yi-2
If red == 0 Red - 255
If green == 0 green - 255
If red == 0 blue - 255
arrayred[acuan] - red arraygreen[acuan] - green
arrayblue[acuan] - blue if arrayred[pos] = arrayred[acuan]
kompressred[temp]=jumred if jumred = 1
RED[temp] = arrayred[pos]; temp++
jumred - 1 pos - acuan
if arraygreen[pos1] = arraygreen[acuan]
kompressgreen[temp1]=jumgreen if jumgreen = 1
GREEN[temp1] = arraygreen[pos1]; temp1++
jumgreen - 1 pos1 - acuan
if arrayblue[pos2] = arrayblue[acuan]
kompressblue[temp2]=jumblue if jumblue = 1
BLUE[temp2] = arrayblue[pos2]; temp2++
jumblue - 1 pos2 - acuan
Else
jumred++ jumgreen++
jumblue++ if acuan+1= xiyi
kompressred[temp]=jumred+1 kompressgreen[temp1]=jumgreen+1
kompressblue[temp2]=jumblue+1
}acuan++
xi adalah baris dan yi adalah kolom dari matriks citra. Untuk proses algoritma run length encoding, matriks citra perlu diubah menjadi satu vektor oleh karena itu
dilakukan perkalian antara xi dan yi. Variabel pos digunakan untuk menyatakan posisi dari matriks citra, sedangkan variabel temp untuk menyimpan jumlah piksel yang
terkompres. Array dari red, green, dan blue sebagai variabel yang menampung nilai temp untuk menyimpan piksel hasil kompresi, variabel arrayred, arraygreen, dan
arrayblue adalah variabel yang menampung nilai pos. Sedangkan kompresred, kompresgreen, dan kompresblue merupakan variabel untuk menampung dan
menyimpan nilai temp . 3.2.3 Pseudocode Dekompresi Metode Run Length Encoding
double[]kompresred- [imageKompres.HeightimageKompres.Width] double[]kompresgreen- [imageKompres.HeightimageKompres.Width]
double[]kompresblue- [imageKompres.HeightimageKompres.Width] double[] jlh_red- [1000000]
double[] jlh_green- [1000000] double[] jlh_blue- [1000000]
double[] red- [1000000] double[] green- [1000000]
double[] blue- [1000000] kompresred- ambil_nilainotepad1
kompresgreen- ambil_nilainotepad2 kompresblue- ambil_nilainotepad3
jlh_red - ambil_nilainotepad4
jlh_green - ambil_nilainotepad5 jlh_blue - ambil_nilainotepad6
a - 0 b - 0
c - 0 for i - 0 to imageKompres.HeightimageKompres.Width
for j - 0 to jlh_red[i] red[a] - kompresred[i]
red++ for i - 0 to imageKompres.HeightimageKompres.Width
for j - 0 to jlh_green[i] red[a] - kompresgreen[i]
green++ for i - 0 to imageKompres.HeightimageKompres.Width
for j - 0 to jlh_blue[i] red[a] - kompresblue[i]
blue++
Variabel kompresredgreenblue untuk menampung nilai dari matriks citra yang telah terkompres sebelumnya, sedangkan variabel jlh_redgreenblue untuk menampung
nilai jumlah dari masing-masing nilai matriks pada citra, dan variabel red, green, blue akan menampung nilai matriks citra hasil dekompresi.
3.3 Perancangan Sistem
Perancangan sistem terdiri dari flowchart sistem secara keseluruhan dan perancangan antarmuka interface dari sistem yang akan dibuat.
3.3.1 Flowchart Sistem
Mulai
Input gambar .bmp
Lakukan Arithmetic Mean Filter
Output gambar Filter
Kompresi gambar filter
Output gambar kompresi
Dekompresi gambar
Output gambar dekompresi
Selesai
Gambar 3.6 Flowchart Sistem
3.3.2 Perancangan Antarmuka Sistem
Sistem ini dirancang dengan empat menu bar dengan 3 Form, menu Home, Testing, Help, dan Exit, kemudian form menu utama, form pengujiantesting, form help.
3.3.2.1 Tampilan Menu Utama
Halaman menu utama merupakan halaman pertama yang akan muncul ketika sistem dijalankan. Halaman menu utama dalam sistem ini akan menampilkan 4 menu bar
yakni, menu Home, Testing, Help, dan Exit, serta judul sistem yang memperkenalkan fungsi dan tujuan dari sistem. Berikut gambar 3.7 tampilan menu utama sistem.
Home Testing
Help Exit
JUDUL SKRIPSI
Logo Fakultas
Nama Nim
PROGRAM STUDI 5
6 7
10 8
Gambar 3.7 Tampilan Menu Utama
Keterangan : 1. Menu Home menampilkan halaman pertama sistem
2. Menu Testing untuk menampilkan proses filtering, kompresi, dan dekompresi
pada citra 3. Menu Help menampilkan halaman petunjuk penggunaan sistem bagi user
4. Menu Exit untuk keluar dari sistem 5. Label untuk Judul Skripsi
6. Label untuk nama penulis 1
2 4
3
7. Label untuk nim penulis 8. Picturebox untuk logo fakultas
9. Label untuk program studi
3.3.2.2 Tampilan Menu Testing
Halama menu testing adalah halaman sistem yang menampilkan proses filtering menggunakan metode arithmetic mean filter dan proses kompresi menggunakan
metode run length encoding. Berikut gambar 3.8 tampilan menu testing pada sistem.
Gambar 3.8 Tampilan Menu Testing
Keterangan : 1. Menu Home menampilkan halaman pertama sistem
2. Menu Testing untuk menampilkan proses filtering, kompresi, dan dekompresi
pada citra 3. Menu Help menampilkan halaman petunjuk penggunaan sistem bagi user
4. Menu Exit untuk keluar dari sistem 5. Picture Box untuk menampilkan citra awalasli
1 2
6 5
4 3
7
11 1
9 8
15 14
13 12
18 17
16 19
21 20
22 26
25 24
23
32 31
30 29
28 27
35 34
33
39 38
37 36
43 42
41 40
46 44
45 51
50
49 48
47 54
53 52
58 57
56 55
59 10
60
6. Button buka gambar untuk membuka citra yang akan ditampilkan 7. Panel yang berisi keterangan parameter hasil uji
8. Text Box untuk nilai nama file citra yang dibuka 9. Text Box untuk besar ukuran memori dari file citra yang dibuka
10. Text Box untuk ukuran tinggi citra 11. Text Box Iuntuk ukuran lebar citra
12. Picture Box untuk menampilkan citra hasil filtering 13. Button untuk melakukan proses filtering pada citra
14. Button untuk menyimpan file citra hasil filtering 15. Button untuk membuka kembali file citra hasil filtering
16. Text Box untuk ukuran lebar citra hasil filtering 17. Text Box untuk ukuran tinggi citra hasil filtering
18. Text Box untuk nilai MSE citra hasil filtering 19. Text Box untuk nilai PSNR citra hasil filtering
20. Text Box untuk besar ukuran citra hasil filtering 21. Text Box untuk running time proses filtering
22. Picture Box untuk menampilkan citra hasil kompresi 23. Button untuk melakukan proses kompresi pada citra hasil filtering
24. Button untuk menyimpan hasil citra kompresi 25. Button untuk membuka kembali citra hasil kompresi
26. Text Box untuk rasio kompresi hasil kompresi pada citra 27. Text Box untuk ukuran tinggi citra hasil kompresi
28. Text Box untuk ukuran lebar citra hasil kompresi 29. Text Box untuk ukuran besar memori citra hasil kompresi
30. Text Box untuk running time proses kompresi pada citra 31. Picture Box untuk menampilkan hasil kompresi citra asli
32. Button untuk melakukan proses kompresi pada citra asli 33. Button untuk menyimpan hasil citra kompresi dari citra asli
34. Button untuk membuka kembali citra hasil kompresi 35. Text Box untuk rasio kompresi hasil kompresi pada citra
36. Text Box untuk ukuran tinggi citra hasil kompresi 37. Text Box untuk ukuran lebar citra hasil kompresi
38. Text Box untuk ukuran besar memori citra hasil kompresi
39. Text Box untuk running time proses kompresi pada citra 40. Picture Box untuk menampilkan citra hasil dekompresi citra filtering
41. Button untuk melakukan proses dekompresi pada citra citra filtering 42. Button untuk menyimpan file citra hasil dekompresi citra filtering
43. Button untuk membuka kembali file citra hasil dekompresi citra filtering 44. Text Box untuk ukuran tinggi citra hasil dekompresi citra filtering
45. Text Box untuk ukuran lebar citra hasil dekompresi citra filtering 46. Text Box untuk nilai MSE citra hasil dekompresi citra filtering
47. Text Box untuk nilai PSNR citra hasil dekompresi citra filtering 48. Text Box untuk besar ukuran citra hasil dekompresi citra filtering
49. Text Box untuk running time proses dekompresi citra filtering 50. Picture Box untuk menampilkan citra hasil dekompresi citra asli
51. Button untuk melakukan proses dekompresi citra asli 52. Button untuk menyimpan file citra hasil dekompresi citra asli
53. Button untuk membuka kembali file citra hasil dekompresi citra asli 54. Text Box untuk ukuran lebar citra hasil dekompresi citra asli
55. Text Box untuk ukuran tinggi citra hasil dekompresi citra asli 56. Text Box untuk nilai MSE citra hasil dekompresi citra asli
57. Text Box untuk nilai PSNR citra hasil dekompresi citra asli 58. Text Box untuk besar ukuran citra hasil dekompresi citra asli
59. Text Box untuk running time proses dekompresi citra asli 60. Button untuk mereset semua proses yang sudah dijalankan
3.3.2.3 Tampilan Menu Help
Menu help menampilkan keterangan atau penjelasan mengenai fungsi dan penggunaan sistem, yang merupakan tahapanlangkah – langkah dalam mengoperasikan sistem.
Berikut gambar 3.9 tampilan menu help.
Keterangan
Tahapan Testing
1
Gambar 3.9 Tampilan Menu Help
Keterangan: 1. Panel keterangan untuk menerangkan tujuan dan fungsi dari sistem serta
metode apa yang digunakan dalam implementasinya. 2. Panel tahapan testing menjelaskan langkah-langkah yang harus dilakukan pada
proses testing.
2
BAB 4 IMPLEMENTASI DAN PENGUJIAN
4.B Implementasi
Pada tahapan ini sistem yang sudah dirancang dan dianalisis sebelumnya akan dibangun dan direalisasikan sebagai bentuk solusi terhadap permasalahan yang terjadi.
Adapun diagram Ishikawa Fishbone Diagram yang akan merangkum bagaimana penyelesaian terhadap masalah yang telah dianalisis sebelumnya secara detail,
sehingga dapat menggambarkan bentuk dan fungsi dari sistem yang telah dibuat secara keseluruhan. Berikut gambar 4.1 diagram Ishikawa Fishbone Diagram .
Metode arithmetic mean filter
citra digital BMP metode run length
encoding C
Melakukan filtering dan kebutuhan citra
Kompresi pada citra sebagai data,
sehingga membantu
menghemat ruang memori
Gambar 4.B. Diagram Ishikawa
Dari diagram ishikawa di atas dapat dlihat bagaimana bentuk implementasi sistem berdasarkan empat kategori yang perlu diperhatikan yaitu material, metode, mesin,
dan manusia. Material atau objek yang digunakan adalah citra digital dengan format BMP, sistem menggunakan bahasa pemograman C yang dapat melakukan proses
filtering dan kompresi dengan metode arithmetic mean filter untuk proses filtering dan Material
Manusia Mesin
Metode
Metode Arithmetic Mean Filter
dan Run
Length Encoding untuk mengolah dan melakukan
kompresi citra BMP
metode run length encoding untuk proses kompresi. Dengan implementasi sistem yang dibuat diharapkan dapat membantu manusia dalam hal ini sebagai pengguna
untuk dapat menghemat penggunaan memori dalam penyimpanan file citra. Artinya kedua metode yang disebutkan di atas yakni metode arithmetic mean filter dan
metode run length encoding digunakan sebagai solusi untuk mengelolah dan melakukan kompresi pada citra BMP.
4.1.1 Form Home
Form home merupakan halaman utama yang akan muncul pertama kali ketika sistem dijalankan. Halaman ini menampilkan judul implementasi yang menggambarkan
fungsi dan tujuan dari sistem serta memiliki empat menu bar, yaitu menu Home, menu Testing, menu Help, dan Exit. Halaman menu home dapat dilihat pada gambar 4.2.
Gambar 4.2. Halaman Menu Home
4.1.2 Form Testing
Pada Form Testing akan menampilkan halaman untuk proses implementasi metode yang akan diujidijalankan. Proses testing dimulai dengan implementasi dari metode
Arithmetic Mean Filter kemudian metode kompresi yaitu metode Run Length Encoding. Form testing dapat dilihat pada gambar 4.3.
Gambar 4.3. Menu Testing
4.1.3 Form Help Pada form help akan menampilkan keterangan dari fungsi dan kegunaan sistem serta
langkah-langkah dalam mengoperasikan sistem dalam hal ini menu testing. Berikut gambar 4.4 menu Help
Gambar 4.4. Menu Help
4.2 Pengujian