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 : rubinhut@gmail.com
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%.
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 : rubinhut@gmail.com
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%.
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
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
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
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
LAMPIRAN A
A - 1
Gambar A.1 Screen Shoot Splash Screen
A - 2
Gambar A.3 Screen Shoot Form Dialog Konverter ke Biner
A - 3
LAMPIRAN B
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; }
B - 4
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;
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) {
B - 8
B - 9
B - 10
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();
B - 12
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;
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; }
B - 15
B - 16
publicvoid setOBJECT_KELILING(paramsdouble[] _OBJECT_KELILINGx) {
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]) {
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],
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) + " %";
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) {
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),
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) {
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;
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;
B - 40
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() {
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]));
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(); }
LAMPIRAN C
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
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
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#
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 ),
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
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
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
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
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
1
Universitas Kristen Maranatha
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 ?
1.4 Tujuan
1. Membuat program penghitungan obyek dalam suatu daerah pengamatan
2
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
3
Universitas Kristen Maranatha 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
56
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,
57
Universitas Kristen Maranatha
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