LISTING PROGRAM
Kode Program Menu Utama:
using System;
/// Description of MainForm. /// </summary>
public partial class MainForm : Form {
public MainForm() {
//
// The InitializeComponent() call is required for Windows Forms designer support.
//
pnitializeComponent();
//
// TODO: Add constructor code after the InitializeComponent() call.
// }
void TestingToolStripMenuptemClick(object sender, EventAr gs e)
{
Form a=new Testing(); a.ShowDialog();
}
void HelpToolStripMenuptemClick(object sender, EventArgs e) {
Form c =new Help(); c.ShowDialog(); }
void ExitToolStripMenuptemClick(object sender, EventArgs e)
DialogResult button= MessageBox.Show("Anda yakin mau keluar?", "Exit",
MessageBoxButtons.YesNo, MessageBoxIcon. Question, MessageBoxDefaultButton.Button2);
if (button==DialogResult.Yes) Application.Exit(); }
} }
Kode Program Menu Testing
using System;
/// Description of Testing. /// </summary>
public partial class Testing : Form {
double nilaiAsli, nilaiKompres, nilaiFilter, rasio; public Testing()
{ //
// The InitializeComponent() call is required for Windows Forms designer support.
//
pnitializeComponent();
//
// TODO: Add constructor code after the InitializeComponent() call.
// }
void ExitToolStripMenuptemClick(object sender, EventArgs e)
{
DialogResult button = MessageBox.Show("Anda yakin mau keluar?", "Exit",
MessageBoxButtons.YesNo, MessageBoxIcon. Question, MessageBoxDefaultButton.Button2);
void HomeToolStripMenuptemClick(object sender, EventArgs e)
{
Form a = new MainForm(); this.Dispose();
a.ShowDialog(); }
void HelpToolStripMenuptemClick(object sender, EventArgs e)
void openClick(object sender, EventArgs e) {
try {
OpenFileDialog open = new OpenFileDialog(); open.Filter = "Image File(.*bmp)|*.bmp"; if (open.ShowDialog() == DialogResult.OK) {
Bitmap gbr = new Bitmap(open.FileName); if (gbr.Width <= 500 && gbr.Height <= 500) {
var fileinfo = new Filepnfo(open.FileName); gbrAsli.SizeMode =
PictureBoxSizeMode.StretchImage;
gbrAsli.ImageLocation = open.FileName; NmFile.Text = open.SafeFileName.ToString(); Bitmap bit = new Bitmap(open.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.Show("Gambar tidak boleh melebihi 500x500 piksel", "Warning");
}
//tulis
StreamWriter tulis_g = new StreamWriter(@"D:\\Retri Scrib\\cicilan program\\Notepad\\gbr_asli_green.txt", false);
StreamWriter tulis_b = new StreamWriter(@"D:\\Retri Scrib\\cicilan program\\Notepad\\gbr_asli_blue.txt", false);
Bitmap asli = (Bitmap)gbrAsli.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_merah(asli); gambarasli_g = notepad_hijau(asli); gambarasli_b = notepad_biru(asli); for (int i = 0; i < 1; i++)
{
for (int j = 0; j < gambarasli_r.Length; j++) {
tulis_r.Write(gambarasli_r[i, j].ToString() + "\t");
for (int j = 0; j < gambarasli_g.Length; j++) {
tulis_g.Write(gambarasli_g[i, j].ToString() + "\t");
for (int j = 0; j < gambarasli_b.Length; j++) {
tulis_b.Write(gambarasli_b[i, j].ToString() + "\t");
} }
tulis_b.Close(); }
catch (Exception v) {
MessageBox.Show("Batal"); }
}
{
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 Bitmap(xi, yi);
for (int i = 0; i < xi - 2; i++)
red = image.GetPixel(k, l).R; if (red == 0)
red = 255;
green = image.GetPixel(k, l).G; if (green == 0)
green = 255;
blue = image.GetPixel(k, l).B; if (blue == 0)
blue = 255; jlhred += red; jlhgreen += green; jlhblue += blue; }
}
double RED = Math.Round((jlhred / 9), 0); double GREEN = Math.Round((jlhgreen / 9), 0); double BLUE = Math.Round((jlhblue / 9), 0); jlhred = 0; jlhgreen = 0; jlhblue = 0;
finalimage.SetPixel(i + 1, j + 1, Color.FromA rgb(255, (int)RED, (int)GREEN, (int)BLUE));
} }
return finalimage; }
void FilteringClick(object sender, EventArgs e) {
if (gbrAsli.Image != null) {
gbrFiltering.Image
= arithmeticmean((Bitmap)gbrAsli.Image); watch.Stop();
RTfilter.Text =
Math.Round(Convert.ToDecimal(watch.ElapsedMilliseconds) / 1000, 4) .ToString() + " Sekon";
MSE1.Text
= MSE((Bitmap)gbrAsli.Image, (Bitmap)gbrFiltering.Image).ToString ();
MessageBox.Show("Gambar belum dimasukkan"); }
}
double MSE(Bitmap 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.GetPixel(j, i).R; pxHasil = imageHasil.GetPixel(j, i).R; sum += Math.Pow((pxAsli - pxHasil), 2); }
} MSE =
Math.Floor((sum / (imageAsli.Height * imageAsli.Width))); return MSE;
}
double PSNR(double MSE) {
double PSNR1 =
Math.Round(10 * Math.Log10(Math.Pow(255, 2) / MSE)); return PSNR1;
}
void KompresiClick(object sender, EventArgs e) {
if (gbrFiltering.Image != null) {
watch.Start();
Bitmap image = new Bitmap(gbrFiltering.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.GetPixel(j, i).R; if (red == 0)
red = 255;
green = image.GetPixel(j, i).G; if (green == 0)
green = 255;
blue = image.GetPixel(j, 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;
{
//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
//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++;
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 = (int)Math.Sqrt(panjang - 1); int ret = 0;
Bitmap finalimage = new Bitmap(xii, xii); for (int i = 0; i < xii; i++)
{
for (int j = 0; j < xii; j++) {
finalimage.SetPixel(j, i, Color.FromArgb(255, (int)RED[ret], (int)GREEN[ret], (int)BLUE[ret]));
ret++; }
}
RT2.Text =
Math.Round(Convert.ToDecimal(watch.ElapsedMilliseconds) / 1000, 4) .ToString() + " Sekon";
StreamWriter tulis_r = new StreamWriter(@"D:\\Retri Scrib\\cicilan program\\Notepad\\jlh_red_komfil.txt", false);
StreamWriter tulis_g = new StreamWriter(@"D:\\Retri Scrib\\cicilan program\\Notepad\\jlh_green_komfil.txt", false); StreamWriter tulis_b = new StreamWriter(@"D:\\Retri Scrib\\cicilan program\\Notepad\\jlh_blue_komfil.txt", false);
StreamWriter tulis_rr = new StreamWriter(@"D:\\Retri Scrib\\cicilan program\\Notepad\\piksel_red_kompres.txt", false);
StreamWriter tulis_gg = new StreamWriter(@"D:\\Retri Scrib\\cicilan
program\\Notepad\\piksel_green_kompres.txt", false);
StreamWriter tulis_bb = new StreamWriter(@"D:\\Retri Scrib\\cicilan program\\Notepad\\array_blue_kompres.txt", false);
for (int i = 0; i < kompressred.Length; i++) {
tulis_r.Write(kompressred[i].ToString() + "\t"); }
tulis_r.Close();
for (int i = 0; i < kompressgreen.Length; i++) {
tulis_g.Write(kompressgreen[i].ToString() + "\t"); }
tulis_g.Close();
for (int i = 0; i < kompressblue.Length; i++) {
tulis_b.Write(kompressblue[i].ToString() + "\t"); }
tulis_b.Close();
for (int i = 0; i < RED.Length; i++) {
tulis_rr.Write(RED[i].ToString() + "\t"); }
tulis_rr.Close();
for (int i = 0; i < GREEN.Length; i++) {
tulis_gg.Write(GREEN[i].ToString() + "\t"); }
tulis_gg.Close();
for (int i = 0; i < BLUE.Length; i++) {
tulis_bb.Write(BLUE[i].ToString() + "\t"); }
tulis_bb.Close(); }
{
MessageBox.Show("Belum ada gambar filtering"); }
}
void Button3Click(object sender, EventArgs e) {
if (gbrAsli.Image != null) {
Stopwatch watch = new Stopwatch(); watch.Start();
Bitmap image = new Bitmap(gbrAsli.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.GetPixel(j, i).R; if (red == 0)
red = 255;
green = image.GetPixel(j, i).G; if (green == 0)
green = 255;
blue = image.GetPixel(j, i).B; if (blue == 0)
blue = 255;
//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
//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 {
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 = (int)Math.Sqrt(panjang - 1); int ret = 0;
Bitmap finalimage = new Bitmap(xii, xii); for (int i = 0; i < xii; i++)
for (int j = 0; j < xii; j++) {
finalimage.SetPixel(j, i, Color.FromArgb(255, (int)RED[ret], (int)GREEN[ret], (int)BLUE[ret]));
ret++; }
}
gbrAsliKompres.Image = finalimage; watch.Stop();
RT3.Text =
Math.Round(Convert.ToDecimal(watch.ElapsedMilliseconds) / 1000, 4) .ToString() + " Sekon";
StreamWriter tulis_r = new StreamWriter(@"D:\\Retri Scrib\\cicilan
program\\Notepad\\asli_jlh_red_kompres.txt", false);
StreamWriter tulis_g = new StreamWriter(@"D:\\Retri Scrib\\cicilan
program\\Notepad\\asli_jlh_green_kompres.txt", false);
StreamWriter tulis_b = new StreamWriter(@"D:\\Retri Scrib\\cicilan
program\\Notepad\\asli_jlh_blue_kompres.txt", false);
StreamWriter tulis_rr = new StreamWriter(@"D:\\Retri Scrib\\cicilan
program\\Notepad\\asli_array_red_beda_asli.txt", false);
StreamWriter tulis_gg = new StreamWriter(@"D:\\Retri Scrib\\cicilan
program\\Notepad\\asli_array_green_beda_asli.txt", false);
StreamWriter tulis_bb = new StreamWriter(@"D:\\Retri Scrib\\cicilan
program\\Notepad\\asli_array_blue_beda_asli.txt", false); for (int i = 0; i < kompressred.Length; i++) {
tulis_r.Write(kompressred[i].ToString() + "\t"); }
tulis_r.Close();
for (int i = 0; i < kompressgreen.Length; i++) {
tulis_g.Write(kompressgreen[i].ToString() + "\t"); }
tulis_g.Close();
for (int i = 0; i < kompressblue.Length; i++) {
tulis_b.Write(kompressblue[i].ToString() + "\t"); }
tulis_b.Close();
tulis_rr.Write(RED[i].ToString() + "\t"); }
tulis_rr.Close();
for (int i = 0; i < GREEN.Length; i++) {
tulis_gg.Write(GREEN[i].ToString() + "\t"); }
tulis_gg.Close();
for (int i = 0; i < BLUE.Length; i++) {
tulis_bb.Write(BLUE[i].ToString() + "\t"); }
tulis_bb.Close(); }
else {
MessageBox.Show("Gambar belum dimasukkan"); }
}
void Simpan1Click(object sender, EventArgs e) {
SaveFileDialog simpan = new SaveFileDialog(); simpan.Filter = "image Files| *.bmp";
simpan.FileName = "*.bmp";
if (simpan.ShowDialog() == DialogResult.OK) {
gbrFiltering.Image.Save(simpan.FileName, ImageFor mat.Bmp);
MessageBox.Show("gambar sudah
disimpan", "save", MessageBoxButtons.OK, MessageBoxIcon.Informati on);
} else {
MessageBox.Show("gambar tidak tersimpan "); }
//tulis
StreamWriter tulis_r = new StreamWriter(@"D:\\Retri Scrib\\cicilan program\\Notepad\\gbr_filter_red.txt", false);
StreamWriter tulis_g = new StreamWriter(@"D:\\Retri Scrib\\cicilan program\\Notepad\\gbr_filter_green.txt", false); StreamWriter tulis_b = new StreamWriter(@"D:\\Retri Scrib\\cicilan program\\Notepad\\gbr_filter_blue.txt", false);
Bitmap filter = (Bitmap)gbrFiltering.Image; int[,] gambarasli_r
= new int[1, filter.Width * filter.Height]; int[,] gambarasli_b
= new int[1, filter.Width * filter.Height];
gambarasli_r = notepad_merah(filter); gambarasli_g = notepad_hijau(filter); gambarasli_b = notepad_biru(filter); for (int i = 0; i < 1; i++)
{
for (int j = 0; j < gambarasli_r.Length; j++) {
tulis_r.Write(gambarasli_r[i, j].ToString() + "\t");
for (int j = 0; j < gambarasli_g.Length; j++) {
tulis_g.Write(gambarasli_g[i, j].ToString() + "\t");
for (int j = 0; j < gambarasli_b.Length; j++) {
tulis_b.Write(gambarasli_b[i, j].ToString() + "\t");
} }
tulis_b.Close(); }
void Simpan2Click(object sender, EventArgs e) {
SaveFileDialog simpan = new SaveFileDialog(); simpan.Filter = "image Files| *.bmp";
simpan.FileName = "*.bmp";
if (simpan.ShowDialog() == DialogResult.OK) {
gbrKompresi.Image.Save(simpan.FileName, ImageForm at.Bmp);
MessageBox.Show("gambar sudah
disimpan", "save", MessageBoxButtons.OK, MessageBoxIcon.Informati on);
} else {
}
StreamWriter tulis_r = new StreamWriter(@"D:\\Retri Scrib\\cicilan program\\Notepad\\komfil_red.txt", false);
StreamWriter tulis_g = new StreamWriter(@"D:\\Retri Scrib\\cicilan program\\Notepad\\komfil_green.txt", false);
StreamWriter tulis_b = new StreamWriter(@"D:\\Retri Scrib\\cicilan program\\Notepad\\komfil_blue.txt", false);
Bitmap asli = (Bitmap)gbrKompresi.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_merah(asli); gambarasli_g = notepad_hijau(asli); gambarasli_b = notepad_biru(asli); for (int i = 0; i < 1; i++)
{
for (int j = 0; j < gambarasli_r.Length; j++) {
tulis_r.Write(gambarasli_r[i, j].ToString() + "\t");
for (int j = 0; j < gambarasli_g.Length; j++) {
tulis_g.Write(gambarasli_g[i, j].ToString() + "\t");
for (int j = 0; j < gambarasli_b.Length; j++) {
tulis_b.Write(gambarasli_b[i, j].ToString() + "\t");
} }
tulis_b.Close(); }
void Simpan3Click(object sender, EventArgs e) {
simpan.Filter = "image Files| *.bmp"; simpan.FileName = "*.bmp";
if (simpan.ShowDialog() == DialogResult.OK) {
gbrAsliKompres.Image.Save(simpan.FileName, ImageF ormat.Bmp);
MessageBox.Show("gambar sudah
disimpan", "save", MessageBoxButtons.OK, MessageBoxIcon.Informati on);
} else {
MessageBox.Show("gambar tidak tersimpan "); }
StreamWriter tulis_r = new StreamWriter(@"D:\\Retri Scrib\\cicilan
program\\Notepad\\asli_kompres_red_asli.txt", false);
StreamWriter tulis_g = new StreamWriter(@"D:\\Retri Scrib\\cicilan
program\\Notepad\\asli_kompres_green_asli.txt", false);
StreamWriter tulis_b = new StreamWriter(@"D:\\Retri Scrib\\cicilan
program\\Notepad\\asli_komres_blue_asli.txt", false); Bitmap asli = (Bitmap)gbrAsliKompres.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_merah(asli); gambarasli_g = notepad_hijau(asli); gambarasli_b = notepad_biru(asli); for (int i = 0; i < 1; i++)
{
for (int j = 0; j < gambarasli_r.Length; j++) {
tulis_r.Write(gambarasli_r[i, j].ToString() + "\t");
for (int j = 0; j < gambarasli_g.Length; j++) {
tulis_g.Write(gambarasli_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.Write(gambarasli_b[i, j].ToString() + "\t");
} }
tulis_b.Close(); }
private void dekompresFilter_Click(object sender, EventArgs e) {
if (gbrKompresi.Image != null) {
Stopwatch watch = new Stopwatch(); watch.Start();
double[] kompressred
= new double[gbrKompresi.Image.Width*gbrKompresi.Image.Height]; double[] kompressgreen
= new double[gbrKompresi.Image.Width*gbrKompresi.Image.Height]; double[] kompressblue
= new double[gbrKompresi.Image.Width*gbrKompresi.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 StreamReader("D:\\Retri Scrib\\cicilan program\\Notepad\\array_blue_kompres.txt");
StreamReader baca2 = new StreamReader("D:\\Retri Scrib\\cicilan program\\Notepad\\piksel_green_kompres.txt"); StreamReader baca1 = new StreamReader("D:\\Retri Scrib\\cicilan program\\Notepad\\piksel_red_kompres.txt");
StreamReader baca4 = new StreamReader("D:\\Retri Scrib\\cicilan program\\Notepad\\jlh_red_komfil.txt");
StreamReader baca5 = new StreamReader("D:\\Retri Scrib\\cicilan program\\Notepad\\jlh_green_komfil.txt");
StreamReader baca6 = new StreamReader("D:\\Retri Scrib\\cicilan program\\Notepad\\jlh_blue_komfil.txt");
StreamWriter tulis_red = new StreamWriter(@"D:\\Retri Scrib\\cicilan
= new StreamWriter(@"D:\\Retri Scrib\\cicilan
program\\Notepad\\dekompres_green_filter.txt", false); StreamWriter tulis_blue
= new StreamWriter(@"D:\\Retri Scrib\\cicilan
program\\Notepad\\dekompres_blue_filter.txt", false); kompressred = ambil_nilai(baca1);
kompressgreen = ambil_nilai(baca2); kompressblue = ambil_nilai(baca3); jlh_red = ambil_nilai(baca4); jlh_green = ambil_nilai(baca5); jlh_blue = ambil_nilai(baca6); for (int i
= 0; i < gbrKompresi.Image.Width*gbrKompresi.Image.Height; i++) {
for (int j = 0; j < jlh_red[i]; j++) {
red[a] = kompressred[i]; a++;
= 0; i < gbrKompresi.Image.Width*gbrKompresi.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.Width*gbrKompresi.Image.Height; i++) {
for (int j = 0; j < jlh_blue[i]; j++) {
blue[c] = kompressblue[i]; c++;
} }
//membuat matriks int[,] pixel_red
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 Bitmap(gbrFiltering.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.Topnt32(red[indeks]);
pixel_green[j, i] = Convert.Topnt32(green[indeks]);
pixel_blue[j, i] = Convert.Topnt32(blue[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.FromArgb(255, pixel_red[j,i], pixel_green[j,i], pixel_blue[ j,i]);
dekompresi.SetPixel(j, i, newpixel); }
}
for (int i = 0; i < gbrFiltering.Image.Width; i++) {
for (int j
= 0; j < gbrFiltering.Image.Height; j++) {
Color cc = dekompresi.GetPixel(j, i); int pixel = cc.R;
tulis_red.Write(pixel_red[j,i] + "\t"); }
tulis_red.Write(tulis_red.NewLine); }
for (int i = 0; i < gbrFiltering.Image.Width; i++) {
for (int j
= 0; j < gbrFiltering.Image.Height; j++) {
Color cc = dekompresi.GetPixel(j, i); int pixel = cc.G;
tulis_green.Write(pixel_green[j,i] + "\t"); }
tulis_green.Write(tulis_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.GetPixel(j, i); int pixel = cc.B;
tulis_blue.Write(pixel_blue[j,i] + "\t"); }
tulis_blue.Write(tulis_blue.NewLine); }
tulis_blue.Close();
gbrDekompresiFilter.Image = dekompresi; watch.Stop();
RT4.Text =
Math.Round(Convert.ToDecimal(watch.ElapsedMilliseconds) / 1000, 4) .ToString() + " Sekon";
MSE2.Text
= MSE((Bitmap)gbrFiltering.Image, (Bitmap)gbrDekompresiFilter.Ima ge).ToString();
SaveFileDialog simpan = new SaveFileDialog(); simpan.Filter = "image Files| *.bmp";
simpan.FileName = "*.bmp";
if (simpan.ShowDialog() == DialogResult.OK) {
gbrDekompresiFilter.Image.Save(simpan.FileName, I mageFormat.Bmp);
MessageBox.Show("gambar sudah
disimpan", "save", MessageBoxButtons.OK, MessageBoxIcon.Informati on);
} else {
MessageBox.Show("gambar tidak tersimpan "); }
//tulis
StreamWriter tulis_r = new StreamWriter(@"D:\\Retri Scrib\\cicilan
program\\Notepad\\gbr_dekompresi_filter_red.txt", false);
StreamWriter tulis_g = new StreamWriter(@"D:\\Retri Scrib\\cicilan
program\\Notepad\\gbr_dekompresi_filter_green.txt", false); StreamWriter tulis_b = new StreamWriter(@"D:\\Retri Scrib\\cicilan
program\\Notepad\\gbr_dekompresi_filter_blue.txt", false); Bitmap dekompresFilter
= (Bitmap)gbrDekompresiFilter.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_merah(dekompresFilter); gambarasli_g = notepad_hijau(dekompresFilter); gambarasli_b = notepad_biru(dekompresFilter); for (int i = 0; i < 1; i++)
{
for (int j = 0; j < gambarasli_r.Length; j++) {
tulis_r.Write(gambarasli_r[i, j].ToString() + "\t");
tulis_g.Write(gambarasli_g[i, j].ToString() +
for (int j = 0; j < gambarasli_b.Length; j++) {
tulis_b.Write(gambarasli_b[i, j].ToString() + "\t");
} }
tulis_b.Close(); }
void OpenKomasClick(object sender, EventArgs e) {
OpenFileDialog open = new OpenFileDialog(); open.Filter = "Image File(.*bmp)|*.bmp"; if (open.ShowDialog() == DialogResult.OK) {
Bitmap gbr = new Bitmap(open.FileName);
var fileinfo = new Filepnfo(open.FileName); gbrAsliKompres.SizeMode =
PictureBoxSizeMode.StretchImage;
gbrAsliKompres.ImageLocation = open.FileName; Bitmap bit = new Bitmap(open.FileName);
ukuran4.Text
= ((fileinfo.Length) / 1024).ToString() + " KB";
nilaiKompres = fileinfo.Length/1024; height2.Text = bit.Height.ToString(); width2.Text = bit.Width.ToString(); rasio = 100
-(((nilaiKompres)/(nilaiAsli))*100); RK2.Text
= (Math.Round(rasio,2)).ToString() + " %"; gbrAsliKompres.Image = bit; }
}
void OpenDekomfilClick(object sender, EventArgs e) {
{
Bitmap gbr = new Bitmap(open.FileName);
var fileinfo = new Filepnfo(open.FileName); gbrDekompresiFilter.SizeMode =
PictureBoxSizeMode.StretchImage;
gbrDekompresiFilter.ImageLocation = open.FileName;
Bitmap bit = new Bitmap(open.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.nastiti@gmail.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
PENGALAMAN PEKERJAAN
Mengajar Privat tahun 2015
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.
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.
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 filterdan metode run
length encodingpada 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 prosesfilteringterlebih dahulu menggunakan metodearithmetic mean filter. Parameter dari penelitian ini adalah Mean Square Error (MSE), Peak Signal to Noise Ratio(PSNR), ukuran file citra, rasio kompresi danrunning time.
3.1.2 Analisis Persyaratan
Analisi persyaratan terbagi atas dua bagian, yaitu persyaratan fungsional dam persyaratan nonfungsional.
3.1.2.1 Persyaratan Fungsional
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, danrunning time.
4. Citra yang mampu ditampung oleh sistem adalah citra dengan format BMP maksimal dimensi 500 x 500pixel.
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 olehuser.
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
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, danrunning time.
3.1.3.1Use 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.
Tabel 3.B TabelUse CaseProsesfilteringdenganArithmetic Mean Filter
Name ProsesfilteringdenganArithmetic 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 difilter
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 TabelUse CaseProses kompresi denganRun Length Encoding(RLE)
Name Proses kompresi denganRun Length Encoding(RLE)
Actor User
Description Melakukan proses kompresi menggunakan metodeRun Length Encoding(RLE)
Preconditions User mengakses menu testing
Basic Flows 1. User mengakses tombol kompresi untuk citra hasil
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 spesifikasiUse Case untuk dekompresi citra dapat dilihat pada Tabel 3.3.
Tabel 3.3 TabelUse CaseProses 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
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.2Activity Diagram
Activity diagram adalah diagram yang menggambarkan alur kegiatan penggunaan sistem dalam mengeksekusi tujuan yang diinginkan. Berikut ini gambar 3.2 activity diagramproses filtering.
Gambar 3.2Activity DiagramProsesFiltering
Gambar 3.3Activity DiagramProses Kompresi
Gambar 3.4Activity DiagramProses Dekompresi
Squence diagram adalah sebuah diagram yang menggambarkan interaksi antar objek dari sebuah sistem berdasarkan urutan waktu pemrosesan. Berikut ini gambar 3.5 menunjukkansquence diagramsistem dalam penelitian ini.
Gambar 3.5Sequence DiagramSistem
3.1.3.4 Analisis Proses MetodeArithmetic Mean Filter
Berikut ini merupakan contoh penggunaan metode arithmetic mean filter. Dimisalkan sebuah matriks citra 6x6 yang dapat dilihat pada tabel 3.4 berikut:
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:
(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
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 MetodeRun 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
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.
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.2PseudocodeProgram
9 1 2 4 5
97 1 2
4 3
0 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
Pseudocode program merupakan salah satu bentuk/teknik 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
green <- 255 If (red = 0)
blue <- 255 jlhred <- jlhred + red
jlhgreen <- jlhgreen + green jlhblue <- jlhblue + blue hslRED = jlhred/9
hslGREEN = jlhgreen/9 hslBLUE = jlhblue/9
finalimage.SetPixel(j + 1, i + 1, Color. FromArgb(255, 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.
xi <- image.Width yi <- image.Height red <- 0
green <- 0 blue <- 0
[]RED <- [xi*yi] []GREEN <- [xi*yi] []BLUE <- [xi*yi] []arrayred <- [xi*yi] []arraygreen <- [xi*yi] []arrayblue <- [xi*yi] []kompressred <- [xi*yi] []kompressgreen <- [xi*yi] []kompressblue <- [xi*yi] 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
kompressblue[temp2]=jumblue if (jumblue >= 1)
BLUE[temp2] = arrayblue[pos2]; temp2++
jumblue <- 1 pos2 <- acuan Else
jumred++ jumgreen++ jumblue++
if ((acuan+1)= (xi*yi))
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.3PseudocodeDekompresi MetodeRun Length Encoding
double[]kompresred<- [imageKompres.Height*imageKompres.Width] double[]kompresgreen<- [imageKompres.Height*imageKompres.Width] double[]kompresblue<- [imageKompres.Height*imageKompres.Width]
double[] jlh_red<- [1000000] double[] jlh_green<- [1000000] double[] jlh_blue<- [1000000]
double[] red<- [1000000] double[] green<- [1000000] double[] blue<- [1000000]
jlh_green <- ambil_nilai(notepad5) jlh_blue <- ambil_nilai(notepad6) a <- 0
b <- 0 c <- 0
for i <- 0 to < imageKompres.Height*imageKompres.Width for j <- 0 to < jlh_red[i]
red[a] <- kompresred[i] red++
for i <- 0 to < imageKompres.Height*imageKompres.Width for j <- 0 to < jlh_green[i]
red[a] <- kompresgreen[i] green++
for i <- 0 to < imageKompres.Height*imageKompres.Width for j <- 0 to < jlh_blue[i]
red[a] <- kompresblue[i] blue++
Variabel kompresred/green/blue untuk menampung nilai dari matriks citra yang telah terkompres sebelumnya, sedangkan variabel jlh_red/green/blue 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.
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.6Flowchart Sistem
Sistem ini dirancang dengan empat menu bar dengan 3 Form, menu Home, Testing,
Help, danExit,kemudian form menu utama, form pengujian/testing, formhelp.
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. MenuHomemenampilkan halaman pertama sistem
2. Menu Testing untuk menampilkan proses filtering, kompresi, dan dekompresi pada citra
3. MenuHelpmenampilkan halaman petunjuk penggunaan sistem bagiuser
4. MenuExituntuk keluar dari sistem 5. Label untuk Judul Skripsi
6. Label untuk nama penulis
7. Label untuk nim penulis 8. Picturebox untuk logo fakultas 9. Label untuk program studi
3.3.2.2 Tampilan MenuTesting
Halama menu testing adalah halaman sistem yang menampilkan proses filtering
menggunakan metode arithmetic mean filter dan proses kompresi menggunakan metoderun length encoding. Berikut gambar 3.8 tampilan menutestingpada sistem.
Gambar 3.8 Tampilan MenuTesting
Keterangan :
1. MenuHomemenampilkan halaman pertama sistem
2. Menu Testing untuk menampilkan proses filtering, kompresi, dan dekompresi pada citra
3. MenuHelpmenampilkan halaman petunjuk penggunaan sistem bagiuser
4. MenuExituntuk keluar dari sistem
5. Picture Boxuntuk menampilkan citra awal/asli
6. Buttonbuka gambar untuk membuka citra yang akan ditampilkan 7. Panel yang berisi keterangan parameter hasil uji
8. Text Boxuntuk nilai nama file citra yang dibuka
9. Text Boxuntuk besar ukuran memori dari file citra yang dibuka 10.Text Boxuntuk ukuran tinggi citra
11.Text Box Iuntuk ukuran lebar citra
12.Picture Box untuk menampilkan citra hasil filtering 13.Buttonuntuk melakukan proses filtering pada citra 14.Buttonuntuk menyimpan file citra hasil filtering 15.Buttonuntuk membuka kembali file citra hasil filtering 16.Text Boxuntuk ukuran lebar citra hasil filtering
17.Text Boxuntuk ukuran tinggi citra hasil filtering 18.Text Boxuntuk nilai MSE citra hasilfiltering
19.Text Boxuntuk nilai PSNR citra hasilfiltering
20. Text Boxuntuk besar ukuran citra hasilfiltering
21.Text Boxuntukrunning timeprosesfiltering
22.Picture Box untuk menampilkan citra hasil kompresi
23.Buttonuntuk melakukan proses kompresi pada citra hasil filtering 24.Buttonuntuk menyimpan hasil citra kompresi
25.Buttonuntuk membuka kembali citra hasil kompresi 26.Text Boxuntuk rasio kompresi hasil kompresi pada citra 27.Text Boxuntuk ukuran tinggi citra hasil kompresi 28.Text Boxuntuk ukuran lebar citra hasil kompresi
29.Text Boxuntuk ukuran besar memori citra hasil kompresi 30.Text Boxuntukrunning timeproses kompresi pada citra 31.Picture Boxuntuk menampilkan hasil kompresi citra asli 32.Buttonuntuk melakukan proses kompresi pada citra asli 33.Buttonuntuk menyimpan hasil citra kompresi dari citra asli 34.Buttonuntuk membuka kembali citra hasil kompresi
35.Text Boxuntuk rasio kompresi hasil kompresi pada citra 36.Text Boxuntuk ukuran tinggi citra hasil kompresi 37.Text Boxuntuk ukuran lebar citra hasil kompresi
39.Text Boxuntukrunning timeproses kompresi pada citra
40.Picture Box untuk menampilkan citra hasil dekompresi citra filtering 41.Buttonuntuk melakukan proses dekompresi pada citra citra filtering 42.Buttonuntuk menyimpan file citra hasil dekompresi citra filtering 43.Buttonuntuk membuka kembali file citra hasil dekompresi citra filtering 44.Text Boxuntuk ukuran tinggi citra hasil dekompresi citra filtering 45.Text Boxuntuk ukuran lebar citra hasil dekompresi citra filtering 46.Text Boxuntuk nilai MSE citra hasildekompresicitra filtering 47.Text Boxuntuk nilai PSNR citra hasildekompresicitra filtering 48. Text Boxuntuk besar ukuran citra hasildekompresicitra filtering 49.Text Boxuntukrunning timeprosesdekompresicitra filtering 50.Picture Box untuk menampilkan citra hasil dekompresi citra asli 51.Buttonuntuk melakukan proses dekompresi citra asli
52.Buttonuntuk menyimpan file citra hasil dekompresi citra asli 53.Buttonuntuk membuka kembali file citra hasil dekompresi citra asli 54.Text Boxuntuk ukuran lebar citra hasil dekompresi citra asli
55.Text Boxuntuk ukuran tinggi citra hasil dekompresi citra asli 56.Text Boxuntuk nilai MSE citra hasildekompresicitra asli 57.Text Boxuntuk nilai PSNR citra hasildekompresicitra asli 58. Text Boxuntuk besar ukuran citra hasildekompresicitra asli 59.Text Boxuntukrunning timeprosesdekompresicitra asli 60.Buttonuntuk mereset semua proses yang sudah dijalankan
3.3.2.3 Tampilan MenuHelp
Menu help menampilkan keterangan atau penjelasan mengenai fungsi dan penggunaan sistem, yang merupakan tahapan/langkah – langkah dalam mengoperasikan sistem. Berikut gambar 3.9 tampilan menuhelp.
Keterangan
Gambar 3.9 Tampilan MenuHelp
Keterangan:
1. Panel keterangan untuk menerangkan tujuan dan fungsi dari sistem serta metode apa yang digunakan dalam implementasinya.
2. Panel tahapantestingmenjelaskan langkah-langkah yang harus dilakukan pada prosestesting.
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 diagramIshikawa(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. DiagramIshikawa
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
filteringdan kompresi dengan metodearithmetic mean filteruntuk proses filtering dan Material
Manusia Mesin
Metode
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.1Form 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 menuHome, menu
Testing, menuHelp, danExit. Halaman menuhomedapat dilihat pada gambar 4.2.
Gambar 4.2. Halaman Menu Home
4.1.2Form Testing
Pada Form Testing akan menampilkan halaman untuk proses implementasi metode yang akan diuji/dijalankan. Proses testing dimulai dengan implementasi dari metode
Gambar 4.3. MenuTesting
4.1.3Form 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 menuHelp
4.2 Pengujian
Pengujian sistem dilakukan menggunakan citra digital berwarna dengan format BMP sebagai objek penelitian dengan ukuran bujur sangkar dan berdimensi maksimal 500x500 piksel. Dalam hal ini ada tiga objek citra yang akan digunakan, dengan masing-masing ukuran dimensi 300x300 piksel, 400x400 piksel, dan 500x500 piksel.
4.2.1 Pengujian form Testing
Pada form testingakan menampilkan prosesfiltering, kompresi, dan dekompresi pada citra yang menjadi objek penelitian. Dimana akan menunjukkan keefektifan dan efisiensi kinerja dari metode arithmetic mean filter dan metode run length encoding
untuk filtering dan kompresi citra yang diterapkan dalam penelitian ini. Berikut gambar 4.5 merupakan gambar dari tampilanopen file imagedalam mengawali proses
testing.
Gambar 4.5. ProsesOpen File Image
Langkah pertama yang harus dilakukan dalam proses testing adalah mengambil citra yang akan digunakan dengan memilih button “Buka Gambar” dan sekaligus akan menampilkan namafiledarifilecitra yang dibuka, ukuran citra, dan dimensi citra baik
4.2.1.1 ProsesFilteringMenggunakan MetodeArithmetic Mean Filter
Untuk melakukan proses filtering menggunakan metode arithmetic mean filter maka klik button filtering, maka sistem akan memproses dan menampilkan citra hasil
filtering beserta nilai MSE, PSNR, dan running time. Kemudian simpan citra hasil filtering dan buka kembali untuk melihat dimensi dan ukuran citra hasil filtering. Berikut gambar 4.6 tampilan hasil dari prosesfiltering.
Gambar 4.6. ProsesFilteringpada Citra
4.2.1.2 Proses Kompresi Menggunakan Metode Run Length Encoding (RLE) pada Citra HasilFiltering
Setelah melakukan proses filtering pada citra, maka citra hasil filtering akan dikompresi menggunakan metode run length encoding dengan memilih button
Gambar 4.7. Proses Kompresi Menggunakan MetodeRun Length Encoding (RLE) pada Citra HasilFiltering
4.2.1.3 Proses Kompresi Menggunakan Metode Run Length Encoding (RLE) pada Citra Asli
Gambar 4.8. Proses Kompresi Menggunakan MetodeRun Length Encoding (RLE) pada Citra Asli
4.2.1.4 Proses Dekompresi Citra Hasil Kompresi CitraFiltering
Untuk proses dekompresi pilih button dekompresi pada groupbox “Dekompresi Gambar Filtering”. Maka sistem akan menampilkan citra hasil dekompresi tersebut beserta running time dari proses kompresi, nilai MSE dan PSNR. Kemudian simpan gambar dan buka kembali untuk mengetahui dimensi dan ukuran citra hasil dekompresi. Berikut gambar 4.9 tampilan hasil dari proses dekompresi pada citra
filtering.
4.2.1.5 Proses Dekompresi Citra Hasil Kompresi Citra Asli
Pilih button dekompresi pada groupbox “Dekompresi Gambar Asli”. Maka sistem akan menampilkan citra hasil dekompresi tersebut beserta running time dari proses kompresi, nilai MSE dan PSNR. Kemudian simpan gambar dan buka kembali untuk mengetahui dimensi dan ukuran citra hasil dekompresi. Berikut gambar tampilan hasil dari proses dekompresi pada citra asli.
Gambar 4.B0 Proses Dekompresi Citra Hasil Kompresi Citra Asli
4.3 Hasil Pengujian
Tabel 4.B. Hasil Kompresi Citra Asli dan Citra Filtering Para
Meter Citra Asli CitraFiltering TerkompresiCitra Asli Citra FilteringTerkompresi
gambar_B.bmp
MSE 200
PSNR 25 db
Dimensi Citra
400x400 piksel 400x400 piksel 375x375 369x369
Ukuran Citra
468 KB 625 KB 549 KB 531 KB
Rasio Kompresi
-17,31% 15,04 %
Running Time
65,179 s 1,353 s 0,958 s
gambar_2.bmp
MSE 357
PSNR 23 db
Dimensi Citra
Ukuran Citra
263 KB 351 KB 312 KB 304 KB
Rasio Kompresi
-18,63% 13,39%
Running Time
13,033 s 0,531 s 0.819 s
gambar_3.bmp
MSE 298
PSNR 23 db
Dimensi Citra
500x500 piksel 500x500 piksel 479x479 piksel 476x476 piksel
Ukuran Citra
732 KB 976 KB 896 KB 885 KB
Rasio Kompresi
-22,4% 9,32 %
Running Time
Tabel 4.2. Hasil Dekompresi Citra Asli Terkompres dan Citra Filtering Terkompres
Para
Meter TerkompresCitra Asli CitraTerkompresFiltering DekompresiCitra Asli Terkompresi
Dekompresi Citra Filtering
Terkompresi
gambar_B.bmp
MSE 200 219 465
PSNR 25 db 25 db 21
Dimensi Citra
400x400 piksel 400x400 piksel 400x400 piksel 400x400 piksel
Ukuran Citra
468 KB 625 KB 625 KB 625 KB
Rasio Kompresi
Running Time
21,892 s 3,828 s 3,926 s
gambar_2.bmp
MSE 357 339 693
Dimensi Citra
300x300 piksel 300x300 piksel 300x300 piksel 300x300 piksel
Ukuran Citra
263 KB 351 KB 351 KB 351 KB
Rasio Kompresi
Running Time
13,033 s 2,16 s 2,178 s
gambar_3.bmp
MSE 298 521 549
PSNR 23 db 21 db 21 db
Dimensi Citra
500x500 piksel 500x500 piksel 500x500 piksel 500x500 pi ksel
Ukuran Citra
732 KB 976 KB 976 KB 976 KB
Rasio Kompresi
Running Time
36,883 s 5,982 s 5,959 s
Tabel 4.4. Hasil Perhitungan MSE, PSNR, Dimensi, dan Ukuran Citra Filtering, Dekompresi Citra Asli Terkompresi, dan Dekompresi Citra Filtering
Terkompresi
Berdasarkan tabel 4.1 dan tabel 4.3 di atas maka dapat dilihat bahwa kinerja metode
arithmetic mean filter dalam membantu kinerja metode run length encoding untuk melakukan kompresi pada citra cukup baik namun proses filtering pada citra menambah ukuran citra sehingga tidak dapat menigkatkan kefektifan kinerja dari metode kompresirun length encoding. Dan kualitas citra yang ditampilkan dari proses
kompresi pada setiap dimensi citra hingga 7% dengan efisiensi waktu yang baik dalam proses kompresinya yakni hanya sekitar 1 - 2 sekon saja.
Namun proses kompresi pada citra dengan metode run length encoding dapat didekompresi sehingga citra yang sudah terkompres sebelumnya dapat dikembalikan kedalam bentuk semula namun kualitas yang ditampilkan memang tidak sebaik citra yang asli sebelumnya namun cukup bagus. Hal ini dapat dilihat dari nila MSE dan PSNR nya, pada citra hasil filtering rata rata nilai MSE dan PSNR nya adalah 285 dan 23,67 db. Sedangkan rata-rata nilai MSE dan PSNR citra hasil dekompresi untuk citrafilteringyang terkompresi adalah 569 dan 20,67 db, sehingga dapat dilihat selisih MSE dan PSNR nya adalah 284 dan 3 db. Selisih nilai MSE nya memang cukup besar namun selisih dari nilai PSNR nya sangat sedikit hanya sekitar 12,5 % perbedaannya dari nilai PSNR awal.
Jika dilihat dari nilai MSE dan PSNR nya juga, maka kualitas citra dari hasil dekompresi citra asli terkompres lebih baik dibandingkan citra hasil dekompresi citra
BAB 5
KESIMPULAN DAN SARAN
5.B Kesimpulan
Berdasarkan hasil implementasi dan pengujian sistem implementasi metodearithmetic mean filter dan kompresi citra menggunakan metode run length encoding maka kesimpulan yang didapat adalah sebagai berikut:
1. Penambahan proses filtering menggunakan metode arithmetic mean filter dapat membantu metode run length encoding untuk melakukan kompresi pada citra sehingga citra dapat terkompresi, namun ukuran citra hasil kompresi tidak lebih kecil dari citra asli disebabkan proses filtering yang telah dilakukan sebelumnya menggunakan metodearithmetic mean filterternyata menambah ukuran citra.
2. Waktu proses kompresi menggunakan metode run length encoding sangat cepat. Semakin kecil ukuran citra semakin cepat proses kompresi.
3. Metode run length encoding adalah metode kompresi citra yang sangat buruk karena tidak mampu melakukan kompresi pada citra dengan baik
4. Citra hasil kompresi menggunakan metode run length encoding dapat didekompresi dan menghasilkan citra dekompresi yang cukup baik. Artinya citra yang telah dikompresi dapat dikembalikan ke dalam bentuk semula namun kualitasnya tidak sebaik citra awal.
6. Waktu yang dibutuhkan untuk proses dekompresi sedikit lebih lama dibandingkan waktu untuk proses kompresi.
5.2 Saran
Adapun saran-saran yang diperlukan untuk penelitian maupun pengembangan berikutnya adalah:
1. Sistem ini belum mampu meningkatkan kinerja dari metode run length encoding
dalam melakukan kompresi pada citra, untuk pengembangan selanjutnya diharapakan dapat menemukan solusi yang tepat untuk meningkatkan kemampuan atau kinerja dari metode kompresi pada citra tersebut.
2. Sistem ini menggunakan software sharpDevelop 4.3, untuk penelitian selanjutnya diharapkan dapat menggunakan software lain seperti matlab, delphi, Java, dan lain sebagainya agar lebih berkembang dan variatif.
3. Pada sistem ini citra yang digunakan adalah citra berbentuk persegi, pada penelitian selanjutnya diharapkan dapat mengakses semua bentuk dan ukuran citra.
BAB 2
LANDASAN TEORI
2.1 Citra
2.1.1 Definisi Citra
Citra adalah suatu representasi (gambaran), kemiripan, atau imitasi dari suatu objek. Citra digital adalah citra yang dapat diolah oleh komputer. Citra sebagai keluaran suatu sistem perekaman data dapat bersifat optik berupa foto, bersifat analog berupa sinyal-sinyal video seperti gambar pada monitor televisi, atau bersifat digital yang dapat langsung disimpan pada suatu media penyimpanan (Sutoyo dkk, 2009).
2.1.2 Picture Element (pixel)
Setiap picture element(pixel) atau disebut juga piksel digambarkan sebagai satu kotak kecil. Setiap piksel mempunyai koordinat posisi. Sistem koordinat piksel mengikuti asas pemindaian pada layar TV standar, dimana setiap piksel memiliki koordinat berupa
(x,y) Dalam hal ini,
x menyatakan posisi kolom; Y menyatakan posisi baris;
Piksel pojok kiri-atas mempunyai koordinat (0,0) dan piksel pada pojok kanan-bawah mempunyai koordinat (N-1, M-1) (Kadir & Susanto, 2013).
Namun dalam praktiknya, penggunaan koordinat pada sistem tertentu mempunyai sedikit perbedaan, contohnya pada MATLAB piksel pojok kanan-atas tidak mempunyai koordinat (0,0) melainkan (1,1) (Kadir & Susanto, 2013).
Citra bitmap adalah susunan bit-bit warna untuk tiap pixel yang membentuk pola tertentu.Pola-pola warna ini menyajikan informasi yang dapat dipahami sesuai dengan persepsi indera penglihatan manusia. Format file ini merupakan format grafis yang fleksibel untukplatform Windowssehingga dapat dibaca oleh program grafis manapun. Format ini mampu menyimpan informasi dengan kualitas tingkat 1 bit sampai 24 bit. Citra bitmap didefinisikan sebagai fungsi f (x,y) dengan x dan y adalah koordinat bidang. Besaran f untuk tiap koordinat (x,y) disebut intensitas atau derajat keabuan citra pada titik tersebut (Jannah, 2008). Berikut gambar 2.1 menunjukkan gambar matriksbitmap
Gambar 2.1 .Bitmapdengan nilai matriksnya (Sutoyo dkk, 2009)
2.1.4 Jenis Citra
2.1.4.1 Citra Biner (Monokrom)