Implementasi Metode Arithmetic Mean Filter Dan Kompresi Citra Menggunakan Metode Run Length Encoding
A-1
LISTING PROGRAM
Kode Program Menu Utama:
using System;
using System.Collections.Generic; using System.Drawing;
using System.Windows.Forms; namespace myProjetct
{
/// <summary>
/// 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)
(2)
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;
using System.Drawing; using System.Linq;
using System.Windows.Forms; using System.Drawing.Imaging; using System.IO;
using System.Diagnostics;
using System.Runtime.InteropServices; namespace myProjetct
{
/// <summary>
/// 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);
if (button == DialogResult.Yes) Application.Exit(); }
(3)
A-3
void HomeToolStripMenuptemClick(object sender, EventArgs e)
{
Form a = new MainForm(); this.Dispose();
a.ShowDialog(); }
void HelpToolStripMenuptemClick(object sender, EventArgs e)
{
Form b = new Help(); this.Dispose(); b.ShowDialog(); }
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_r = new StreamWriter(@"D:\\Retri Scrib\\cicilan program\\Notepad\\gbr_asli_red.txt", false);
(4)
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");
} }
tulis_r.Close();
for (int i = 0; i < 1; i++) {
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(); }
catch (Exception v) {
MessageBox.Show("Batal"); }
}
(5)
A-5
{
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++) {
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.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) {
Stopwatch watch = new Stopwatch();// running time watch.Start();
(6)
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 ();
PSNR1.Text
= PSNR(Convert.ToDouble(MSE1.Text)).ToString(); }
else {
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) {
(7)
A-7
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;
//pengecekan jumlah red lebih dari 3 if (jumred >= 1)
(8)
{
//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]) {
(9)
A-9
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++; }
}
gbrKompresi.Image = finalimage; watch.Stop();
(10)
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(); }
(11)
A-11
{
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;
arrayred[acuan] = red; arraygreen[acuan] = green; arrayblue[acuan] = blue;
(12)
//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++;
(13)
A-13
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++)
(14)
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();
for (int i = 0; i < RED.Length; i++) {
(15)
A-15
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_g
(16)
= 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");
} }
tulis_r.Close();
for (int i = 0; i < 1; i++) {
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(); }
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 {
(17)
A-17
}
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");
} }
tulis_r.Close();
for (int i = 0; i < 1; i++) {
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(); }
void Simpan3Click(object sender, EventArgs e) {
(18)
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");
} }
tulis_r.Close();
for (int i = 0; i < 1; i++) {
for (int j = 0; j < gambarasli_g.Length; j++) {
tulis_g.Write(gambarasli_g[i, j].ToString() + "\t");
} }
(19)
A-19
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
program\\Notepad\\dekompres_red_filter.txt", false); StreamWriter tulis_green
(20)
= 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++;
} }
//MessageBox.Show(red.ToString()); int b = 0;
for (int i
= 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
(21)
A-21
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); }
(22)
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();
PSNR2.Text
= PSNR(Convert.ToDouble(MSE2.Text)).ToString(); }
else {
MessageBox.Show("salah"); }
}
void Simpan4Click(object sender, EventArgs e) {
(23)
A-23
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_r.Close();
for (int i = 0; i < 1; i++) {
for (int j = 0; j < gambarasli_g.Length; j++) {
(24)
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(); }
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) {
OpenFileDialog open = new OpenFileDialog(); open.Filter = "Image File(.*bmp)|*.bmp"; if (open.ShowDialog() == DialogResult.OK)
(25)
A-25
{
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; }
(26)
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
Anggota Majelis Permusyawaratan Mahasiswa Universitas (MPMU) USU tahun 2014 Anggota UKMI Ad-Dakwah USU tahun 2015
(27)
B-2
PENGALAMAN PEKERJAAN
Mengajar Privat tahun 2015
(28)
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.
(29)
62
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.
(30)
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
Persyaratan fungsional adalah tahapan yang menggambarkan dan memaparkan tentang fungsi-fungsi dan kerja yang harus dan dapat dilakukan oleh sistem yang akan
(31)
22 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
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 metodeRun Length Encoding(RLE). Hasil dari masing-masing proses dapat disimpan dengan format keluaran .*bmp.
(32)
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.
Berikut ini merupakan spesifikasi Use Case untuk filtering dapat dilihat pada Tabel 3.1.
(33)
24
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
(34)
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
(35)
26 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
(36)
Gambar 3.3Activity DiagramProses Kompresi
(37)
28
Gambar 3.4Activity DiagramProses Dekompresi
(38)
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:
(39)
30
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 0 4 3 8 0 9 0 1 2 22 1 2 8 0 8 8 3 3 4 3 22 5 0 3 3 9 0 9 0 9 0 43 4 5 1 2 8 0 8 7 6 6 44 4 4 4 4 8 0 6 6 6 5 97 1 2 1 2 4 3 4 3 4 3 12 9 0 4 3 8 0 9 0 1 2 22 1 2 8 0 8 8 3 3 4 3 22 5 0 3 3 9 0 9 0 9 0 43 4 5 1 2 8 0 8 7 6 6 44 4 4 4 4 8 0 6 6 6 5 97 1 2 1 2 4 3 4 3 4 3 1 2 9 0 4 3 2 2 1 2 8 0 2 2 5 0 3 3
(40)
(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 0 4 3 2 2 4 0 8 0 2 2 5 0 3 3 12 9 0 4 3 8 0 9 0 1 2 22 4 0 8 0 8 8 3 3 4 3 22 5 0 3 3 9 0 9 0 9 0 43 4 5 1 2 8 0 8 7 6 6 44 4 4 4 4 8 0 6 6 6 5 97 1 2 1 2 4 3 4 3 4 3 12 9 0 4 3 8 0 9 0 1 2 22 1 2 8 0 8 8 3 3 4 3 22 5 0 3 3 9 0 9 0 9 0 43 4 5 1 2 8 0 8 7 6 6 44 4 4 4 4 8 0 6 6 6 5 97 1 2 1 2 4 3 4 3 4 3 9 0 4 3 8 0 1 2 8 0 8 8 5 0 3 3 9 0 12 9 0 4 3 8 0 9 0 1 2 22 4 0 6 3 8 8 3 3 4 3 22 5 0 3 3 9 0 9 0 9 0 Piksel tengah dari kernel 3x3
(41)
32
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
43 4 5 1 2 8 0 8 7 6 6 44 4 4 4 4 8 0 6 6 6 5 97 1 2 1 2 4 3 4 3 4 3 12 9 0 4 3 8 0 9 0 1 2 22 4 0 6 3 7 0 6 8 4 3 22 3 5 5 4 6 6 7 4 9 0 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 0 4 3 8 0 9 0 1 2 22 4 0 6 3 7 0 6 8 4 3 22 3 5 5 4 6 6 7 4 9 0 43 3 7 5 3 6 5 7 9 6 6
(42)
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 0 4 3 8 0 9 0 1 2 22 4 0 6 3 7 0 6 8 4 3 22 3 5 5 4 6 6 7 4 9 0 43 3 7 5 3 6 5 7 9 6 6
(43)
34
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
(44)
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
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 = 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.
(45)
36
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
(46)
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]
kompresred<- ambil_nilai(notepad1) kompresgreen<- ambil_nilai(notepad2) kompresblue<- ambil_nilai(notepad3) jlh_red <- ambil_nilai(notepad4)
(47)
38
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.
(48)
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
(49)
40 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
(50)
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
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
(51)
42 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
(52)
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
Tahapan Testing 1
(53)
44
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.
(54)
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 Arithmetic Mean Filter dan Run Length Encoding untuk mengolah dan melakukan kompresi citra BMP
(55)
46 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
Arithmetic Mean Filter kemudian metode kompresi yaitu metode Run Length Encoding. Form testingdapat dilihat pada gambar 4.3.
(56)
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
(57)
48
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
(58)
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
kompresi pada groupbox “Kompresi Gambar Filtering”. Maka sistem akan menampilkan citra hasil kompresi tersebut beserta running time dari proses kompresi. Kemudian simpan gambar dan buka kembali untuk mengetahui dimensi dan ukuran citra hasil kompresi serta rasio kompresinya. Berikut gambar 4.7 tampilan hasil dari proses kompresi pada citra hasilfiltering.
(59)
50
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
Proses kompresi menggunakan metode run length encoding (RLE) pada citra asli dengan memilih button kompresi pada groupbox “Kompresi Gambar Asli”. Maka sistem akan menampilkan citra hasil kompresi tersebut beserta running time dari proses kompresi. Kemudian simpan gambar dan buka kembali untuk mengetahui dimensi dan ukuran citra hasil kompresi serta rasio kompresinya. Berikut gambar 4.8 tampilan hasil dari proses kompresi pada citra asli.
(60)
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.
(61)
52 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
Berikut ini adalah hasil pengujian sistem pada form testing untuk mengimplementasikan kinerja metode arithmetic mean filter dan metode run length encoding, dengan menggunakan tiga objek gambar dengan ukuran dimensi masing-masing 300x300 piksel, 400x400 piksel, dan 500x500. Hasil pengujian sistem dapat dilihat pada tabel 4.1, tabel 4.2, tabel 4.3 dan tabel 4.4 berikut ini.
(62)
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
(63)
54
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
(64)
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
(65)
56
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.3. Hasil Perhitungan Dimensi, Ukuran, dan Rasio Kompresi pada Citra Asli Terkompres, dan CitraFilteringTerkompres
(66)
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
filtering berdasarkan visualisasi dan nilai MSE, serta PSNR nya juga cukup bagus. Dimana dari ketiga gambar yang diuji nilai MSE tertinggi dalam prosesfiltering pada citra hanya 357, artinya cukup rendah dan menunjukkan bahwa kualitas citra yang ditampilkan cukup baik. Metode run length encoding mampu bekerja dalam melakukan kompresi pada citra hanya setelah citra melalui proses filtering sebelumnya, dari tabel di atas dapat dilihat juga bahwa metode run length encoding mampu mengkompresi citra hingga 15% saja untuk citra yang telah difiltering sebelumnya, sedangkan untuk citra asli yang tidak melalui proses filtering terlebih dahulu, metoderun length encodingtidak mampu mengkompresi citra, bahkan ukuran citra bisa bertambah hingga 22% lebih, walaupun metode ini mampu melakukan
(67)
58 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
filtering terkompres, di mana rata-rata MSE dan PSNR dari citra hasil dekompresi citra asli terkompres adalah 359, 67 dan 23 db, sedangkan nilai MSE dan PSNR dari citra hasil dekompresi citra filtering terkompres adalah 569 dan 20,67 db. Perlu diketahui bahwa semakin rendah nilai MSE suatu citra maka semakin baik kualitas citra tersebut, sebaliknya semakin tinggi nilai PSNR suatu citra maka semakin tinggi pula kualitas citra tersebut.
(68)
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.
5. Kualitas Citra hasil dekompresi dari citra asli yang terkompres lebih baik dari pada citra hasil dekompresi dari citrafilteringyang terkompres.
(69)
60
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.
(70)
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).
(71)
7
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)
Setiap piksel hanya terdiri dari warna hitam atau putih, karena hanya ada dua warna untuk setiap piksel, maka hanya perlu 1 bit per piksel (0 dan 1) atau apabila dalam 8 bit ( 0 dan 255), sehingga sangat efisien dalam hal penyimpanan. Gambar yang direpresentasikan dengan biner sangat cocok untuk teks (dicetak atau tulisan tangan), sidik jari (finger print), atau gambar arsitektur (Kusumanto & Tompunu, 2011). Gambar 2.2 berikut adalah contoh citra biner.
(72)
Gambar 2.2 Citra Biner (Alasdair, 2004) 2.1.4.2 Citra Skala Keabuan (Grayscale)
Citra grayscale merupakan citra digital yang hanya memiliki satu nilai kanal pada setiap piksel-nya, dengan kata lain nilai bagianRED=GREEN=BLUE. Nilai tersebut digunakan untuk menunjukkan tingkat intensitas. Warna yang dimiliki adalah warna dari hitam, keabuan, dan putih. Tingkatan keabuan di sini merupakan warna abu dengan berbagai tingkatan dari hitam hingga mendekati putih. Citra grayscaleberikut memiliki kedalaman warna 8 bit (256 kombinasi warna keabuan) (Hariyati, 2014). Berikut contoh citragrayscalepada gambar 2.3.
Gambar 2.3 CitraGrayscale 2.1.4.3. Citra Warna (True Color)
Pada citra warna setiap titik mempunyai warna yang spesifik yang merupakan kombinasi dari tiga warna dasar, yaitu: merah, hijau, biru. Format citra ini sering disebut sebagai citra RGB (red- green-blue). Setiap warna dasar mempunyai intensitas sendiri dengan nilai maksimum 255 (8 bit).
(73)
9 Dengan demikian setiap titik pada citra warna membutuhkan 3 byte. Jumlah kombinasi warna yang mungkin untuk format citra ini adalah 224 atau lebih dari 16 juta warna, dengan demikian dianggap mencakup semua warna yang ada, inilah sebabnya format ini dinamakan true color (Jalaluddin & Melita, 2012). Pada gambar 2.4 berikut adalah contoh citra warna.
Gambar 2.4 Citra Warna (Hariyati, 2014) 2.1.4.4 Citra Warna Berindeks
Setiap titik (pixel) pada citra warna berindeks mewakili indeks dari suatu tabel warna yang tersedia (biasanya disebut palet warna),
Keuntungan pemakaian palet warna adalah kita dapat dengan cepat memanipulasi warna tanpa harus mengubah informasi pada setiap titik dalam citra. Keuntungan yang lain, penyimpanan lebih kecil (Syarif dkk, 2012). Berikut adalah contoh citra warna berindeks pada gambar 2.5.
(74)
Gambar 2.5 Citra Warna Berindeks (Syarif dkk, 2012) 2.2 Pengolahan Citra
2.2.1 Definisi Pengolahan Citra
Pengolahan Citra adalah kegiatan memperbaiki kualitas citra agar mudah diinterpretasi oleh manusia/mesin (komputer). Masukannya adalah citra dan keluarannya juga citra tapi dengan kualitas lebih baik daripada citra masukan, misal citra warnanya kurang tajam, kabur (blurring), mengandungnoise (misal bintik-bintik putih), dan lain-lain sehingga perlu ada pemrosesan untuk memperbaiki citra karena citra tersebut menjadi sulit diinterpretasikan karena informasi yang disampaikan menjadi berkurang (Syarif dkk, 2012).
2.2.2. Aplikasi dan Prinsip Dasar Pengolahan Citra
pengolahan citra merupakan bagian penting yang mendasari aplikasi nyata, seperti pengenalan pola, penginderaan jarak jauh melalui satelit atau pesawat udara, dan
machine vision. Pada pengenalan pola, pengolahan citra antara lain berperan memisahkan objek dari latar belakang secara otomatis. Selanjutnya, objek akan diproses oleh pengklasifikasi pola. Pengolahan citra juga dapat dimanfaatkan, misalnya untuk penentuan jenis jenis tanaman hias melalui ciri-ciri citra daun.
Aplikasi-aplikasi seperti itu menggunakan prinsip dasar dalam pengolahan citra seperti peningkatan kecerahan dan kontras, penghilangan derau pada citra, dan pencarian bentuk objek (Kadir & Susanto, 2013).
(1)
DAFTAR ISI
Halaman
Persetujuan ii
Pernyataan iii
Penghargaan iv
Abstrak vi
Abstract vii
Daftar Isi viii
Daftar Tabel xi
Daftar Gambar xii
Daftar Lampiran xiii
Bab 1 Pendahuluan
1.1 Latar Belakang 1
1.2 Rumusan Masalah 2
1.3 Batasan Masalah Atau Ruang Lingkup Masalah 3
1.4 Tujuan Penelitian 3
1.5 Manfaat Penelitian 3
1.6 Metode Penelitian 3
1.7 Sistematika Penulisan 4
Bab 2 Landasan Teori
2.1 Citra 6
2.1.1 Definisi Citra 6
2.1.2Picture Element (Pixel) 6
2.1.3 Matriks Bitmap 7
2.1.4 Jenis Citra 7
2.1.4.1 Citra Biner (Monokrom) 7
2.1.4.2 Citra Skala Keabuan (Grayscale) 8
2.1.4.3 Citra Warna (True Color) 8
2.1.4.4 Citra Warna Berindeks 9
2.2 Pengolahan Citra 10
2.2.1 Definisi Pengolahan Citra 10
2.2.2 Aplikasi dan Prinsip Dasar Pengolahan Citra 10 2.2.3 Peningkatan Kualitas Citra (Image Enhancement) 11
2.2.4 Perbaikan Citra (Image Restoration) 11
2.2.5 Transformasi Fourier 12
2.2.6 Segmentasi 12
2.3Filtering 13
2.3.1Arithmetic Mean Filter 13
2.4 Kompresi Citra 14
2.4.1 Pengertian Kompresi 14
(2)
2.4.3 MetodeRun Length Encoding 17
2.4.4Ratio Of Compression(RG) 18
2.4.5Compression Ratio(CR) 18
2.4.6 Data Berlebihan (Data Redudency) 18
2.5Mean Square Error(MSE) danPeak Signal to Noise Ratio(PSNR) 19 Bab 3 Analisis dan Perancangan Sistem
3.1 Analisis Sistem 21
3.1.1 Analisis Masalah 21
3.1.2 Analisis Persyaratan 21
3.1.2.1 Persyaratan Fungsional 21
3.1.2.2 Persyaratan Non-Fungsional 22
3.1.3 Analisis Proses 22
3.1.3.1Use CaseDiagram 23
3.1.3.2ActivityDiagram 26
3.1.3.3SequanceDiagram 29
3.1.3.4 Analisis Proses MetodeArithmetic Mean Filter 29 3.1.3.5 Analisis Proses MetodeRun Length Encoding(RLE) 32
3.2PseudocodeProgram 34
3.2.1Pseudocode Arithmetic Mean Filter 34
3.2.2Pseudocode Run Length Encoding 35
3.2.3PseudocodeDekompresi Metode RunLength Encoding 37
3.3 PeranGangan Sistem 37
3.3.1FlowchartSistem 38
3.3.2 PeranGangan Antarmuka Sistem 39
3.3.2.1 Tampilan Menu Utama 39
3.3.2.2 Tampilan MenuTesting 40
3.3.2.3 Tampilan MenuHelp 42
Bab 4 Implementasi dan Pengujian
4.1 Implementasi 44
4.1.1Form Home 45
4.1.2Form Testing 45
4.1.3Form Help 46
4.2 Pengujian 47
4.2.1 PengujianForm Testing 47
4.2.1.1 ProsesFilteringMenggunakan Metode
Arithmetic Mean Filter 48
4.2.1.2 Proses Kompresi Menggunakan Metode
Run Length Encoding(RLE) pada Citra HasilFiltering 48 4.2.1.3 Proses Kompresi Menggunakan Metode
Run Length Encoding(RLE) pada Citra Asli 49 4.2.1.4 Proses Dekompresi Citra Hasil Kompresi CitraFiltering 50 4.2.1.5 Proses Dekompresi Citra Hasil Kompresi Citra Asli 51
(3)
Bab 5 Kesimpulan dan Saran
5.1 Kesimpulan 58
5.2. Saran 59
(4)
DAFTAR TABEL
Nomor
Tabel Nama Tabel Halaman
3.1 3.2 3.3 3.3 3.5 3.6 3.7 3.8 3.1 3.2 3.3 3.3
SpesifikasiUse CaseProsesFilteringdenganArithietic Mean Filter
SpesifikasiUse CaseProses Kompresi denganRun Length Encoding(RLE)
SpesifikasiUse CaseProses Dekompresi Matriks Citra 6x6
HasilFilteringMatriks 6x6 Matriks Citra Hasil Filtering
Nilai Matriks Citra Setelah Dikompresi
Jumlah Masing-Masing Nilai Piksel Citra Terkompres Hasil Kompresi Citra Asli dan CitraFiltering
Hasil Dekompresi Citra Asli Terkompres dan Citra Filtering Terkompres
Hasil Perhitungan Dimensi, Ukuran dan Rasio Kompresi pada Citra Asli Terkompres dan CitraFilteringTerkompres
Hasil Perhitungan MSE, PSNR, Dimensi, dan Ukuran dari Citra Filtering, Citra Dekompresi dari Citra Asli Terkompres, dan Citra Dekompresi dari CitraFilteringTerkompres
23 23 25 30 32 32 33 33 52 53 55 56
(5)
DAFTAR GAMBAR
Nomor
Gambar Nama Gambar Halaman
2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 4.10
Bitmap dengan Nilai Matrisknya Citra Biner
Citra Grayscale Citra Warna
Citra Warna Berindeks Pemilihan Kernel 3x3
Proses Kompresi Citra Analog ke Citra Digital dan Pengirimannya
Kompresi Citra Menggunakan 7-Zip Use Case Diagram
Activity DiagramProsesFiltering Activity DiagramProses Kompresi Activity DiagramProses Dekompresi Sequence DiagramSistem
FlowchartSistem Tampilan Menu Utama Tampilan MenuTesting Tampilan MenuHelp DiagramIshikawa Halaman MenuHome MenuTesting
MenuHelp
ProsesOpen File Image ProsesFilteringpada Citra
Proses Kompresi Menggunakan Metode Run Length Encoding (RLE) pada Citra HasilFiltering
Proses Kompresi Menggunakan Metode Run Length Encoding (RLE) pada Citra Asli
Proses Dekompresi Citra Hasil Kompresi CitraFiltering Proses Dekompresi Citra Hasil Kompresi Citra Asli
7 8 8 9 10 13 15 16 23 26 27 28 29 38 39 40 43 44 45 46 46 47 48 49 50 50 51
(6)
DAFTAR LAMPIRAN
Halaman
A.ListingProgram A-1