ShowDialog; ShowDialog; Implementasi Metode Arithmetic Mean Filter Dan Kompresi Citra Menggunakan Metode Run Length Encoding

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