Aplikasi Pengolahan Citra Digital Untuk Menghitung Jumlah Suatu Objek Pada Suatu Daerah Pengamatan.

(1)

i

Universitas Kristen Maranatha

APLIKASI PENGOLAHAN CITRA DIGITAL DALAM

MENGHITUNG JUMLAH SUATU OBJEK PADA SUATU

DAERAH PENGAMATAN

Rubinhut Sihar / 0322161

Jurusan Teknik Elektro, Fakultas Teknik Universitas Kristen Maranatha

Jl. Prof. Drg. Suria Sumantri 65, Bandung 40164, Indonesia Email : [email protected]

ABSTRAK

Pada tugas akhir ini telah dibuat sebuah perangkat lunak yang dapat menghitung banyak objek sekaligus mengklasifikasikannya dengan menggunakan teknologi pengolahan citra digital, pembuatan perangkat lunak ini di dasari dibutuhkannya suatu alat yang dapat menghitung suatu objek pada suatu daerah pengamatan dengan cepat dan akurat.

Dalam tugas akhir ini digunakan metode image component labelling dalam melakukan pembentukan suatu objek dalam citra dan metode shape factor untuk melakukan pengenalan objek bedasarkan bentuk morfologinya.

Dengan kedua metode tersebut di dapatkan tingkat keberhasilan perangkat lunak dalam mengenali dan mengklasifikasian empat macam objek dalam tiga kali percobaan mencapai 94,65% dan keberhasilan perangkat lunak dalam melakukan penghitungan objek secara keseluruhan dalam tiga kali percobaan mencapai 99,73%.


(2)

ii

Universitas Kristen Maranatha

DIGITAL IMAGE PROCESSING APPLICATION FORCOUNTING

THE NUMBER OF OBJECTS IN AN OBSERVATED AREA

Rubinhut Sihar / 0322161

Department of Electrical Engineering, Faculty of Technique Maranatha Christian University

Jl. Prof. Drg. Suria Sumantri 65, Bandung 40164, Indonesia Email : [email protected]

ABSTRACT

This final project, used be realize a software can be count the number of objects and classifying by used digital image processing technology, the created software created equipments a tools witches can be count a number object at observed area swiftly and accurate.

Image component labeling method used for created object at image and shape factor used for object identification based on morphologically form.

By using both of the method, software level success for identifying and classify four objects within three times experiment effort to 94,65% and for to do a object count for three times experiment effort to 99,73%.


(3)

v

Universitas Kristen Maranatha

DAFTAR ISI

ABSTRAK i

ABSTRACT ii

KATA PENGANTAR iii

DAFTAR ISI v

DAFTAR TABEL vii

DAFTAR GAMBAR viii

BAB I PENDAHULUAN 1

1.1 Latar Belakang 1

1.2 Identifikasi Masalah 1

1.3 Perumusan Masalah 1

1.4 Tujuan 1

1.5 Pembatasan Masalah 2

1.6 Sistematika Penulisan 2

BAB II LANDASAN TEORI 4

2.1 Pengolahan Citra Digital 4

2.1.1 Pengantar Pengolahan Citra Digital 4

2.1.2 Citra Kontinyu 4

2.1.3 Citra Digital 4

2.1.4 Pixel 5

2.1.5 Warna Pada Citra Digital 6

2.1.5.1 RGB 7

2.1.5.2 Grayscale 7

2.1.5.3 Biner 8

2.1.6 Tresholding 9

2.1.7 Histogram 10

2.1.8 Cropping 11

2.1.9 Pixel Tetangga 12

2.1.10 Shape Factor 12

2.2 C# 13

2.2.1 Pengolahan Citra Digital menggunakan C# 13

2.2.1.1 Class GDI + 14


(4)

vi

Universitas Kristen Maranatha

BAB III PERANCANGAN PERANGKAT LUNAK 17

3.1 Perancangan Antarmuka Perangkat Lunak 17

3.1.1 Perancangan Antarmuka Form Utama 18

3.1.2 Perancangan Antarmuka Form Splash Screen 20

3.1.3 Perancangan Antarmuka Form Konverter ke Biner 21 3.1.4 Perancangan Antarmuka Form Konverter ke Kode 22 3.1.5 Perancangan Antarmuka Form Klasifikasi Objek 24

3.2 Alur Kerja Perangkat Lunak 26

3.2.1 Konversi Citra ke Grayscale 28

3.2.2 Konversi ke Biner 29

3.2.3 Pemisahan Latar Belakang dan Objek 31

3.2.4 Terjemahkan Citra ke Dalam Bentuk Objek 32

3.2.5 Labelisasi 33

3.2.6 Pengenalan dan Pengklasifikasian Objek 36

3.2.7 Penghitungan Banyak Objek 40

3.2.8 Tampilkan Banyak Objek Perklasifikasi 40

BAB IV PENGAMATAN DAN ANALISA DATA 41

4.1 Pengamatan 41

4.1.1 Objek Pengamatan 40

4.1.2 Citra Pengamatan 42

4.2 Analisis Data 49

BAB V KESIMPULAN DAN SARAN 56

5.1 Kesimpulan 56

5.2 Saran 56

DAFTAR PUSTAKA 57

LAMPIRAN A - SCREEN SHOOT A

LAMPIRAN B - LISTING PROGRAM B

LAMPIRAN C - PENGENALAN VISUAL C# C


(5)

vii

Universitas Kristen Maranatha

DAFTAR TABEL

Tabel 3.1 Kontrol dan properti pada form utama 19 Tabel 3.2 Kontrol dan properti pada splash screen 20 Tabel 3.3 Kontrol dan properti pada form konverter ke biner 22 Tabel 3.4 Kontrol dan properti pada form konverter ke kode 23 Tabel 3.5 Kontrol dan properti pada form klasifikasi 25 Tabel 4.1 Objek - objek yang digunakan dalam pengamatan 41

Tabel 4.2 Data pengamatan - 1 objek 1 jenis 43

Tabel 4.3 Data pengamatan - 2 objek 1 jenis 44

Tabel 4.4 Data pengamatan - 3 objek 1 jenis 45

Tabel 4.5 Data pengamatan - Banyak objek 3 jenis 46 Tabel 4.6 Data pengamatan - Banyak objek 4 jenis 47 Tabel 4.7 Data pengamatan - Banyak objek 5 jenis 48

Tabel 4.8 Data pengamatan penghitungan objek 50

Tabel 4.9 Data pengamatan pengklasifikasian objek 51


(6)

viii

Universitas Kristen Maranatha

DAFTAR GAMBAR

Gambar 2.1 Contoh pixel yang di dapat dari perbesaran suatu citra digital

5 Gambar 2.2 Nilai - nilai tingkat kecerahan suatu warna pada suatu

pixel

6 Gambar 2.3 Warna - warna yang dapat dihasilkan oleh ketiga layer

warna RGB

7 Gambar 2.4 Grafik histogram pada suatu citra digital 11 Gambar 2.5 Proses cropping pada citra digital 11

Gambar 2.6 Pixel - pixel tetangga 12

Gambar 3.1 Diagram perancangan form 17

Gambar 3.2 Form Utama 18

Gambar 3.3 Form Splash Screen 21

Gambar 3.4 Form konverter ke biner 21

Gambar 3.5 Form konverter ke kode 23

Gambar 3.6 Form klasifikasi objek 24

Gambar 3.7 Diagram alir alur kerja perangkat lunak 27 Gambar 3.8 Diagram alir alur kerja konversi citra ke grayscale 28 Gambar 3.9 Diagram alir alur kerja konversi citra ke biner 31 Gambar 3.10 Diagram alir alur kerja pemisahan objek dengan latar

belakang

32 Gambar 3.11 Diagram alir alur kerja konversi citra ke kode 33 Gambar 3.12 Diagram alir alur kerja labelisasi 35 Gambar 3.13 Diagram alir alur kerja menentukan shape factor 37 Gambar 3.14 Diagram alir alur kerja menentukan klasifikasi bedasarkan

shape factor

38 Gambar 4.1 Objek - objek yang digunakan dalam pengujian 41


(7)

LAMPIRAN A


(8)

A - 1

Gambar A.1 Screen Shoot Splash Screen


(9)

A - 2

Gambar A.3 Screen Shoot Form Dialog Konverter ke Biner


(10)

A - 3


(11)

LAMPIRAN B

LISTING PROGRAM


(12)

B - 1

B.1 LISTING PROGRAM PADA FORM SPLASH

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

namespace iCout_U____Does_it {

publicpartialclass frm_SPLASH : Form {

publicstatic frm_SPLASH _FormSPLASH = null; int _COUNTER;

public frm_SPLASH() {

InitializeComponent(); tmr_SPLASH.Enabled = true; _COUNTER = 0;

}

privatevoid tmr_SPLASH_Tick(object sender, EventArgs e) {

if (_COUNTER >= 100) {

tmr_SPLASH.Enabled = false;

frm_MAIN _UTAMA = new frm_MAIN(); _FormSPLASH = this;

this.Hide();

_UTAMA.Show(); }

else

{

_COUNTER++;

prg_SPLASH.Value = _COUNTER; }


(13)

B - 2 }

}

B.2 LISTING PROGRAM PADA FORM UTAMA

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.IO;

namespace iCout_U____Does_it {

publicpartialclass frm_MAIN : Form {

publicstatic frm_MAIN saya = null; privatestring _PATH_DIR;

publicint[] _OBJECT_ID;

publicint[] _OBJECT_X_START; publicint[] _OBJECT_X_END; publicint[] _OBJECT_Y_START; publicint[] _OBJECT_Y_END;

publicdouble[] _OBJECT_KELILING; publicdouble[] _OBJECT_LUAS; publicdouble[] _OBJECT_SHAPE; publicint _JUMLAH;

publicint _TOLERANCE_PRI; publicint _TOLERANCE_SLV; publicint _JUMLAH_PRI; publicint _JUMLAH_SLV; publicint _ID_PRI;

publicint _ID_SLV; public frm_MAIN() {


(14)

B - 3 deactivate_CONTROL();

}

publicvoid setJUMLAH_PRI(int _JUMLAH_PRIx) {

_JUMLAH_PRI = _JUMLAH_PRIx; }

publicvoid setJUMLAH_SLV(int _JUMLAH_SLVx) {

_JUMLAH_SLV = _JUMLAH_SLVx; }

publicvoid setTOLERANCE_PRI(int _TOLERANCE_PRIx) {

_TOLERANCE_PRI = _TOLERANCE_PRIx; }

publicvoid setTOLERANCE_SLV(int _TOLERANCE_SLVx) {

_TOLERANCE_SLV = _TOLERANCE_SLVx; }

publicvoid setID_PRI(int _ID_PRIx) {

_ID_PRI = _ID_PRIx; }

publicvoid setID_SLV(int _ID_SLVx) {

_ID_SLV = _ID_SLVx; }

publicvoid setOBJECT_ID(paramsint[] _OBJECT_IDx) {

_OBJECT_ID = _OBJECT_IDx; }

publicvoid setOBJECT_X_START(paramsint[] _OBJECT_X_STARTx) {

_OBJECT_X_START = _OBJECT_X_STARTx; }


(15)

B - 4 {

_OBJECT_Y_START = _OBJECT_Y_STARTx; }

publicvoid setOBJECT_X_END(paramsint[] _OBJECT_X_ENDx) {

_OBJECT_X_END = _OBJECT_X_ENDx; }

publicvoid setOBJECT_Y_END(paramsint[] _OBJECT_Y_ENDx) {

_OBJECT_Y_END = _OBJECT_Y_ENDx; }

publicvoid setOBJECT_KELILING(paramsdouble[] _OBJECT_KELILINGx) {

_OBJECT_KELILING = _OBJECT_KELILINGx; }

publicvoid setOBJECT_LUAS(paramsdouble[] _OBJECT_LUASx) {

_OBJECT_LUAS = _OBJECT_LUASx; }

publicvoid setOBJECT_SHAPE(paramsdouble[] _OBJECT_SHAPEx) {

_OBJECT_SHAPE = _OBJECT_SHAPEx; }

publicvoid setJUMLAH(int _JUMLAHx) {

_JUMLAH = _JUMLAHx; }

privatevoid deactivate_CONTROL() {

cmd_CLOSE.Enabled = false;

cmd_COLOR2GRAYSCALE.Enabled = false; cmd_COLOR2BINARY.Enabled = false; cmd_IMAGE2CODE.Enabled = false; cmd_LABELLING.Enabled = false; cmd_CLASSIFICATION.Enabled = false; cmd_REPORT.Enabled = false;


(16)

B - 5 cmd_CLOSE.ForeColor = Color.Gray;

cmd_COLOR2GRAYSCALE.ForeColor = Color.Gray; cmd_COLOR2BINARY.ForeColor = Color.Gray; cmd_IMAGE2CODE.ForeColor = Color.Gray; cmd_LABELLING.ForeColor = Color.Gray; cmd_CLASSIFICATION.ForeColor = Color.Gray; cmd_REPORT.ForeColor = Color.Gray;

}

privatevoid activate_CONTROL() {

cmd_CLOSE.Enabled = true;

cmd_COLOR2GRAYSCALE.Enabled = true; cmd_COLOR2BINARY.Enabled = true; cmd_IMAGE2CODE.Enabled = true; cmd_LABELLING.Enabled = true; cmd_CLASSIFICATION.Enabled = true; cmd_REPORT.Enabled = true;

cmd_CLOSE.ForeColor = Color.Black;

cmd_COLOR2GRAYSCALE.ForeColor = Color.Black; cmd_COLOR2BINARY.ForeColor = Color.Black; cmd_IMAGE2CODE.ForeColor = Color.Black; cmd_LABELLING.ForeColor = Color.Black; cmd_CLASSIFICATION.ForeColor = Color.Black; cmd_REPORT.ForeColor = Color.Black;

}

privatevoid cmd_EXIT_Click(object sender, EventArgs e) {

this.Hide();

frm_SPLASH._FormSPLASH.Close(); }

privatevoid cmd_MINIMIZE_Click(object sender, EventArgs e) {

this.WindowState = FormWindowState.Minimized; }

privatevoid cmd_HELP_Click(object sender, EventArgs e) {

MessageBox.Show("Sorry No Help Here !","iCount U!",MessageBoxButtons.OK,MessageBoxIcon.Exclamation); }


(17)

B - 6

privatevoid cmd_NEW_Click(object sender, EventArgs e) {

OpenFileDialog dlg_OPEN_PICTURE = new OpenFileDialog(); dlg_OPEN_PICTURE.Filter = "Bitmap Image|*.bmp";

dlg_OPEN_PICTURE.Title = "Select Bitmap Image File (BMP)"; dlg_OPEN_PICTURE.InitialDirectory = Application.StartupPath; dlg_OPEN_PICTURE.RestoreDirectory = false;

dlg_OPEN_PICTURE.Multiselect = false; dlg_OPEN_PICTURE.FilterIndex = 0; dlg_OPEN_PICTURE.ShowDialog(); if (dlg_OPEN_PICTURE.FileName != "") {

Bitmap _TMPGambar = new Bitmap(dlg_OPEN_PICTURE.FileName); pic_DISPLAY.Image = _TMPGambar;

pic_DISPLAY.SizeMode = PictureBoxSizeMode.StretchImage; activate_CONTROL();

cmd_NEW.Enabled = false;

cmd_NEW.ForeColor = Color.Gray; }

cmd_CLOSE.Enabled = true;

cmd_COLOR2GRAYSCALE.Enabled = true; cmd_COLOR2BINARY.Enabled =true; cmd_IMAGE2CODE.Enabled = false; cmd_LABELLING.Enabled = false; cmd_CLASSIFICATION.Enabled = false; cmd_REPORT.Enabled = false;

cmd_CLOSE.ForeColor = Color.Black;

cmd_COLOR2GRAYSCALE.ForeColor = Color.Black; cmd_COLOR2BINARY.ForeColor = Color.Black; cmd_IMAGE2CODE.ForeColor = Color.Gray; cmd_LABELLING.ForeColor = Color.Gray; cmd_CLASSIFICATION.ForeColor = Color.Gray; cmd_REPORT.ForeColor = Color.Gray;


(18)

B - 7

privatevoid cmd_CLOSE_Click(object sender, EventArgs e) {

cmd_NEW.Enabled = true;

cmd_NEW.ForeColor = Color.Black; pic_DISPLAY.Image =

iCout_U____Does_it.Properties.Resources.jpg_INITIAL; deactivate_CONTROL();

}

privatevoid cmd_COLOR2GRAYSCALE_Click(object sender, EventArgs e) {

ImageProcessing Processing = new ImageProcessing(); Processing.setGAMBAR((Bitmap)(pic_DISPLAY.Image)); Processing.ConvertToGrayScale();

pic_DISPLAY.Image = (Bitmap)Processing.GAMBAR;

pic_DISPLAY.SizeMode = PictureBoxSizeMode.StretchImage; cmd_CLOSE.Enabled = true;

cmd_COLOR2GRAYSCALE.Enabled = false; cmd_COLOR2BINARY.Enabled = true; cmd_IMAGE2CODE.Enabled = false; cmd_LABELLING.Enabled = false; cmd_CLASSIFICATION.Enabled = false; cmd_REPORT.Enabled = false;

cmd_CLOSE.ForeColor = Color.Black;

cmd_COLOR2GRAYSCALE.ForeColor = Color.Gray; cmd_COLOR2BINARY.ForeColor = Color.Black; cmd_IMAGE2CODE.ForeColor = Color.Gray; cmd_LABELLING.ForeColor = Color.Gray; cmd_CLASSIFICATION.ForeColor = Color.Gray; cmd_REPORT.ForeColor = Color.Gray;

}

privatevoid cmd_COLOR2BINARY_Click(object sender, EventArgs e) {


(19)

B - 8

frm_BINARY _frmBINARY = new frm_BINARY(); _frmBINARY.ShowDialog();

cmd_CLOSE.Enabled = false;

cmd_COLOR2GRAYSCALE.Enabled = false; cmd_COLOR2BINARY.Enabled = false; cmd_IMAGE2CODE.Enabled = true; cmd_LABELLING.Enabled = false; cmd_CLASSIFICATION.Enabled = false; cmd_REPORT.Enabled = false;

cmd_CLOSE.ForeColor = Color.Black;

cmd_COLOR2GRAYSCALE.ForeColor = Color.Gray; cmd_COLOR2BINARY.ForeColor = Color.Gray; cmd_IMAGE2CODE.ForeColor = Color.Black; cmd_LABELLING.ForeColor = Color.Gray; cmd_CLASSIFICATION.ForeColor = Color.Gray; cmd_REPORT.ForeColor = Color.Gray;

}

privatevoid cmd_IMAGE2CODE_Click(object sender, EventArgs e) {

saya = this;

SaveFileDialog dlg_SAVE_CODE = new SaveFileDialog(); dlg_SAVE_CODE.Filter = "Plain Text File|*.wri";

dlg_SAVE_CODE.Title = "Save Plain Text Stream"; dlg_SAVE_CODE.ShowDialog();

dlg_SAVE_CODE.InitialDirectory = Application.StartupPath; dlg_SAVE_CODE.RestoreDirectory = false;

if (dlg_SAVE_CODE.FileName != "") {

frm_CODE _frmCODE = new frm_CODE();

_frmCODE.setPATH((string)dlg_SAVE_CODE.FileName); _frmCODE.setMODE("BINARY");

_frmCODE.ShowDialog(); }

cmd_CLOSE.Enabled = false;


(20)

B - 9 cmd_COLOR2BINARY.Enabled = false; cmd_IMAGE2CODE.Enabled = false; cmd_LABELLING.Enabled = true;

cmd_CLASSIFICATION.Enabled = false; cmd_REPORT.Enabled = false;

cmd_CLOSE.ForeColor = Color.Black;

cmd_COLOR2GRAYSCALE.ForeColor = Color.Gray; cmd_COLOR2BINARY.ForeColor = Color.Gray; cmd_IMAGE2CODE.ForeColor = Color.Gray; cmd_LABELLING.ForeColor = Color.Black; cmd_CLASSIFICATION.ForeColor = Color.Gray; cmd_REPORT.ForeColor = Color.Gray;

}

privatevoid cmd_LABELLING_Click(object sender, EventArgs e) {

saya = this;

SaveFileDialog dlg_SAVE_LABELLING = new SaveFileDialog(); dlg_SAVE_LABELLING.Filter = "Plain Text File|*.wri";

dlg_SAVE_LABELLING.Title = "Save Plain Text Stream"; dlg_SAVE_LABELLING.ShowDialog();

dlg_SAVE_LABELLING.InitialDirectory = Application.StartupPath; dlg_SAVE_LABELLING.RestoreDirectory = false;

if (dlg_SAVE_LABELLING.FileName != "") {

frm_CODE _frmCODE = new frm_CODE();

_frmCODE.setPATH((string)dlg_SAVE_LABELLING.FileName); _frmCODE.setMODE("LABELLING");

_frmCODE.ShowDialog();

_PATH_DIR = (string)dlg_SAVE_LABELLING.FileName; }

cmd_CLOSE.Enabled = false;

cmd_COLOR2GRAYSCALE.Enabled = false; cmd_COLOR2BINARY.Enabled = false; cmd_IMAGE2CODE.Enabled = false; cmd_LABELLING.Enabled = false; cmd_CLASSIFICATION.Enabled = true;


(21)

B - 10 cmd_REPORT.Enabled = false;

cmd_CLOSE.ForeColor = Color.Black;

cmd_COLOR2GRAYSCALE.ForeColor = Color.Gray; cmd_COLOR2BINARY.ForeColor = Color.Gray; cmd_IMAGE2CODE.ForeColor = Color.Gray; cmd_LABELLING.ForeColor = Color.Gray;

cmd_CLASSIFICATION.ForeColor = Color.Black; cmd_REPORT.ForeColor = Color.Gray;

}

privatevoid cmd_CLASSIFICATION_Click(object sender, EventArgs e) {

saya = this;

_PATH_DIR = Path.GetDirectoryName(_PATH_DIR) + "\\" + Path.GetFileNameWithoutExtension(_PATH_DIR) + ".icup";

frm_CLASSIFICATION _frmCLASS = new frm_CLASSIFICATION(); _frmCLASS.setJUMLAH(_JUMLAH);

_frmCLASS.setOBJECT_ID(_OBJECT_ID);

_frmCLASS.setOBJECT_X_START(_OBJECT_X_START); _frmCLASS.setOBJECT_Y_START(_OBJECT_Y_START); _frmCLASS.setOBJECT_X_END(_OBJECT_X_END); _frmCLASS.setOBJECT_Y_END(_OBJECT_Y_END); _frmCLASS.setOBJECT_KELILING(_OBJECT_KELILING); _frmCLASS.setOBJECT_LUAS(_OBJECT_LUAS);

_frmCLASS.setOBJECT_SHAPE(_OBJECT_SHAPE); _frmCLASS.ShowDialog();

cmd_CLOSE.Enabled = false;

cmd_COLOR2GRAYSCALE.Enabled = false; cmd_COLOR2BINARY.Enabled = false; cmd_IMAGE2CODE.Enabled = false; cmd_LABELLING.Enabled = false; cmd_CLASSIFICATION.Enabled = false; cmd_REPORT.Enabled = true;

cmd_CLOSE.ForeColor = Color.Black;

cmd_COLOR2GRAYSCALE.ForeColor = Color.Gray; cmd_COLOR2BINARY.ForeColor = Color.Gray; cmd_IMAGE2CODE.ForeColor = Color.Gray; cmd_LABELLING.ForeColor = Color.Gray;


(22)

B - 11

cmd_CLASSIFICATION.ForeColor = Color.Gray; cmd_REPORT.ForeColor = Color.Black;

}

privatevoid cmd_REPORT_Click(object sender, EventArgs e) {

saya = this;

frm_REPORT _frmREPORT = new frm_REPORT();

_frmREPORT.ShowDialog(); }

} }

B.3 LISTING PROGRAM PADA FORM BINARY

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

namespace iCout_U____Does_it {

publicpartialclass frm_BINARY : Form {

ImageProcessing Processing = new ImageProcessing(); private Bitmap _TMPGambar;

public frm_BINARY() {

InitializeComponent();

_TMPGambar = (Bitmap) frm_MAIN.saya.pic_DISPLAY.Image; }


(23)

B - 12

privatevoid cmd_OK_Click(object sender, EventArgs e) {

this.Close(); }

privatevoid cmd_CANCEL_Click(object sender, EventArgs e) {

frm_MAIN.saya.pic_DISPLAY.Image = _TMPGambar; frm_MAIN.saya.pic_DISPLAY.SizeMode =

PictureBoxSizeMode.StretchImage; this.Close();

}

privatevoid frm_BINARY_Load(object sender, EventArgs e) {

if (chk_AUTOMATIC.Checked == true) {

trc_TRESHOLD.Enabled = false;

Processing.setGAMBAR(_TMPGambar); Processing.ConvertToBinaryAutomatic();

frm_MAIN.saya.pic_DISPLAY.Image = (Bitmap)Processing.GAMBAR; frm_MAIN.saya.pic_DISPLAY.SizeMode =

PictureBoxSizeMode.StretchImage; }

else

{

trc_TRESHOLD.Enabled = true; }

trc_TRESHOLD.Value = 0; lbl_TRESHOLD.Text = "0"; }

privatevoid chk_AUTOMATIC_CheckedChanged(object sender, EventArgs e) {

if (chk_AUTOMATIC.Checked == true) {

trc_TRESHOLD.Enabled = false;

Processing.setGAMBAR(_TMPGambar); Processing.ConvertToBinaryAutomatic();


(24)

B - 13

frm_MAIN.saya.pic_DISPLAY.Image = (Bitmap)Processing.GAMBAR; frm_MAIN.saya.pic_DISPLAY.SizeMode =

PictureBoxSizeMode.StretchImage; }

else

{

trc_TRESHOLD.Enabled = true;

Processing.setGAMBAR(_TMPGambar);

Processing.ConvertToBinaryManual(trc_TRESHOLD.Value);

frm_MAIN.saya.pic_DISPLAY.Image = (Bitmap)Processing.GAMBAR; frm_MAIN.saya.pic_DISPLAY.SizeMode =

PictureBoxSizeMode.StretchImage;

lbl_TRESHOLD.Text = Convert.ToString(trc_TRESHOLD.Value); }

trc_TRESHOLD.Value = 0; lbl_TRESHOLD.Text = "0"; }

privatevoid trc_TRESHOLD_Scroll(object sender, EventArgs e) {

Processing.setGAMBAR(_TMPGambar);

Processing.ConvertToBinaryManual(trc_TRESHOLD.Value);

frm_MAIN.saya.pic_DISPLAY.Image = (Bitmap)Processing.GAMBAR; frm_MAIN.saya.pic_DISPLAY.SizeMode =

PictureBoxSizeMode.StretchImage;

lbl_TRESHOLD.Text = Convert.ToString(trc_TRESHOLD.Value); }

} }

B.4 LISTING PROGRAM PADA FORM CODE

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;


(25)

B - 14

using System.Linq;

using System.Text;

using System.Windows.Forms;

namespace iCout_U____Does_it {

publicpartialclass frm_CODE : Form {

privatestring _PATH; privatestring _MODE; privatedouble _ZOOM; public frm_CODE() {

InitializeComponent(); }

publicvoid setPATH(string _PATHx) {

_PATH = _PATHx; }

publicvoid setMODE(string _MODEx) {

_MODE = _MODEx; }

privatevoid frm_CODE_Load(object sender, EventArgs e) {

ComputerVision Vision = new ComputerVision();

Vision.setGAMBAR((Bitmap)frm_MAIN.saya.pic_DISPLAY.Image); if (_MODE == "BINARY") { Vision.BINStreamText(_PATH); } elseif (_MODE == "RGB") { Vision.RGBStreamText(_PATH); }

elseif (_MODE == "LABELLING") { Vision.LABStreamText(_PATH); }

txt_CODE.LoadFile(_PATH, RichTextBoxStreamType.PlainText); _ZOOM = 1.0;

}

privatevoid cmd_OK_Click(object sender, EventArgs e) {


(26)

B - 15 this.Close();

}

privatevoid cmd_ZOOM_IN_Click(object sender, EventArgs e) {

_ZOOM = _ZOOM + 0.1;

_ZOOM = (_ZOOM <= 1 ? 1 : _ZOOM);

txt_CODE.ZoomFactor = Convert.ToSingle(_ZOOM); }

privatevoid cmd_ZOOM_OUT_Click(object sender, EventArgs e) {

_ZOOM = _ZOOM - 0.1;

_ZOOM = (_ZOOM <= 1 ? 1 : _ZOOM);

txt_CODE.ZoomFactor = Convert.ToSingle(_ZOOM); }

} }

B.5 LISTING PROGRAM PADA FORM CLASSIFICATION

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Collections;

using System.Xml;

using System.IO;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

namespace iCout_U____Does_it {

publicpartialclass frm_CLASSIFICATION : Form {

privatestring _PATH; privateint _JUMLAH; privateint[] _OBJECT_ID;

privateint[] _OBJECT_X_START; privateint[] _OBJECT_X_END; privateint[] _OBJECT_Y_START;


(27)

B - 16 privateint[] _OBJECT_Y_END;

privatedouble[] _OBJECT_KELILING; privatedouble[] _OBJECT_LUAS; privatedouble[] _OBJECT_SHAPE; public frm_CLASSIFICATION() {

InitializeComponent(); }

publicvoid setPATH(string _PATHx) {

_PATH = _PATHx; }

publicvoid setOBJECT_ID(paramsint[] _OBJECT_IDx) {

_OBJECT_ID = _OBJECT_IDx; }

publicvoid setOBJECT_X_START(paramsint[] _OBJECT_X_STARTx) {

_OBJECT_X_START = _OBJECT_X_STARTx; }

publicvoid setOBJECT_Y_START(paramsint[] _OBJECT_Y_STARTx) {

_OBJECT_Y_START = _OBJECT_Y_STARTx; }

publicvoid setOBJECT_X_END(paramsint[] _OBJECT_X_ENDx) {

_OBJECT_X_END = _OBJECT_X_ENDx; }

publicvoid setOBJECT_Y_END(paramsint[] _OBJECT_Y_ENDx) {

_OBJECT_Y_END = _OBJECT_Y_ENDx; }

publicvoid setOBJECT_KELILING(paramsdouble[] _OBJECT_KELILINGx) {

_OBJECT_KELILING = _OBJECT_KELILINGx; }


(28)

B - 17

publicvoid setOBJECT_LUAS(paramsdouble[] _OBJECT_LUASx) {

_OBJECT_LUAS = _OBJECT_LUASx; }

publicvoid setOBJECT_SHAPE(paramsdouble[] _OBJECT_SHAPEx) {

_OBJECT_SHAPE = _OBJECT_SHAPEx; }

publicvoid setJUMLAH(int _JUMLAHx) {

_JUMLAH = _JUMLAHx; }

privatevoid Processor() {

double _TOLERANCE; double _TOLERANCE_UP; double _TOLERANCE_DOWN;

int[] _OBJECT = newint[_JUMLAH + 1];

int _BANYAK; bool _CHECK = false; int _INDEKS;

int _MODE; _MODE = 0; _INDEKS = 0; _TOLERANCE = 10; _BANYAK = 0;

for (int c = 1; c <= _JUMLAH; c++) {

foreach (int u in _OBJECT) {

if (u == _OBJECT_ID[c]) {

_CHECK = true; }


(29)

B - 18 }

if (_CHECK == false) {

_TOLERANCE_UP = (_OBJECT_SHAPE[c] + (_OBJECT_SHAPE[c] * (_TOLERANCE / 100)));

_TOLERANCE_DOWN = (_OBJECT_SHAPE[c] - (_OBJECT_SHAPE[c] * (_TOLERANCE / 100)));

for (int i = c; i <= _JUMLAH; i++) {

if ((_OBJECT_SHAPE[i] >= _TOLERANCE_DOWN) && (_OBJECT_SHAPE[i] <= _TOLERANCE_UP))

{

foreach (int u in _OBJECT) {

if (u == _OBJECT_ID[i]) {

_CHECK = true; }

if (u > 0) {

_INDEKS++; }

}

if (_CHECK == false) {

_OBJECT[_INDEKS] = _OBJECT_ID[i]; _BANYAK++;

} }

_INDEKS = 0; }

_MODE++; if (_MODE == 1) {

ImageProcessing Processing_1st = new ImageProcessing();


(30)

B - 19

Processing_1st.ShowPartial(_OBJECT_X_START[c], _OBJECT_Y_START[c], _OBJECT_X_END[c], _OBJECT_Y_END[c]); pic_OBJECT_1st.Image = ((Bitmap)Processing_1st.GAMBAR); pic_OBJECT_1st.SizeMode = PictureBoxSizeMode.StretchImage; lbl_OBJECT_1st.Text = Convert.ToString(_BANYAK);

}

elseif (_MODE == 2) {

ImageProcessing Processing_2nd = new ImageProcessing();

Processing_2nd.setGAMBAR((Bitmap)(frm_MAIN.saya.pic_DISPLAY.Image)); Processing_2nd.ShowPartial(_OBJECT_X_START[c],

_OBJECT_Y_START[c], _OBJECT_X_END[c], _OBJECT_Y_END[c]); pic_OBJECT_2nd.Image = ((Bitmap)Processing_2nd.GAMBAR); pic_OBJECT_2nd.SizeMode = PictureBoxSizeMode.StretchImage; lbl_OBJECT_2nd.Text = Convert.ToString(_BANYAK);

}

elseif (_MODE == 3) {

ImageProcessing Processing_3rd = new ImageProcessing();

Processing_3rd.setGAMBAR((Bitmap)(frm_MAIN.saya.pic_DISPLAY.Image)); Processing_3rd.ShowPartial(_OBJECT_X_START[c],

_OBJECT_Y_START[c], _OBJECT_X_END[c], _OBJECT_Y_END[c]); pic_OBJECT_3rd.Image = ((Bitmap)Processing_3rd.GAMBAR); pic_OBJECT_3rd.SizeMode = PictureBoxSizeMode.StretchImage; lbl_OBJECT_3rd.Text = Convert.ToString(_BANYAK);

}

elseif (_MODE == 4) {

ImageProcessing Processing_4th = new ImageProcessing();

Processing_4th.setGAMBAR((Bitmap)(frm_MAIN.saya.pic_DISPLAY.Image)); Processing_4th.ShowPartial(_OBJECT_X_START[c],


(31)

B - 20

pic_OBJECT_4th.Image = ((Bitmap)Processing_4th.GAMBAR); pic_OBJECT_4th.SizeMode = PictureBoxSizeMode.StretchImage; lbl_OBJECT_4th.Text = Convert.ToString(_BANYAK);

}

_BANYAK = 0; }

_CHECK = false; }

}

privatevoid frm_CLASSIFICATION_Load(object sender, EventArgs e) {

double _JUMLAH_KLAS; double _ERROR_KLAS;

double _JUMLAH_OBJ1; double _JUMLAH_OBJ2; double _JUMLAH_OBJ3; double _JUMLAH_OBJ4;

pic_DISPLAY.Image = (Bitmap)(frm_MAIN.saya.pic_DISPLAY.Image); pic_DISPLAY.SizeMode = PictureBoxSizeMode.StretchImage;

Processor();

_JUMLAH_OBJ1 = Convert.ToDouble(lbl_OBJECT_1st.Text); _JUMLAH_OBJ2 = Convert.ToDouble(lbl_OBJECT_2nd.Text); _JUMLAH_OBJ3 = Convert.ToDouble(lbl_OBJECT_3rd.Text); _JUMLAH_OBJ4 = Convert.ToDouble(lbl_OBJECT_4th.Text); _JUMLAH_KLAS = _JUMLAH_OBJ1 + _JUMLAH_OBJ2 + _JUMLAH_OBJ3 + _JUMLAH_OBJ4;

_ERROR_KLAS = (((_JUMLAH - _JUMLAH_KLAS) / _JUMLAH) * 100.0);

lbl_JML_KLASIFIKASI.Text = Convert.ToString(_JUMLAH_KLAS); lbl_JML_ERROR.Text = Convert.ToString(_ERROR_KLAS) + " %"; lbl_JML_TOTAL.Text = Convert.ToString(_JUMLAH);


(32)

B - 21

privatevoid cmd_OK_Click(object sender, EventArgs e) {

this.Close(); }

} }

B.6 LISTING PROGRAM PADA FORM CLASS IMAGE PROCESSING

using System;

using System.Collections;

using System.Collections.Generic;

using System.Drawing;

using System.Drawing.Imaging;

using System.IO;

using System.Linq;

using System.Text;

namespace iCout_U____Does_it {

publicclass ImageProcessing {

private Bitmap _GAMBAR; public ImageProcessing() {

}

public Bitmap GAMBAR {

get

{

return _GAMBAR; }

}

publicvoid setGAMBAR(Bitmap IMAGE) {

_GAMBAR = (Bitmap)IMAGE.Clone(); }


(33)

B - 22

publicvoid ShowPartial(int _OBJECT_X_START, int _OBJECT_Y_START,

int _OBJECT_X_END, int _OBJECT_Y_END) {

RectangleF _KOTAK = new

RectangleF(_OBJECT_X_START,_OBJECT_Y_START,(_OBJECT_X_END - _OBJECT_X_START),(_OBJECT_Y_END - _OBJECT_Y_START));

Bitmap _TempGAMBAR =

GAMBAR.Clone(_KOTAK,GAMBAR.PixelFormat); _GAMBAR = (Bitmap)_TempGAMBAR.Clone(); }

publicvoid ConvertToGrayScale() {

Bitmap _TempGAMBAR = new Bitmap(_GAMBAR.Width, _GAMBAR.Height, PixelFormat.Format32bppArgb);

BitmapData _dGAMBAR = _GAMBAR.LockBits(new Rectangle(0, 0, _GAMBAR.Width, _GAMBAR.Height),

ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);

BitmapData _dTempGAMBAR = _TempGAMBAR.LockBits(new

Rectangle(0, 0,

_TempGAMBAR.Width, _TempGAMBAR.Height), ImageLockMode.WriteOnly,

PixelFormat.Format32bppArgb); unsafe

{

byte* _pGAMBAR = (byte*)_dGAMBAR.Scan0;

byte* _pTempGAMBAR = (byte*)_dTempGAMBAR.Scan0; for (int y = 0; y < _dGAMBAR.Height; y++)

{

for (int x = 0; x < _dGAMBAR.Width; x++) {

_pTempGAMBAR[0] = (byte)((_pGAMBAR[2] * .3) + (_pGAMBAR[1] * .59) + (_pGAMBAR[0] * .11)); // B

_pTempGAMBAR[1] = (byte)((_pGAMBAR[2] * .3) + (_pGAMBAR[1] * .59) + (_pGAMBAR[0] * .11)); // G

_pTempGAMBAR[2] = (byte)((_pGAMBAR[2] * .3) + (_pGAMBAR[1] * .59) + (_pGAMBAR[0] * .11)); // R


(34)

B - 23 _pGAMBAR += 4;

_pTempGAMBAR += 4; }

_pGAMBAR += _dGAMBAR.Stride - (_dGAMBAR.Width * 4); _pTempGAMBAR += _dTempGAMBAR.Stride -

(_dTempGAMBAR.Width * 4); }

}

_TempGAMBAR.UnlockBits(_dTempGAMBAR); _GAMBAR.UnlockBits(_dGAMBAR);

_GAMBAR = (Bitmap)_TempGAMBAR.Clone(); }

publicvoid ConvertToBinaryManual(int _TRESHOLD) {

Bitmap _TempGAMBAR = new Bitmap(_GAMBAR.Width, _GAMBAR.Height, PixelFormat.Format32bppArgb);

BitmapData _dGAMBAR = _GAMBAR.LockBits(new Rectangle(0, 0, _GAMBAR.Width, _GAMBAR.Height),

ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);

BitmapData _dTempGAMBAR = _TempGAMBAR.LockBits(new

Rectangle(0, 0,

_TempGAMBAR.Width, _TempGAMBAR.Height), ImageLockMode.WriteOnly,

PixelFormat.Format32bppArgb); int _BIN = 0;

unsafe

{

byte* _pGAMBAR = (byte*)_dGAMBAR.Scan0;

byte* _pTempGAMBAR = (byte*)_dTempGAMBAR.Scan0; for (int y = 0; y < _dGAMBAR.Height; y++)

{

for (int x = 0; x < _dGAMBAR.Width; x++) {

_BIN = (int)((_pGAMBAR[2] * .3) + (_pGAMBAR[1] * .59) + (_pGAMBAR[0] * .11));


(35)

B - 24

_BIN = (_BIN <= _TRESHOLD ? _BIN = 0 : 255); _pTempGAMBAR[0] = (byte)_BIN;

_pTempGAMBAR[1] = (byte)_BIN; _pTempGAMBAR[2] = (byte)_BIN; _pTempGAMBAR[3] = _pGAMBAR[3]; _pGAMBAR += 4;

_pTempGAMBAR += 4; }

_pGAMBAR += _dGAMBAR.Stride - (_dGAMBAR.Width * 4); _pTempGAMBAR += _dTempGAMBAR.Stride -

(_dTempGAMBAR.Width * 4); }

}

_TempGAMBAR.UnlockBits(_dTempGAMBAR); _GAMBAR.UnlockBits(_dGAMBAR);

_GAMBAR = (Bitmap)_TempGAMBAR.Clone(); }

publicvoid ConvertToBinaryAutomatic() {

int[,] _PIXEL = newint[_GAMBAR.Width, _GAMBAR.Height]; int[] _HISTOGRAM = newint[256];

int _THRESHOLD; int _INDEX;

_THRESHOLD = 0; _INDEX = 0;

ConvertToGrayScale(); _PIXEL = Pixel("R");

_HISTOGRAM = Histogram("R");

Bitmap _TempGAMBAR = new Bitmap(_GAMBAR.Width, _GAMBAR.Height, PixelFormat.Format32bppArgb);

BitmapData _dGAMBAR = _GAMBAR.LockBits(new Rectangle(0, 0, _GAMBAR.Width, _GAMBAR.Height),

ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);


(36)

B - 25

BitmapData _dTempGAMBAR = _TempGAMBAR.LockBits(new

Rectangle(0, 0,

_TempGAMBAR.Width, _TempGAMBAR.Height), ImageLockMode.WriteOnly,

PixelFormat.Format32bppArgb); unsafe

{

byte* _pGAMBAR = (byte*)_dGAMBAR.Scan0;

byte* _pTempGAMBAR = (byte*)_dTempGAMBAR.Scan0; for (int o = 0; o < 256; o++)

{

if (_INDEX <= _HISTOGRAM[o]) {

_INDEX = _HISTOGRAM[o]; _THRESHOLD = o;

} }

_pGAMBAR = (byte*)_dGAMBAR.Scan0; for (int y = 0; y < _dGAMBAR.Height; y++) {

for (int x = 0; x < _dGAMBAR.Width; x++) {

_PIXEL[x, y] = (_PIXEL[x, y] == _THRESHOLD ? 0 : 255); _pTempGAMBAR[0] = (byte)_PIXEL[x, y];

_pTempGAMBAR[1] = (byte)_PIXEL[x, y]; _pTempGAMBAR[2] = (byte)_PIXEL[x, y]; _pTempGAMBAR[3] = _pGAMBAR[3];

_pGAMBAR += 4; _pTempGAMBAR += 4; }

_pGAMBAR += _dGAMBAR.Stride - (_dGAMBAR.Width * 4); _pTempGAMBAR += _dTempGAMBAR.Stride -

(_dTempGAMBAR.Width * 4); }

}


(37)

B - 26 _GAMBAR.UnlockBits(_dGAMBAR);

_GAMBAR = (Bitmap)_TempGAMBAR.Clone();

}

publicint [] Histogram(string _MODE) {

BitmapData _dGAMBAR = _GAMBAR.LockBits(new Rectangle(0, 0, _GAMBAR.Width, _GAMBAR.Height),

ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);

int[,] _PIXEL = newint[_GAMBAR.Width, _GAMBAR.Height]; int[] _HISTOGRAM = newint[256];

unsafe

{

byte* _pGAMBAR = (byte*)_dGAMBAR.Scan0; for (int y = 0; y < _dGAMBAR.Height; y++) {

for (int x = 0; x < _dGAMBAR.Width; x++) {

if (_MODE == "R") {

_PIXEL[x, y] = (byte)_pGAMBAR[2]; }

elseif (_MODE == "G") {

_PIXEL[x, y] = (byte)_pGAMBAR[1]; }

elseif (_MODE == "B") {

_PIXEL[x, y] = (byte)_pGAMBAR[0]; }

_HISTOGRAM[_PIXEL[x, y]]++; _pGAMBAR += 4;

}

_pGAMBAR += _dGAMBAR.Stride - (_dGAMBAR.Width * 4); }


(38)

B - 27 }

_GAMBAR.UnlockBits(_dGAMBAR); return _HISTOGRAM;

}

publicint[,] Pixel(string _MODE) {

BitmapData _dGAMBAR = _GAMBAR.LockBits(new Rectangle(0, 0, _GAMBAR.Width, _GAMBAR.Height),

ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);

int[,] _PIXEL = newint[_GAMBAR.Width, _GAMBAR.Height]; unsafe

{

byte* _pGAMBAR = (byte*)_dGAMBAR.Scan0; for (int y = 0; y < _dGAMBAR.Height; y++) {

for (int x = 0; x < _dGAMBAR.Width; x++) {

if (_MODE == "R") {

_PIXEL[x, y] = (byte)_pGAMBAR[2]; }

elseif (_MODE == "G") {

_PIXEL[x, y] = (byte)_pGAMBAR[1]; }

elseif (_MODE == "B") {

_PIXEL[x, y] = (byte)_pGAMBAR[0]; }

_pGAMBAR += 4; }

_pGAMBAR += _dGAMBAR.Stride - (_dGAMBAR.Width * 4); }

}

_GAMBAR.UnlockBits(_dGAMBAR); return _PIXEL;


(39)

B - 28 }

} }

B.6 LISTING PROGRAM PADA FORM CLASS COMPUTER VISION

using System;

using System.Collections;

using System.Collections.Generic;

using System.Drawing;

using System.Drawing.Imaging;

using System.IO;

using System.Linq;

using System.Text;

namespace iCout_U____Does_it {

publicclass ComputerVision {

private Bitmap _GAMBAR; public ComputerVision() {

}

public Bitmap GAMBAR {

get

{

return _GAMBAR; }

}

publicvoid setGAMBAR(Bitmap IMAGE) {

_GAMBAR = (Bitmap)IMAGE.Clone(); }


(40)

B - 29 publicstring RGBStreamText(string _PATH) {

ImageProcessing Processing = new ImageProcessing(); StreamWriter Text = new StreamWriter(_PATH); string _R;

string _G; string _B;

int [,] _RE = newint[_GAMBAR.Width, _GAMBAR.Height]; int [,] _BL = newint[_GAMBAR.Width, _GAMBAR.Height]; int [,] _GR = newint[_GAMBAR.Width, _GAMBAR.Height];

Processing.setGAMBAR(_GAMBAR); _RE = Processing.Pixel("R");

_BL = Processing.Pixel("B"); _GR = Processing.Pixel("G");

for (int y = 0; y < _GAMBAR.Height; y++) {

for (int x = 0; x < _GAMBAR.Width; x++) {

_R = Convert.ToString(_RE[x, y]); _G = Convert.ToString(_GR[x, y]); _B = Convert.ToString(_BL[x, y]);

if (_R.Length == 1) { _R = "00" + _R; } elseif (_R.Length == 2) { _R = "0" + _R; }

if (_G.Length == 1) { _G = "00" + _G; } elseif (_G.Length == 2) { _G = "0" + _G; }

if (_B.Length == 1) { _B = "00" + _B; } elseif (_B.Length == 2) { _B = "0" + _B; }

Text.Write(_R + ":" + _G + ":" + _B + "\t"); }

Text.WriteLine(""); }

Text.Close(); return _PATH; }


(41)

B - 30 publicstring BINStreamText(string _PATH) {

ImageProcessing Processing = new ImageProcessing(); StreamWriter Text = new StreamWriter(_PATH); string _R;

int[,] _RE = newint[_GAMBAR.Width, _GAMBAR.Height]; Processing.setGAMBAR(_GAMBAR);

_RE = Processing.Pixel("R");

for (int y = 0; y < _GAMBAR.Height; y++) {

for (int x = 0; x < _GAMBAR.Width; x++) {

_R = Convert.ToString(_RE[x, y]);

_R = (_R == "255" ? "1" : "0"); Text.Write(_R + " ");

}

Text.WriteLine(""); }

Text.Close(); return _PATH; }

publicstring LABStreamText(string _PATH) {

ImageProcessing Processing = new ImageProcessing(); XMLProcessor XML = new XMLProcessor();

StreamWriter Text = new StreamWriter(_PATH); int _COUNTER = 1;

int _JUMLAH = 0; int _INDEKS; int _ID = 0;

int _CEKBORDER = 0;


(42)

B - 31

int[] _OBJECT_ID = newint[_GAMBAR.Width + _GAMBAR.Height]; int[] _OBJECT_X_START = newint[_GAMBAR.Width +

_GAMBAR.Height];

int[] _OBJECT_X_END = newint[_GAMBAR.Width + _GAMBAR.Height]; int[] _OBJECT_Y_START = newint[_GAMBAR.Width +

_GAMBAR.Height];

int[] _OBJECT_Y_END = newint[_GAMBAR.Width + _GAMBAR.Height]; double[] _OBJECT_KELILING = newdouble[_GAMBAR.Width +

_GAMBAR.Height];

double[] _OBJECT_LUAS = newdouble[_GAMBAR.Width + _GAMBAR.Height];

double[] _OBJECT_SHAPE = newdouble[_GAMBAR.Width + _GAMBAR.Height];

bool _CHECK = false; unsafe

{

Processing.setGAMBAR(_GAMBAR); _PIXEL = Processing.Pixel("R");

for (int y = 1; y < _GAMBAR.Height; y++) {

for (int x = 1; x < _GAMBAR.Width; x++) {

_PIXEL[x, y] = (_PIXEL[x, y] == 255 ? 1 : 0); }

}

for (int y = 1; y < _GAMBAR.Height; y++) {

for (int x = 1; x < _GAMBAR.Width; x++) {

if (_PIXEL[x, y] > 0) {

if (

(((_PIXEL[x, (y - 1)] < 2) && (_PIXEL[x, (y + 1)] < 2)) && ((_PIXEL[(x - 1), y] < 2) && (_PIXEL[(x + 1), y] < 2))) &&

(((_PIXEL[(x + 1), (y - 1)] < 2) && (_PIXEL[(x + 1), (y + 1)] < 2)) && ((_PIXEL[(x - 1), (y - 1)] < 2) && (_PIXEL[(x - 1), (y + 1)] < 2)))

) {


(43)

B - 32 _PIXEL[x, y] = _COUNTER;

_PIXEL[x, (y - 1)] = (_PIXEL[x, (y - 1)] == 1 ? _COUNTER : 0);

_PIXEL[x, (y + 1)] = (_PIXEL[x, (y + 1)] == 1 ? _COUNTER : 0);

_PIXEL[(x + 1), y] = (_PIXEL[(x + 1), y] == 1 ? _COUNTER : 0);

_PIXEL[(x - 1), y] = (_PIXEL[(x - 1), y] == 1 ? _COUNTER : 0);

_PIXEL[(x + 1), (y - 1)] = (_PIXEL[(x + 1), (y - 1)] == 1 ? _COUNTER : 0);

_PIXEL[(x + 1), (y + 1)] = (_PIXEL[(x + 1), (y + 1)] == 1 ? _COUNTER : 0);

_PIXEL[(x - 1), (y - 1)] = (_PIXEL[(x - 1), (y - 1)] == 1 ? _COUNTER : 0);

_PIXEL[(x - 1), (y + 1)] = (_PIXEL[(x - 1), (y + 1)] == 1 ? _COUNTER : 0);

} else

{

if ((_PIXEL[x, (y - 1)] > 1) && (_PIXEL[x, y] > 1)) {

_PIXEL[x, y] = (_PIXEL[x, y] <= _PIXEL[x, (y - 1)] ? _PIXEL[x, y] : _PIXEL[x, (y - 1)]);

}

elseif ((_PIXEL[x, (y - 1)] > 1) && (_PIXEL[x, y] == 1)) {

_PIXEL[x, y] = _PIXEL[x, (y - 1)]; }

if ((_PIXEL[x, (y + 1)] > 1) && (_PIXEL[x, y] > 1)) {

_PIXEL[x, y] = (_PIXEL[x, y] <= _PIXEL[x, (y + 1)] ? _PIXEL[x, y] : _PIXEL[x, (y + 1)]);

}

elseif ((_PIXEL[x, (y + 1)] > 1) && (_PIXEL[x, y] == 1)) {

_PIXEL[x, y] = _PIXEL[x, (y + 1)]; }


(44)

B - 33 {

_PIXEL[x, y] = (_PIXEL[x, y] <= _PIXEL[(x - 1), y] ? _PIXEL[x, y] : _PIXEL[(x - 1), y]);

}

elseif ((_PIXEL[(x - 1), y] > 1) && (_PIXEL[x, y] == 1)) {

_PIXEL[x, y] = _PIXEL[(x - 1), y]; }

if ((_PIXEL[(x + 1), y] > 1) && (_PIXEL[x, y] > 1)) {

_PIXEL[x, y] = (_PIXEL[x, y] <= _PIXEL[(x + 1), y] ? _PIXEL[x, y] : _PIXEL[(x + 1), y]);

}

elseif ((_PIXEL[(x + 1), y] > 1) && (_PIXEL[x, y] == 1)) {

_PIXEL[x, y] = _PIXEL[(x + 1), y]; }

if ((_PIXEL[(x + 1), (y - 1)] > 1) && (_PIXEL[x, y] > 1)) {

_PIXEL[x, y] = (_PIXEL[x, y] <= _PIXEL[(x + 1), (y - 1)] ? _PIXEL[x, y] : _PIXEL[(x + 1), (y - 1)]);

}

elseif ((_PIXEL[(x + 1), (y - 1)] > 1) && (_PIXEL[x, y] == 1)) {

_PIXEL[x, y] = _PIXEL[(x + 1), (y - 1)]; }

if ((_PIXEL[(x + 1), (y + 1)] > 1) && (_PIXEL[x, y] > 1)) {

_PIXEL[x, y] = (_PIXEL[x, y] <= _PIXEL[(x + 1), (y + 1)] ? _PIXEL[x, y] : _PIXEL[(x + 1), (y + 1)]);

}

elseif ((_PIXEL[(x + 1), (y + 1)] > 1) && (_PIXEL[x, y] == 1)) {

_PIXEL[x, y] = _PIXEL[(x + 1), (y + 1)]; }

if ((_PIXEL[(x - 1), (y - 1)] > 1) && (_PIXEL[x, y] > 1)) {

_PIXEL[x, y] = (_PIXEL[x, y] <= _PIXEL[(x - 1), (y - 1)] ? _PIXEL[x, y] : _PIXEL[(x - 1), (y - 1)]);


(45)

B - 34

elseif ((_PIXEL[(x - 1), (y - 1)] > 1) && (_PIXEL[x, y] == 1)) {

_PIXEL[x, y] = _PIXEL[(x - 1), (y - 1)]; }

if ((_PIXEL[(x - 1), (y + 1)] > 1) && (_PIXEL[x, y] > 1)) {

_PIXEL[x, y] = (_PIXEL[x, y] <= _PIXEL[(x - 1), (y + 1)] ? _PIXEL[x, y] : _PIXEL[(x - 1), (y + 1)]);

}

elseif ((_PIXEL[(x - 1), (y + 1)] > 1) && (_PIXEL[x, y] == 1)) {

_PIXEL[x, y] = _PIXEL[(x - 1), (y + 1)]; }

_PIXEL[x, (y - 1)] = (_PIXEL[x, (y - 1)] > 0 ? _PIXEL[x, y] : _PIXEL[x, (y - 1)]);

_PIXEL[x, (y + 1)] = (_PIXEL[x, (y + 1)] > 0 ? _PIXEL[x, y] : _PIXEL[x, (y + 1)]);

_PIXEL[(x + 1), y] = (_PIXEL[(x + 1), y] > 0 ? _PIXEL[x, y] : _PIXEL[(x + 1), y]);

_PIXEL[(x - 1), y] = (_PIXEL[(x - 1), y] > 0 ? _PIXEL[x, y] : _PIXEL[(x - 1), y]);

_PIXEL[(x + 1), (y - 1)] = (_PIXEL[(x + 1), (y - 1)] > 0 ? _PIXEL[x, y] : _PIXEL[(x + 1), (y - 1)]);

_PIXEL[(x + 1), (y + 1)] = (_PIXEL[(x + 1), (y + 1)] > 0 ? _PIXEL[x, y] : _PIXEL[(x + 1), (y + 1)]);

_PIXEL[(x - 1), (y - 1)] = (_PIXEL[(x - 1), (y - 1)] > 0 ? _PIXEL[x, y] : _PIXEL[(x - 1), (y - 1)]);

_PIXEL[(x - 1), (y + 1)] = (_PIXEL[(x - 1), (y + 1)] > 0 ? _PIXEL[x, y] : _PIXEL[(x - 1), (y + 1)]);

} } } }

for (int y = (_GAMBAR.Height - 1); y >= 1; y--) {

for (int x = (_GAMBAR.Width - 1); x >= 1; x--) {

if (_PIXEL[x, y] > 0) {


(46)

B - 35 {

_PIXEL[x, y] = (_PIXEL[x, y] <= _PIXEL[x, (y - 1)] ? _PIXEL[x, y] : _PIXEL[x, (y - 1)]);

}

elseif ((_PIXEL[x, (y - 1)] > 1) && (_PIXEL[x, y] == 1)) {

_PIXEL[x, y] = _PIXEL[x, (y - 1)]; }

if ((_PIXEL[x, (y + 1)] > 1) && (_PIXEL[x, y] > 1)) {

_PIXEL[x, y] = (_PIXEL[x, y] <= _PIXEL[x, (y + 1)] ? _PIXEL[x, y] : _PIXEL[x, (y + 1)]);

}

elseif ((_PIXEL[x, (y + 1)] > 1) && (_PIXEL[x, y] == 1)) {

_PIXEL[x, y] = _PIXEL[x, (y + 1)]; }

if ((_PIXEL[(x - 1), y] > 1) && (_PIXEL[x, y] > 1)) {

_PIXEL[x, y] = (_PIXEL[x, y] <= _PIXEL[(x - 1), y] ? _PIXEL[x, y] : _PIXEL[(x - 1), y]);

}

elseif ((_PIXEL[(x - 1), y] > 1) && (_PIXEL[x, y] == 1)) {

_PIXEL[x, y] = _PIXEL[(x - 1), y]; }

if ((_PIXEL[(x + 1), y] > 1) && (_PIXEL[x, y] > 1)) {

_PIXEL[x, y] = (_PIXEL[x, y] <= _PIXEL[(x + 1), y] ? _PIXEL[x, y] : _PIXEL[(x + 1), y]);

}

elseif ((_PIXEL[(x + 1), y] > 1) && (_PIXEL[x, y] == 1)) {

_PIXEL[x, y] = _PIXEL[(x + 1), y]; }

if ((_PIXEL[(x + 1), (y - 1)] > 1) && (_PIXEL[x, y] > 1)) {

_PIXEL[x, y] = (_PIXEL[x, y] <= _PIXEL[(x + 1), (y - 1)] ? _PIXEL[x, y] : _PIXEL[(x + 1), (y - 1)]);


(47)

B - 36

elseif ((_PIXEL[(x + 1), (y - 1)] > 1) && (_PIXEL[x, y] == 1)) {

_PIXEL[x, y] = _PIXEL[(x + 1), (y - 1)]; }

if ((_PIXEL[(x + 1), (y + 1)] > 1) && (_PIXEL[x, y] > 1)) {

_PIXEL[x, y] = (_PIXEL[x, y] <= _PIXEL[(x + 1), (y + 1)] ? _PIXEL[x, y] : _PIXEL[(x + 1), (y + 1)]);

}

elseif ((_PIXEL[(x + 1), (y + 1)] > 1) && (_PIXEL[x, y] == 1)) {

_PIXEL[x, y] = _PIXEL[(x + 1), (y + 1)]; }

if ((_PIXEL[(x - 1), (y - 1)] > 1) && (_PIXEL[x, y] > 1)) {

_PIXEL[x, y] = (_PIXEL[x, y] <= _PIXEL[(x - 1), (y - 1)] ? _PIXEL[x, y] : _PIXEL[(x - 1), (y - 1)]);

}

elseif ((_PIXEL[(x - 1), (y - 1)] > 1) && (_PIXEL[x, y] == 1)) {

_PIXEL[x, y] = _PIXEL[(x - 1), (y - 1)]; }

if ((_PIXEL[(x - 1), (y + 1)] > 1) && (_PIXEL[x, y] > 1)) {

_PIXEL[x, y] = (_PIXEL[x, y] <= _PIXEL[(x - 1), (y + 1)] ? _PIXEL[x, y] : _PIXEL[(x - 1), (y + 1)]);

}

elseif ((_PIXEL[(x - 1), (y + 1)] > 1) && (_PIXEL[x, y] == 1)) {

_PIXEL[x, y] = _PIXEL[(x - 1), (y + 1)]; }

_PIXEL[x, (y - 1)] = (_PIXEL[x, (y - 1)] > 0 ? _PIXEL[x, y] : _PIXEL[x, (y - 1)]);

_PIXEL[x, (y + 1)] = (_PIXEL[x, (y + 1)] > 0 ? _PIXEL[x, y] : _PIXEL[x, (y + 1)]);

_PIXEL[(x + 1), y] = (_PIXEL[(x + 1), y] > 0 ? _PIXEL[x, y] : _PIXEL[(x + 1), y]);

_PIXEL[(x - 1), y] = (_PIXEL[(x - 1), y] > 0 ? _PIXEL[x, y] : _PIXEL[(x - 1), y]);


(48)

B - 37

_PIXEL[(x + 1), (y - 1)] = (_PIXEL[(x + 1), (y - 1)] > 0 ? _PIXEL[x, y] : _PIXEL[(x + 1), (y - 1)]);

_PIXEL[(x + 1), (y + 1)] = (_PIXEL[(x + 1), (y + 1)] > 0 ? _PIXEL[x, y] : _PIXEL[(x + 1), (y + 1)]);

_PIXEL[(x - 1), (y - 1)] = (_PIXEL[(x - 1), (y - 1)] > 0 ? _PIXEL[x, y] : _PIXEL[(x - 1), (y - 1)]);

_PIXEL[(x - 1), (y + 1)] = (_PIXEL[(x - 1), (y + 1)] > 0 ? _PIXEL[x, y] : _PIXEL[(x - 1), (y + 1)]);

} } }

for (int y = 1; y < _GAMBAR.Height; y++) {

_INDEKS = 0;

for (int x = 1; x < _GAMBAR.Width; x++) {

if (_PIXEL[x, y] > 0) {

_INDEKS = 0; _CHECK = false;

for (int o = 1; o < (_GAMBAR.Height + _GAMBAR.Width); o++) {

if (_OBJECT_ID[o] == _PIXEL[x, y]) {

_CHECK = true; _ID = o;

} }

_INDEKS = (_CHECK == true ? _ID : 0); if (_INDEKS > 0)

{

_OBJECT_X_START[_INDEKS] =

(_OBJECT_X_START[_INDEKS] > x ? x : _OBJECT_X_START[_INDEKS]); _OBJECT_Y_START[_INDEKS] =

(_OBJECT_Y_START[_INDEKS] > y ? y : _OBJECT_Y_START[_INDEKS]); _OBJECT_X_END[_INDEKS] =

(_OBJECT_X_END[_INDEKS] < x ? x : _OBJECT_X_END[_INDEKS]); _OBJECT_Y_END[_INDEKS] =

(_OBJECT_Y_END[_INDEKS] < y ? y : _OBJECT_Y_END[_INDEKS]); _OBJECT_LUAS[_INDEKS]++;


(49)

B - 38 _CEKBORDER = 0;

_CEKBORDER = (_PIXEL[x, (y + 1)] == 0 ? _CEKBORDER + 1 : _CEKBORDER);

_CEKBORDER = (_PIXEL[x, (y - 1)] == 0 ? _CEKBORDER + 1 : _CEKBORDER);

_CEKBORDER = (_PIXEL[(x + 1), y] == 0 ? _CEKBORDER + 1 : _CEKBORDER);

_CEKBORDER = (_PIXEL[(x - 1), y] == 0 ? _CEKBORDER + 1 : _CEKBORDER);

_OBJECT_KELILING[_INDEKS] = (_CEKBORDER > 0 ? _OBJECT_KELILING[_INDEKS] + 1 : _OBJECT_KELILING[_INDEKS]); _OBJECT_SHAPE[_INDEKS] =

((_OBJECT_KELILING[_INDEKS] * _OBJECT_KELILING[_INDEKS]) / _OBJECT_LUAS[_INDEKS]);

} else

{

foreach (int a in _OBJECT_ID) {

if (a > 0) {

_INDEKS++; }

}

_INDEKS = (_INDEKS < 1 ? 1 : (_INDEKS + 1)); _OBJECT_ID[_INDEKS] = _PIXEL[x, y];

_OBJECT_X_START[_INDEKS] = x; _OBJECT_X_END[_INDEKS] = x; _OBJECT_Y_START[_INDEKS] = y; _OBJECT_Y_END[_INDEKS] = y; _OBJECT_LUAS[_INDEKS]++; _CEKBORDER = 0;

_CEKBORDER = (_PIXEL[x, (y + 1)] == 0 ? _CEKBORDER + 1 : _CEKBORDER);


(50)

B - 39

_CEKBORDER = (_PIXEL[x, (y - 1)] == 0 ? _CEKBORDER + 1 : _CEKBORDER);

_CEKBORDER = (_PIXEL[(x + 1), y] == 0 ? _CEKBORDER + 1 : _CEKBORDER);

_CEKBORDER = (_PIXEL[(x - 1), y] == 0 ? _CEKBORDER + 1 : _CEKBORDER);

_OBJECT_KELILING[_INDEKS] = (_CEKBORDER > 0 ? _OBJECT_KELILING[_INDEKS] + 1 : _OBJECT_KELILING[_INDEKS]); _OBJECT_SHAPE[_INDEKS] =

((_OBJECT_KELILING[_INDEKS] * _OBJECT_KELILING[_INDEKS]) / _OBJECT_LUAS[_INDEKS]);

} } } }

foreach (int a in _OBJECT_ID) {

if (a > 0) {

_JUMLAH++; }

}

for (int y = 0; y < _GAMBAR.Height; y++) {

for (int x = 0; x < _GAMBAR.Width; x++) {

Text.Write(_PIXEL[x, y] + " "); }

Text.WriteLine(""); }

Text.Close();

XML.setPATH(_PATH);

XML.setJUMLAH(_JUMLAH);

XML.setOBJECT_ID(_OBJECT_ID);

XML.setOBJECT_X_START(_OBJECT_X_START); XML.setOBJECT_Y_START(_OBJECT_Y_START); XML.setOBJECT_X_END(_OBJECT_X_END);


(51)

B - 40

XML.setOBJECT_Y_END(_OBJECT_Y_END); XML.setOBJECT_KELILING(_OBJECT_KELILING); XML.setOBJECT_LUAS(_OBJECT_LUAS);

XML.setOBJECT_SHAPE(_OBJECT_SHAPE);

XML.CreateXML();

frm_MAIN.saya.setJUMLAH(_JUMLAH); frm_MAIN.saya.setOBJECT_ID(_OBJECT_ID);

frm_MAIN.saya.setOBJECT_X_START(_OBJECT_X_START); frm_MAIN.saya.setOBJECT_Y_START(_OBJECT_Y_START); frm_MAIN.saya.setOBJECT_X_END(_OBJECT_X_END); frm_MAIN.saya.setOBJECT_Y_END(_OBJECT_Y_END); frm_MAIN.saya.setOBJECT_KELILING(_OBJECT_KELILING); frm_MAIN.saya.setOBJECT_LUAS(_OBJECT_LUAS);

frm_MAIN.saya.setOBJECT_SHAPE(_OBJECT_SHAPE); return _PATH;

} } } }

B.7 LISTING PROGRAM PADA FORM CLASS PROGRAM

using System;

using System.Collections.Generic;

using System.Linq;

using System.Windows.Forms;

namespace iCout_U____Does_it {

staticclass cls_PROGRAM {

/// <summary>

/// The main entry point for the application. /// </summary>

[STAThread] staticvoid Main() {

Application.EnableVisualStyles();

Application.SetCompatibleTextRenderingDefault(false); Application.Run(new frm_SPLASH());


(52)

B - 41 }

} }

B.8 LISTING PROGRAM PADA FORM CLASS XMLPROCESSOR

using System;

using System.Collections;

using System.Data;

using System.Xml;

using System.Linq;

using System.Text;

using System.IO;

namespace iCout_U____Does_it {

publicclass XMLProcessor {

privatestring _PATH;

privateint _JUMLAH; privateint[] _OBJECT_ID;

privateint[] _OBJECT_X_START; privateint[] _OBJECT_X_END; privateint[] _OBJECT_Y_START; privateint[] _OBJECT_Y_END;

privatedouble[] _OBJECT_KELILING; privatedouble[] _OBJECT_LUAS; privatedouble[] _OBJECT_SHAPE; public XMLProcessor()

{ }

publicvoid setPATH(string _PATHx) {

_PATH = _PATHx; }

publicvoid setOBJECT_ID(paramsint[] _OBJECT_IDx) {

_OBJECT_ID = _OBJECT_IDx; }


(53)

B - 42

publicvoid setOBJECT_X_START(paramsint[] _OBJECT_X_STARTx) {

_OBJECT_X_START = _OBJECT_X_STARTx; }

publicvoid setOBJECT_Y_START(paramsint[] _OBJECT_Y_STARTx) {

_OBJECT_Y_START = _OBJECT_Y_STARTx; }

publicvoid setOBJECT_X_END(paramsint[] _OBJECT_X_ENDx) {

_OBJECT_X_END = _OBJECT_X_ENDx; }

publicvoid setOBJECT_Y_END(paramsint[] _OBJECT_Y_ENDx) {

_OBJECT_Y_END = _OBJECT_Y_ENDx; }

publicvoid setOBJECT_KELILING(paramsdouble[] _OBJECT_KELILINGx) {

_OBJECT_KELILING = _OBJECT_KELILINGx; }

publicvoid setOBJECT_LUAS(paramsdouble[] _OBJECT_LUASx) {

_OBJECT_LUAS = _OBJECT_LUASx; }

publicvoid setOBJECT_SHAPE(paramsdouble[] _OBJECT_SHAPEx) {

_OBJECT_SHAPE = _OBJECT_SHAPEx; }

publicvoid setJUMLAH(int _JUMLAHx) {

_JUMLAH = _JUMLAHx; }

publicvoid CreateXML() {


(54)

B - 43

_PATHx = Path.GetDirectoryName(_PATH) + "\\" + Path.GetFileNameWithoutExtension(_PATH) + ".icup";

XmlTextWriter myXmlTextWriter = new XmlTextWriter(_PATHx, System.Text.Encoding.UTF8);

myXmlTextWriter.Formatting = Formatting.Indented; myXmlTextWriter.WriteStartDocument(false);

myXmlTextWriter.WriteComment("ICout U! - Project File"); myXmlTextWriter.WriteStartElement("icup");

myXmlTextWriter.WriteStartElement("configuration", null);

myXmlTextWriter.WriteElementString("pic_author", null, "Author Gambar");

myXmlTextWriter.WriteElementString("pic_name", null, "Nama Gambar");

myXmlTextWriter.WriteElementString("pic_crc", null, "CRC Gambar"); myXmlTextWriter.WriteElementString("pic_format", null, "Format Gambar");

myXmlTextWriter.WriteEndElement(); myXmlTextWriter.Flush();

myXmlTextWriter.WriteStartElement("information", null); for (int v = 1; v <= _JUMLAH; v++)

{

myXmlTextWriter.WriteStartElement("object", null); myXmlTextWriter.WriteElementString("object-id", null, Convert.ToString(_OBJECT_ID[v]));

myXmlTextWriter.WriteElementString("object-start-x", null, Convert.ToString(_OBJECT_X_START[v]));

myXmlTextWriter.WriteElementString("object-start-y", null, Convert.ToString(_OBJECT_Y_START[v]));

myXmlTextWriter.WriteElementString("object-end-x", null, Convert.ToString(_OBJECT_X_END[v]));

myXmlTextWriter.WriteElementString("object-end-y", null, Convert.ToString(_OBJECT_Y_END[v]));


(55)

B - 44

myXmlTextWriter.WriteElementString("object-luas", null, Convert.ToString(_OBJECT_LUAS[v]));

myXmlTextWriter.WriteElementString("object-keliling", null, Convert.ToString(_OBJECT_KELILING[v]));

myXmlTextWriter.WriteElementString("object-shapefactor", null, Convert.ToString(_OBJECT_SHAPE[v]));

myXmlTextWriter.WriteEndElement(); }

myXmlTextWriter.WriteEndElement(); myXmlTextWriter.WriteEndElement(); myXmlTextWriter.Flush();

myXmlTextWriter.Close(); }

} }


(56)

LAMPIRAN C


(57)

C-1

PENGENALAN VISUAL C#

Microsoft Visual C#.NET adalah sebuah bahasa pemrograman baru dalam dunia teknologi informasi, dengan berbasiskan platform baru yang di kembangkan oleh Microsoft sebagai salah satu produsen perangkat lunak yang cukup dominan yakni platform .NET Framework, kelebihan dari digunakannya platform baru ini tidak lain adalah .NET Framework menawarkan kompabitilas dan portabilitas yang sangat signifingkan jika di bandingkan dengan bahasa penprograman lain di luar .NET Framework.

Dengan teknologi .NET Framework sangatlah memungkinkan untuk mendesain sebuah perangkat lunak yang dapat berjalan di berbagai sistem operasi, prosesor, maupun berbagai peralatan elektronik yang mendukung platform .NET seperti PDA, SMART Phone dan peralatan elektronik lainnya. Kompabilitas yang sangat luas tersebut di mungkinkan tanpa melakukan compile ulang terhadap perangkat lunak yang telah dibuat, hal tersebut di mungkinkan karena teknologi .NET Framework mengadopsi teknologi virtualisasi CPU, sehingga perangkat lunak yang telah di kompilasi adalah perangkat lunak yang berjalan di atas framework virtual sehingga nantinya perangkat lunak tersebut tidak bergantung pada sistem operasi maupun jenis prosesor yang di gunakan.


(58)

C-2

C. 1 Integrated Development Environment ( IDE )

Gambar C.1 IDE Visual Studio 2008

Dalam melakukan pemrograman Visual C# tidak di perlukan suatu editor khusus, cukup dengan aplikasi teks editor seperti notepad, programmer dapat membuatu suatu perangkat lunak yang berbasiskan Visual C#, tetapi untuk membangun suatu perangkat yang memiliki tingkat kompleksitas yang tinggi maka

diperlukan suatu “alat” untuk membantu dalam melakukan perancangan perangkat

lunak mulai dari perancangan antar muka sampai penulisan kode program, oleh karena itu digunakan suatu IDE (Integrated Development Environment) sebagai alat bantu dalam membangun suatu perangkat lunak. Pada Gambar C.1 dapat dilihat bahwa IDE dari Visual Studio 2008 memiliki beberapa bagian, berikut adalah bagian

bagian dari IDE (Integrated Development Environment) tersebut beserta dengan penjelasannya :


(59)

C-3

Menu Bar, merupakan tempat menampilkan menu Visual Studio seperti File,

Edit, View, Project, Build, Debug, Data, Format, Tools, Text, Window, Help. Jendela Toolbox, jendela ini berisi komponen - komponen atau objek-objek visual untuk melakukan pemrograman.

Jendela Form Designer, merupakan tempat untuk merancang antarmuka perangkat lunak, objek – objek dari jendela Toolbox akan di tempatkan di jendela ini.

Jendela Properties, adalah jendela berisikan karakteristik dari form dan

objek-objek yang ada dalam form tersebut seperti ukuran, posisi, nama tampilan dan lain - lain.

Jendela Error List, adalah jendela yang berfungsi untuk menunjukan

kesalahan – kesalahan yang terjadi ketika kompilasi perangkat lunak di lakukan.

Jendela Solution Explorer, pada jendela ini semua komponen – komponen dari perangkat lunak yang digunakan dalam percangan dapat dilihat.

C. 2 Jenis – jenis Kontrol pada Visual C#


(60)

C-4

Gambar C.2 Menunjukan kontrol – kontrol yang sering digunakan dalam membangun suatu perangkat lunak, untuk lebih jelas mengenai fungsi dan deskripsi dari kontrol – kontrol diatas dapat dilihat pada tabel C.1.

Tabel C.1 Fungsi dan deskripsi dari kontrol – kontrol dalam kategori Command Controls.

Nama Kontrol Keterangan

Button Digunakan untuk membangkitkan event proses tertentu ketika pemakai melakukan operasi klik terhadap kontrol ini.

CheckBox Digunakan untuk melakukan satu atau lebih pilihan bernilai yes/no, true/false.

CheckedListBox Merupakan gabungan dari ListBox dan CheckBox, dan memiliki fungsi sama seperti CheckBox. ComboBox Digunakan untuk menampung suatu item data dengan style dropdown.

DateTimePicker Digunakan untuk mengambil data yang berupa waktu, untuk selanjutnya di lakukan proses. Label Digunakan untuk menampilkan teks yang tidak dapat diubah oleh pemakai.

LinkLabel Digunakan untuk menampilkan teks yang tidak dapat diubah oleh pemakai, tidak seperti label biasa label jenis ini dapat diisi dengan link.

ListBox Digunakan untuk menampung suatu item data dengan style datalist.

ListView Digunakan untuk menampung komponen - komponen dalam suatu perangkat lunak.

MaskedTextBox Digunakan untuk menampung suatu teks yang memiliki ukuran terbatas, tetapi menampilkan text dengan format yang telah di tentukan.

MonthCalendar Digunakan untuk mengambil data yang hanya bernilai bulan dari suatu waktu. NotifyIcon Digunakan untuk membuat suatu icon yang akan bereaksi jika suatu event terpenuhi. NumericUpDown Digunakan untuk mengambil nilai numerik.

PictureBox Digunakan untuk menampilkan suatu gambar yang akan di proses atau telah diproses. Pointer Mengembalikan mouse pointer jika telah selesai melakukan penambahan kontrol ke form. ProgressBar Digunakan untuk mengetahui seberapa persentase kemajuan suatu proses yang sedang di lakukan. RadioButton Digunakan untuk melakukan hanya satu pilihan dan bernilai true/false.

RichTextBox Digunakan untuk menampung suatu teks yang cukup besar. TextBox Digunakan untuk menampung teks yang memiliki ukuran terbatas.

ToolTip Digunakan untuk memberikan informasi kepada pengguna perangkat lunak mengenai kontrol yang ada pada perangkat lunak tersebut.

TreeView Digunakan untuk menampilkan data - data dengan bentuk pohon. WebBrowser Digunakan untuk menampilkan situs dari suatu situs di internet.

Selain menggunakan kontrol – kontrol yang ada pada kategori Common Controls, dalam melakukan perancangan suatu perangkat lunak dibutuhkan juga kontrol – kontrol yang berfungsi sebagai alat interaksi antara perangkat lunak dengan pengguna perangkat lunak itu sendiri. Kontrol – kontrol yang memiliki fungsi seperti yang telah disebutkan terdapat pada kontrol dengan kategori Dialogs ( Gambar C.3 ), untuk keterangan lebih lanjut mengenai kontrol – kontrol tersebut dapat dilihat pada tabel C.2.


(61)

C-5

Gambar C.3 Kontrol pada kategori Dialogs

Tabel C.2 Fungsi dan deskripsi dari kontrol – kontrol dalam kategori Dialogs.

Nama Kontrol Keterangan

Pointer Mengembalikan mouse pointer jika telah selesai melakukan penambahan kontrol ke form.

ColorDialog Kontrol dialog yang akan memunculkan suatu dialog yang meminta pemakai untuk memilih suatu warna.

FolderBrowser Dialog

Kontrol dialog yang akan memunculkan suatu dialog yang meminta pemakai untuk memilih suatu folder.

FontDialog

Kontrol dialog yang akan memunculkan suatu dialog yang meminta pemakai untuk memilih suatu jenis huruf beserta atributnya.

OpenFileDialog

Kontrol dialog yang akan memunculkan suatu dialog yang meminta pemakai untuk memilih suatu alamat di mana suatu file akan dibuka.

SaveFileDialog

Kontrol dialog yang akan memunculkan suatu dialog yang meminta pemakai untuk memilih suatu alamat di mana suatu file akan disimpan.

C. 3 Dasar Pemrograman Visual C# C. 3. 1 Variabel

Sebagai bahasa pemrograman yang mengadopsi gaya penulisan C\C++ maka

C# juga memiliki “perilaku” yang tidak berbeda jauh dengan C\C++, salah satu

contoh nyata dari “perilaku” ini adalah bagaimana C# memperlakukan variabel –

variabel yang akan di tulis dengan bahasa pemrograman ini bersifat strongly-typed yang berarti setiap variabel yang ada pada C# haruslah memiliki suatu tipe data tertentu dan variabel yang terlah di deklarasikan sebagai variabel yang memiliki suatu tipe data tersebut tidak dapat menangani tipe data lainnya, selain itu variabel dalam


(62)

C-6

C# juga bersifat case sensitive yang berarti C# membedakan penggunaan huruf kapital dan huruf kecil.

Berikut ini adalah aturan – aturan penamaan variabel dalam C# :

1. Nama variabel hanya diijinkan terdiri dari huruf, angka dan karakter underscore ( _ ).

2. Variabel bersifat case sensitive.

3. Keyword tidak dapat digunakan sebagai nama variabel, terkecuali pada awal keyword tersebut di tambahkan karakter @ ( untuk daftar keyword dapat dilihat pada tabel C.3 )

Tabel C.3 Keyword pada C#

abstract event null switch

as explicit object this

base extern operator throw

bool finally out try

break fixed override typeof

byte float params uint

case for private ulong

catch foreach protected unchecked

char goto public unsafe

checked if readonly ushort

class implicit ref using

const in return virtual

continue int sbyte void

decimal interface sealed volatile

default internal short while

delegate is sizeof FALSE

do lock stackalloc TRUE

double long static

else namespace string

enum new struct

Selain harus memperhatikan aturan – aturan dalam penamaan sebuah variabel, variabel juga harus memiliki suatu tipe yang nantinya akan mendeskripsikan nilai – nilai yang akan ditangani, untuk memperjelas mengenai tipe data yang ada dalam C#


(63)

C-7

maka dapat dilihat pada tabel C.4. Pada tabel dilihat bahwa penentuan tipe data pada suatu variabel dapat memberikan dampak yang cukup signifigkan dalam pembuatan perangkat lunak, hal ini dapat dilihat bahwa beberapa tipe data menggunakan relatif cukup banyak memory dalam penanganannya, bila semua variabel dalam perangkat lunak yang akan di buat menggunakan tipe yang menggunakan memory yang relatif boros tentunya mengakibatkan perangkat lunak tesebut akan berjalan kurang optimal.

Tabel C.4 Tipe Data pada C#

Tipe

Ukuran ( Dalam

Bit ) Range

bool - -

byte 8 0 sampai 255

char 16 0 sampai 65535

char - -

decimal 128 1.0 x 10-28 sampai 7.9 x 1028 double 64 5.0 x 10-324 sampai 1.7 x 10308

float 32 1.5 x 10-45 sampai 3.4 x 1038

int 32 -2147483648 sampai 2147483647

long 64

-9223372036854775808 sampai 9223372036854775807

sbyte 8 -128 sampai 127

short 16 -32768 sampai 32767

string - -

uint 32 0 sampai 4294967295

ulong 64 0 sampai 18446744073709551615

ushort 16

0 sampai 65535

C. 3. 2 Flow Control

Hal yang tidak kalah pentingnya dalam pembuatan suatu perangkat lunak adalah flow control, dengan menggunakan sintaks sintaks flow control event event pada perangkat lunak yang dibangun dapat dengan mudah di kendalikan. Flow control pada C# memiliki sintaksis bahasa yang sama dengan bahasa pemrograman C\C++, kesamaan tersebut tidak hanya pada sintaksis melainkan juga pada penggunaan flow control tersebut.


(64)

C-8

Berikut ini adalah beberapa sintaks dari flow control beserta contoh penggunaannya dalam kode program :

1. if

if statement digunakan untuk meneksekusi kode program jika kondisi tertentu terpenuhi.

2. if - else

Merupakan variasi dari statement if, selain menetukan langkah apa yang harus dilakukan jika suatu kondisi terpenuhi, juga dapat menetukan langkah apa yang dilakukan apabila kondisi tersebut tidak terpenuhi.

3. switch

switch merupakan variasi dari statement if - else. Statement ini biasa digunakan untuk mengecek beberapa kemungkinan dari suatu variabel. Berbeda dengan C yang pada statement switch hanya bisa menggunakan variabel numerik, C# dapat menggunakan string.

4. while

while statement berguna untuk melakukan perulangan selama kondisi bernilai true. Pengecekan kondisi dilakukan di awal, sehingga memungkinkan proses loop tidak dijalankan sama sekali.

5. do - while

do - while merupakan variasi dari statement while. Bedanya pengecekan variabel dilakukan di akhir. Ini berarti bahwa badan loop akan dijalankan minimal sekali.

6. for

Seperti keluarga bahasa C lainnya, for digunakan untuk melakukan perulangan selama kondisi terpenuhi. Bedanya dengan while terdapat pada deklarasi statement for dapat menetukan 3 hal, kondisi awal, kondisi akhir perulangan ( kondisi pengecekan ) dan kondisi yang dilakukan tiap pada akhir perulangan.


(65)

C-9 7. foreach

Bentuk iterasi khusus yang tidak berada di C adalah foreach, bentuk ini sebenarnya diambil dari Visual Basic (for each). Statement foreach digunakan untuk menelusuri suatu Collection, misalnya array.

C. 3. 3 Method

Method adalah bagian dari tubuh program yang mengimplementasikan suatu action sehingga class atau object dapat bekerja. Beberapa method tersebut yakni :

1. Static Method

Method dapat di overload, artinya satu nama method dapat dipakai berkali-kali selama dia memiliki sesuatu yang unik. Sesuatu yang unik pada method tersebut dapat terdiri dari banyaknya parameter, type parameter atau modifier parameter yang berbeda.

2. Non - Static Method

Static method dapat diakses hanya melalui class, sedangkan non-static method hanya dapat diakses melalui instance.

C. 3. 4 Modifier

Modifier adalah keyword yang dipakai untuk menspesifikasikan deklarasi pengaksesan (akses level) suatu member atau type. Modifier yang harus diperhatikan dapat dilihat pada tabel C.5.

Tabel C.5 Jenis – jenis Modifier

Akes level Keterangan

Internal Akses dibatasi hanya pada project yang sama Private Akses dibatasi hanya pada type / class nya

Protected Akses dibatasi pada classnya saja atau type yang diturunkan dari class Public Akses tidak dibatasi

Untuk mengenal lebih lanjut tentang bahasa pemrograman C# ini sebaiknya membaca beberapa referensi yang membahas secara khusus bahasa pemrograman ini.


(1)

C-9

digunakan untuk menelusuri suatu Collection, misalnya array.

C. 3. 3 Method

Method adalah bagian dari tubuh program yang mengimplementasikan suatu action sehingga class atau object dapat bekerja. Beberapa method tersebut yakni :

1. Static Method

Method dapat di overload, artinya satu nama method dapat dipakai berkali-kali selama dia memiliki sesuatu yang unik. Sesuatu yang unik pada method tersebut dapat terdiri dari banyaknya parameter, type parameter atau modifier parameter yang berbeda.

2. Non - Static Method

Static method dapat diakses hanya melalui class, sedangkan non-static method hanya dapat diakses melalui instance.

C. 3. 4 Modifier

Modifier adalah keyword yang dipakai untuk menspesifikasikan deklarasi pengaksesan (akses level) suatu member atau type. Modifier yang harus diperhatikan dapat dilihat pada tabel C.5.

Tabel C.5 Jenis – jenis Modifier

Akes level Keterangan

Internal Akses dibatasi hanya pada project yang sama Private Akses dibatasi hanya pada type / class nya

Protected Akses dibatasi pada classnya saja atau type yang diturunkan dari class Public Akses tidak dibatasi

Untuk mengenal lebih lanjut tentang bahasa pemrograman C# ini sebaiknya membaca beberapa referensi yang membahas secara khusus bahasa pemrograman ini.


(2)

BAB I

PENDAHULUAN

1.1 Latar Belakang

Permasalahan dalam menghitung suatu objek tertentu dengan jumlah yang relatif banyak pada sebuah daerah pengamatan, misalnya menghitung banyaknya bintang dalam suatu daerah pengamatan atau menghitung banyaknya pohon dari sebuah hutan homogen dapat dilakukan secara manual, tetapi hal ini cukup rumit dan relatif cukup menyita waktu. Dengan bantuan teknologi pengolahan citra digital maka permasalahan penghitungan objek seperti yang telah di paparkan diatas dapat dipecahkan, dengan menangkap citra digital dari objek yang akan di hitung dari ketinggian tertentu untuk mendapatkan gambar yang baik dan nantinya diproses oleh komputer.

Untuk memecahkan masalah penghitungan objek tersebut maka pada tugas akhir ini digunakan teknologi pengolahan citra digital dalam melakukan penghitungan objek tersebut.

1.2 Identifikasi Masalah

1. Timbulnya masalah penggunaan waktu yang relatif lama jika melakukan penghitungan obyek secara manual terutama obyek yang memiliki jumlah yang cukup banyak.

2. Penerapan Teknologi Pengolahan Citra Digital untuk menghitung banyak obyek pada suatu daerah pengamatan

1.3 Perumusan Masalah

1. Bagaimana menghitung banyak objek yang ada dalam suatu daerah tertentu dengan menggunakan bantuan pengolahan citra digital ?


(3)

Universitas Kristen Maranatha 1.5 Pembatasan Masalah

1. Citra digital yang dapat diolah dibatasi hanya citra digital dengan format BMP.

2. Citra digital yang akan diolah adalah citra digital dengan kualitas yang baik, citra yang memiliki noise yang rendah dan tidak kabur (blur).

3. Asumsi antara latar belakang dan objek yang akan diproses memiliki kekontrasan yang cukup, sehingga dapat dipisahkan.

4. Asumsi objek yang akan dihitung memiliki bentuk yang homogen.

5. Asumsi objek yang akan dihitung maksimal memiliki empat bentuk yang berbeda.

6. Asumsi tidak terjadi irisan antara dua atau lebih objek yang akan diproses. 7. Jumlah pixel latar belakang lebih dominan.

1.6 Sistematika Penulisan

Sistematika pembahasan laporan tugas akhir ini disusun menjadi lima bab, yaitu sebagai berikut :

Bab I : Pendahuluan

Bab ini membahas tentang latar belakang, identifikasi masalah, tujuan, pembatasan masalah, serta sistematika pembahasan.

Bab II : Dasar Teori

Bab ini membahas tentang landasan teori - teori yang mendasari proses perancangan perangkat lunak penghitung objek, teori – teori yang dibahas dalam, bab ini antara lain teori konversi mode warna yang satu ke mode warna lainnya dalam hal ini mengkonversi citra dengan bentuk warna RGB ke bentuk warna grascale, mengkonversi citra dengan bentuk warna grayscale ke bentuk warna biner. Selain itu pada bab ini juga dibahas teori shape factor yaitu suatu teknik pengenalan objek bedasarkan morfologinya.


(4)

Bab III : Perancangan dan Realisasi

Bab ini membahas tentang perancangan dan realisasi perangkat lunak penghitung dan pengklasifikasi objek pada suatu citra digital. Perancangan dan realisasi pada bab ini dimulai dengan perancangan antarmuka dari perangkat lunak itu sendiri, lalu dilanjutkan dengan implementasi teori – teori yang mendukung dari perancangan perangkat lunak ini kedalam algoritma program. Pada bab ini juga dijelaskan bagaimana alur kerja dari perangkat lunak dimulai dari tahap akusisi citra digital ke perangkat lunak, konversi warna pada citra ke bentuk grayscale dan biner, pemisahan objek dengan latar belakang, konversi citra digital ke bentuk kode, pengenalan objek bedasarkan bentuk morfologi dan di akhiri dengan klasifikasi objek dan menampilkanya ke pengguna.

Bab IV : Data Pengamatan dan Analisa

Bab ini membahas pengamatan, pengujian, dan analisa data dari perangkat lunak yang telah dirancang dan direalisasikan. Pengujian yang dilakukan pada perangkat lunak meliputi pengujian kemampuan perangkat lunak dalam mengenali objek dan mengklasifikasikannya dan pengujian kemampuan perangkat lunak menghitung banyak objek pada citra digital itu sendiri.

Bab V : Kesimpulan dan Saran

Bab ini berisi tentang kesimpulan dan saran untuk perbaikan serta pengembangan lebih lanjut.


(5)

Universitas Kristen Maranatha

BAB IV

KESIMPULAN DAN SARAN

5.1 Kesimpulan

Adapun kesimpulan yang dapat ditarik dari tugas akhir ini adalah :

1. Perancangan perangkat lunak yang dapat menghitung dan mengklasifikasikan objek pada suatu citra digital telah dapat di realisasikan dengan keberhasilan perangkat lunak dalam mengidentifikasi objek sebesar 94,65% dan persentase keberhasilan dalam melakukan penghitungan jumlah objek sebesar 99,73% dalam tiga kali percobaan. 2. Hasil dari pengklasifikasian objek oleh program sangat bergantung dari

morfologi objek tersebut.

5.2 Saran

Berikut ini adalah saran – saran yang diajukan untuk pengembangan lebih lanjut dari pembuatan tugas akhir ini :

1. Untuk pengembangan lebih lanjut, sebaiknya menggunakan beberapa parameter pengenal objek untuk meningkatkan kepresisian dari program dalam mengenali objek seperti parameter fourier, parameter eccentricity, parameter solidity dan parameter – parameter lainnya.


(6)

DAFTAR PUSTAKA

1. Acharya, Tinku, Image processing : Principles and Applications, New Jersey : John Wiley & Sons, 2005.

2. Baldock, Image Processing and Analysis : A Practical Approach, New York : Oxford University Press, 2000.

3. Basuki, Achmad, Pengolahan Citra Digital Menggunakan Visual Basic, Yogyakarta : Graha Ilmu, 2005.

4. Gonzalez, Rafael C, Digital Image Processing, New Jersey : Prentice Hall International, 2002.

5. Mann, Steve, Intelligent Image Processing, New Jersey : John Wiley & Sons, 2002.

6. Pratt, William K, Digital Image Processing, New Jersey : John Wiley & Sons, 2007.

7. Randy, Crane, A Simplified Approach To Image Processing : Classical and Modern Techniques in C, New Jersey : Prentice Hall International, 1997.