Implementasi Content Based Image Retrieval Menggunakan Speeded-Up Robust Features (SURF)

(1)

A-1 Listing Program 1. MainWindow.cs using System; using System.Windows; namespace SkripsiTepe {

public partial class MainWindow : Window {

public MainWindow() {

InitializeComponent(); }

void btnstart_Click(object sender, System.Windows.RoutedEventArgs e) {

MainSearchWindow win = new MainSearchWindow(); win.Show();

}

void btnhelp_Click(object sender, RoutedEventArgs e) {

HelpWindow win2 = new HelpWindow(); win2.Show(); } } } 2. MainSearchWindow.cs using SkripsiTepe.DTOs; using SkripsiTepe.Helper; using SkripsiTepe.Indexers; using SkripsiTepe.Query; using System; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.IO; using System.Windows; using System.Windows.Controls; using System.Windows.Media.Imaging; namespace SkripsiTepe {


(2)

A-2 {

private const string host = "localhost"; public bool ExecInParallel { get; set; } public string IndexDirectory { get; set; } public string QueryImageFullPath { get; set; } public emAlgo SelectedAlgo { get; set; } private BackgroundWorker IndexBgWorker; private BackgroundWorker QueryBgWorker; private Stopwatch _stopWatch;

public MainSearchWindow() {

InitializeComponent(); }

private void frmMainSearch_Loaded(object sender, RoutedEventArgs e) {

InitIndexDirectory();

cmbAlgo.SelectedIndex = Properties.Settings.Default.SelectedAlgo; SelectedAlgo = GetSelectedAlgo();

LoadSurfSettings(); SetBackgroundWorker(); }

private void LoadSurfSettings() {

cmbSurfThreshold.SelectedIndex =

Properties.Settings.Default.SurfThresholdSelectedIndex;

cmbSurfApproach.SelectedIndex = Properties.Settings.Default.SurfAlgo; }

private void InitIndexDirectory() {

string indexDirecroty = Properties.Settings.Default.IndexFolder; if (string.IsNullOrEmpty(indexDirecroty))

{

indexDirecroty = DirectoryHelper.PictureObserverDirectory; //helper Properties.Settings.Default.IndexFolder = indexDirecroty;

}

SetIndexDirectory(indexDirecroty); }

//002

private void SetIndexDirectory(string folder) {


(3)

A-3 Properties.Settings.Default.IndexFolder = folder;

Properties.Settings.Default.Save(); }

//asynctask setting

private void SetBackgroundWorker() {

IndexBgWorker = new BackgroundWorker();

IndexBgWorker.DoWork += new DoWorkEventHandler(IndexBgWorker_DoWork); IndexBgWorker.ProgressChanged += new ProgressChangedEventHandler

(IndexBgWorker_ProgressChanged);

IndexBgWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler (IndexBgWorker_RunWorkerCompleted);

IndexBgWorker.WorkerReportsProgress = true; IndexBgWorker.WorkerSupportsCancellation = true; QueryBgWorker = new BackgroundWorker();

QueryBgWorker.DoWork += new DoWorkEventHandler(QueryBgWorker_DoWork); QueryBgWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler (QueryBgWorker_RunWorkerCompleted);

QueryBgWorker.WorkerReportsProgress = true; }

private void SaveSurfSettingValues() {

this.Dispatcher.Invoke(() => {

Properties.Settings.Default.SurfThresholdSelectedIndex = cmbSurfThreshold.SelectedIndex;

Properties.Settings.Default.SurfAlgo = cmbSurfApproach.SelectedIndex; Properties.Settings.Default.Save();

}); }

private emAlgo GetSelectedAlgo() {

emAlgo selectAlgo = emAlgo.Undetermined; if (cmbAlgo.SelectedIndex > -1)

selectAlgo = (emAlgo)cmbAlgo.SelectedIndex + 1; return selectAlgo;

}

public FileInfo[] getFiles(string SourceFolder, string Filter, System.IO.SearchOption searchOption)

{


(4)

A-4 DirectoryInfo di = new DirectoryInfo(SourceFolder);

// Create an array of filter string

string[] MultipleFilters = Filter.Split('|'); // for each filter find mathing file names foreach (string FileFilter in MultipleFilters) {

// add found file names to array list

files.AddRange(di.GetFiles(FileFilter, searchOption)); }

// returns string array of relevant file names return files.ToArray();

}

private SurfSettings GetSurfSetting() {

SurfSettings surfSetting = new SurfSettings(); this.Dispatcher.Invoke(() =>

{

surfSetting.HessianThresh = Convert.ToDouble((cmbSurfThreshold.SelectedItem as ListBoxItem).Content);

surfSetting.Algorithm = (SurfAlgo)cmbSurfApproach.SelectedIndex; });

return surfSetting; }

private void cmbAlgo_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e) {

Properties.Settings.Default.SelectedAlgo = cmbAlgo.SelectedIndex; Properties.Settings.Default.Save();

SelectedAlgo = GetSelectedAlgo(); if (SelectedAlgo == emAlgo.AccordSurf) {

var selectedIndex = cmbSurfApproach.SelectedIndex;

(cmbSurfApproach.Items[1] as ListBoxItem).Content = "kd-tree"; cmbSurfApproach.SelectedIndex = -1;

cmbSurfApproach.SelectedIndex = selectedIndex; }

}

#region Indexing Section //001 - Pilih Folder


(5)

A-5 string _folderName = IndexDirectory;

var dlg1 = new FolderBrowserDialogEx //helper {

Description = "Select a folder for the extracted files:", ShowNewFolderButton = false,

ShowEditBox = true,

SelectedPath = _folderName, ShowFullPathInEditBox = false, };

dlg1.RootFolder = System.Environment.SpecialFolder.MyComputer; System.Windows.Forms.DialogResult result = dlg1.ShowDialog(); if (result == System.Windows.Forms.DialogResult.OK)

{

SetIndexDirectory(dlg1.SelectedPath); }

}

//003

private void btnIndex_Click(object sender, RoutedEventArgs e) {

btnIndex.IsEnabled = false;

if (SelectedAlgo == emAlgo.AccordSurf) {

//Save Settings

SaveSurfSettingValues();

//Pass Surf Settings

SurfSettings surfSetting = GetSurfSetting(); IndexBgWorker.RunWorkerAsync(surfSetting); } else { IndexBgWorker.RunWorkerAsync(); } } //004

private void IndexBgWorker_DoWork(object sender, DoWorkEventArgs e) { try { WriteIndexStatus("Indexing..."); SurfSettings surfSetting; switch (SelectedAlgo)


(6)

A-6 {

case emAlgo.Undetermined:

MessageBox.Show("Please select Algorithm for indexing"); return;

case emAlgo.AccordSurf:

surfSetting = (e.Argument as SurfSettings); if (surfSetting == null)

{

MessageBox.Show("SurfSetting not supplied"); return; }; AccordSurfAlgoIndexing(surfSetting); break; default: MessageBox.Show("Pilih Algoritma"); return; } }

catch (Exception ex) { Debug.WriteLine(ex.ToString()); throw; } } //004a

private void IndexBgWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)

{

pbIndex.Value = e.ProgressPercentage + 1; }

//004b

private void IndexBgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)

{

if (e.Error != null)

MessageBox.Show(e.Error.ToString()); btnIndex.IsEnabled = true;

}

private void WriteIndexStatus(string msg) {

var txtdispatcher = lblIndexStatus.Dispatcher; if (!txtdispatcher.CheckAccess())

{


(7)

A-7 else

{

lblIndexStatus.Text = msg; }

}

//005

private void AccordSurfAlgoIndexing(SurfSettings surfSetting) {

var imageFiles = getFiles(IndexDirectory, "*.gif|*.jpg|*.png|*.bmp|*.jpeg", SearchOption.TopDirectoryOnly);

int totalFileCount = imageFiles.Length; Dispatcher.Invoke((Action)delegate {

pbIndex.Minimum = 0; pbIndex.Maximum = totalFileCount; lblIndexStatus.Text = "Indexing..";

});

if (surfSetting.Algorithm == SurfAlgo.Linear) {

SurfIndexer4 surfIndexer = new SurfIndexer4(); if (ExecInParallel)

surfIndexer.IndexFilesAsync(imageFiles, IndexBgWorker, WriteIndexStatus, surfSetting);

else

surfIndexer.IndexFiles(imageFiles, IndexBgWorker, WriteIndexStatus, surfSetting); }

}

#region Context Menu

private void brdImage_ContextMenuOpening(object sender, ContextMenuEventArgs e) {

FrameworkElement fe = e.Source as FrameworkElement; ContextMenu cm = fe.ContextMenu;

while (cm == null) {

fe = (FrameworkElement)fe.Parent; if (fe == null) break;

cm = fe.ContextMenu; }

MenuItem openSurfDetails = null; foreach (MenuItem mi in cm.Items) {

if (mi.Name == "mnuOpenSurfDetail") {


(8)

A-8 openSurfDetails = mi;

} }

if (SelectedAlgo == emAlgo.AccordSurf) {

if (openSurfDetails != null) openSurfDetails.Visibility = System.Windows.Visibility.Visible;

} else {

if (openSurfDetails != null) openSurfDetails.Visibility = System.Windows.Visibility.Collapsed;

} }

private void mnuOpenSurfDetail_Click(object sender, RoutedEventArgs e) {

string selectedObserverImage = string.Empty; string selectedModelImage = string.Empty; MenuItem mnu = sender as MenuItem; Border selectedBorder = null;

if (mnu != null) {

selectedBorder = ((ContextMenu)mnu.Parent).PlacementTarget as Border; selectedObserverImage = (string)selectedBorder.Tag;

}

selectedModelImage = QueryImageFullPath;

bool isObserverImagePathFound = !string.IsNullOrWhiteSpace(selectedObserverImage); isObserverImagePathFound = isObserverImagePathFound &&

File.Exists(selectedObserverImage);

bool isModelImagePathFound = !string.IsNullOrWhiteSpace(selectedModelImage); isModelImagePathFound = isObserverImagePathFound &&

File.Exists(selectedModelImage);

if (isObserverImagePathFound & isModelImagePathFound) {

SurfSettings surfSetting = GetSurfSetting(); if (SelectedAlgo == emAlgo.AccordSurf)

{ //pindah windows

AccordSurfWindow win = new AccordSurfWindow(selectedModelImage, selectedObserverImage, surfSetting);

win.Show(); }


(9)

A-9 }

}

private void mnuOpenPic_Click(object sender, RoutedEventArgs e) {

string selectedObserverImage = string.Empty; string selectedModelImage = string.Empty; MenuItem mnu = sender as MenuItem; Border selectedBorder = null;

if (mnu != null) {

selectedBorder = ((ContextMenu)mnu.Parent).PlacementTarget as Border; selectedObserverImage = (string)selectedBorder.Tag;

}

selectedModelImage = QueryImageFullPath;

bool isObserverImagePathFound = !string.IsNullOrWhiteSpace(selectedObserverImage); isObserverImagePathFound = isObserverImagePathFound &&

File.Exists(selectedObserverImage); if (isObserverImagePathFound) { System.Diagnostics.Process.Start(selectedObserverImage); } } #endregion //006a

#region Pilih gambar dan cari

private void btnSelectQueryImage_Click(object sender, RoutedEventArgs e) {

string queryImagePath = SelectQueryImage(); QueryImage(queryImagePath);

}

//006b

//ulangipencarian

private void btnQueryImage_Click(object sender, RoutedEventArgs e) {

QueryImage(QueryImageFullPath); }

//007

private string SelectQueryImage() {

string queryImageFilePath = string.Empty;


(10)

A-10 if (string.IsNullOrWhiteSpace(Properties.Settings.Default.QueryFolder))

{

dlg.InitialDirectory = IndexDirectory; }

else {

dlg.InitialDirectory = Properties.Settings.Default.QueryFolder; }

// Set filter for file extension and default file extension dlg.DefaultExt = ".jpg";

dlg.Filter = "JPG Files (*.jpg)|*.jpg|JPEG Files (*.jpeg)|*.jpeg|PNG Files (*.png)|*.png|JPG Files (*.jpg)|*.jpg|GIF Files (*.gif)|*.gif";

// Display OpenFileDialog by calling ShowDialog method Nullable<bool> result = dlg.ShowDialog();

// Get the selected file name and display in a TextBox if (result == true)

{

// Open document

queryImageFilePath = dlg.FileName; txtQuery.Text = queryImageFilePath; QueryImageFullPath = queryImageFilePath;

imqQuery.Source = new BitmapImage(new Uri(queryImageFilePath)); Properties.Settings.Default.QueryFolder = Path.GetDirectoryName(queryImageFilePath); Properties.Settings.Default.Save(); } return queryImageFilePath; } //009

private void QueryBgWorker_DoWork(object sender, DoWorkEventArgs e) {

this.Dispatcher.Invoke(() => {

btnSelectQueryImage.IsEnabled = false; btnQueryImage.IsEnabled = false; });


(11)

A-11 case emAlgo.AccordSurf: QueryAccordSurfAlgo(QueryImageFullPath); break; default: MessageBox.Show("Pilih Algoritma"); return; } this.Dispatcher.Invoke(() => {

btnSelectQueryImage.IsEnabled = true; btnQueryImage.IsEnabled = true; });

}

private void QueryBgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)

{

if (e.Error != null) {

MessageBox.Show(e.Error.ToString());

WriteQueryStatus("Error in querying! Couldn't query"); }

btnQueryImage.IsEnabled = true; btnSelectQueryImage.IsEnabled = true; }

//008

private void QueryImage(string queryImagePath) {

try {

ImageList.ItemsSource = null;

if (!string.IsNullOrEmpty(queryImagePath)) {

QueryImageFullPath = queryImagePath; switch (SelectedAlgo) { case emAlgo.Undetermined: MessageBox.Show("Pilih Algoritma"); return;


(12)

A-12 case emAlgo.AccordSurf: QueryBgWorker.RunWorkerAsync(); break; default: MessageBox.Show("Algoritma Error"); return; } } }

catch (Exception ex) {

MessageBox.Show(ex.ToString(), "Error", MessageBoxButton.OK, MessageBoxImage.Error);

} } //010

private void QueryAccordSurfAlgo(string queryImagePath) {

WriteQueryStatus("Retrieving..."); SaveSurfSettingValues();

//DTOs

List<ImageRecord> searchImage = new List<ImageRecord>(); SurfSettings surfSetting = GetSurfSetting();

string msg="";

if (surfSetting.Algorithm == SurfAlgo.Linear) {

//Query

SurfQuery4 surfQuery = new SurfQuery4(); _stopWatch = Stopwatch.StartNew();

searchImage = surfQuery.QueryImage(queryImagePath, out msg, surfSetting); _stopWatch.Stop();

}

msg += string.Format(" {0} ms", _stopWatch.ElapsedMilliseconds); WriteQueryStatus(msg);

this.Dispatcher.Invoke(() => {

ImageList.ItemsSource = searchImage;

lblTotalCount.Text = searchImage.Count.ToString(); });


(13)

A-13 private void WriteQueryStatus(string msg)

{

var txtdispatcher = lblQueryStatus.Dispatcher; if (!txtdispatcher.CheckAccess())

{

txtdispatcher.Invoke((Action)(() => lblQueryStatus.Text = msg)); }

else {

lblQueryStatus.Text = msg; }

}

#endregion

private int GetNumberOfImageFilesInIndexDirectory() {

FileInfo[] imageFiles = getFiles(IndexDirectory, "*.gif|*.jpg|*.png|*.bmp|*.jpeg", SearchOption.TopDirectoryOnly);

int totalFileCount = imageFiles.Length; return totalFileCount; } #endregion } } 3. SurfDetailWindow.cs using System.Windows; using System.Windows.Documents; using SkripsiTepe.DTOs; using System.Windows.Media.Imaging; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Diagnostics; using System.IO; using Gataulah; namespace SkripsiTepe { /// <summary>

/// Interaction logic for AccordSurf.xaml /// </summary>

public partial class AccordSurfWindow : Window {


(14)

A-14

Bitmap returnBitmap;

List<IPoint> ipts1 = new List<IPoint>(); List<IPoint> ipts2 = new List<IPoint>(); public string ModelImagePath { get; set; }

public string ObserverImagePath { get; set; }

public SurfSettings SurfSetting { get; set; } public AccordSurfWindow()

{

InitializeComponent(); }

public AccordSurfWindow(string modelImagePath, string observerImagePath, SurfSettings setting) : this()

{

this.ModelImagePath = modelImagePath; this.ObserverImagePath = observerImagePath; this.SurfSetting = setting;

}

private void AccordSurfCompareWin_Loaded(object sender, RoutedEventArgs e) {

ShowImage(); }

protected void ShowImage() {

bool isModelImageMissing = string.IsNullOrEmpty(ModelImagePath); bool isObserverImageMissing = string.IsNullOrEmpty(ObserverImagePath); if (isModelImageMissing || isObserverImageMissing)

return;

Bitmap compareImagebmp = CompareAndDrawImage(new Bitmap(ModelImagePath), new Bitmap(ObserverImagePath),

SurfSetting); if (compareImagebmp != null)

{

MemoryStream ms = new MemoryStream();

compareImagebmp.Save(ms, System.Drawing.Imaging.ImageFormat.Png); ms.Position = 0;

BitmapImage bi = new BitmapImage(); bi.BeginInit();

bi.StreamSource = ms; bi.EndInit();


(15)

A-15 } else { this.Close(); } }

private Bitmap CompareAndDrawImage(Bitmap modelImage, Bitmap observedImage, SurfSettings setting)

{

Stopwatch watch1 = new Stopwatch(); Stopwatch watch2 = new Stopwatch();

watch2.Start();

watch1.Reset(); watch1.Start();

double hessianThreshold = setting.HessianThresh.HasValue ? setting.HessianThresh.Value : 500;

float hessianThreshold2 = (float)hessianThreshold / 1000000;

IntegralImage iimg1 = IntegralImage.FromImage(modelImage); ipts1 = FastHessian.getIpoints(hessianThreshold2, 5, 2, iimg1);

SurfDescriptor.DecribeInterestPoints(ipts1, false, false, iimg1);

IntegralImage iimg2 = IntegralImage.FromImage(observedImage); ipts2 = FastHessian.getIpoints(hessianThreshold2, 5, 2, iimg2);

SurfDescriptor.DecribeInterestPoints(ipts2, false, false, iimg2);

watch1.Stop();

Debug.WriteLine("Surf Detection tooked {0} ms", watch1.ElapsedMilliseconds);

List<IPoint>[] matches = Utils.getMatches(ipts1, ipts2);

if (ipts1.Count < 4 || ipts2.Count< 4) {

MessageBox.Show("Error, Interest Point tidak cukup"); return null;

}

PaintSURF(modelImage,observedImage, matches);


(16)

A-16 }

private void PaintSURF(Bitmap img1, Bitmap img2, List<IPoint>[] matches) {

Bitmap bmp = new Bitmap(img1.Width + img2.Width, Math.Max(img1.Height, img2.Height));

Graphics g = Graphics.FromImage(bmp);

g.DrawImage(img1, 0, 0,img1.Width,img1.Height);

g.DrawImage(img2, img1.Width, 0,img2.Width,img2.Height);

Pen redPen = new Pen(Color.Red); Pen bluePen = new Pen(Color.Blue); Pen matchPen = new Pen(Color.Gold); Pen myPen;

int x = 0;

for (int i = 0; i < matches.Length;i++ ) {

foreach (IPoint ip in matches[i]) {

int S = 2 * Convert.ToInt32(2.5f * ip.scale); int R = Convert.ToInt32(S / 2f);

System.Drawing.Point pt = new System.Drawing.Point(Convert.ToInt32(ip.x), Convert.ToInt32(ip.y));

System.Drawing.Point ptR = new System.Drawing.Point(Convert.ToInt32(R * Math.Cos(ip.orientation)),

Convert.ToInt32(R * Math.Sin(ip.orientation)));

myPen = (ip.laplacian > 0 ? bluePen : redPen);

g.DrawEllipse(myPen, x+pt.X - R, pt.Y - R, S, S);

g.DrawLine(new Pen(Color.FromArgb(0, 255, 0)), new System.Drawing.Point(x + pt.X, pt.Y), new System.Drawing.Point(x + pt.X + ptR.X, pt.Y + ptR.Y));

}

x += img1.Width; }

for (int i = 0; i < matches[0].Count; i++) {

System.Drawing.Point pt1 = new

System.Drawing.Point(Convert.ToInt32(matches[0][i].x), Convert.ToInt32(matches[0][i].y)); System.Drawing.Point pt2 = new System.Drawing.Point(img1.Width +

Convert.ToInt32(matches[1][i].x), Convert.ToInt32(matches[1][i].y)); g.DrawLine(matchPen, pt1, pt2);


(17)

A-17 g.Dispose();

returnBitmap = bmp; } } } 4. IntegralImage.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Drawing; namespace Gataulah { [Serializable] public class IntegralImage {

const float cR = .2989f; const float cG = .5870f; const float cB = .1140f;

internal float[,] matriks; public int lebar, tinggi;

public float this[int y, int x] {

get { return matriks[y, x]; } set { matriks[y, x] = value; } }

private IntegralImage(int lebar, int tinggi) {

this.lebar = lebar; this.tinggi = tinggi;

this.matriks = new float[tinggi, lebar]; }

//01

public static IntegralImage FromImage(BitPeta image) {


(18)

A-18

float barissum = 0;

for (int x = 0; x < image.lebar; x++) {

Color c = image.GetPixel(x, 0);

barissum += (cR * c.R + cG * c.G + cB * c.B) / 255f; pic[0, x] = barissum;

}

for (int y = 1; y < image.tinggi; y++) {

barissum = 0;

for (int x = 0; x < image.lebar; x++) {

Color c = image.GetPixel(x, y);

barissum += (cR * c.R + cG * c.G + cB * c.B) / 255f;

pic[y, x] = barissum + pic[y - 1, x]; }

}

return pic; }

public float BoxIntegral(int baris, int col, int bariss, int cols) {

int r1 = Math.Min(baris, tinggi) - 1; int c1 = Math.Min(col, lebar) - 1;

int r2 = Math.Min(baris + bariss, tinggi) - 1; int c2 = Math.Min(col + cols, lebar) - 1;

float A = 0, B = 0, C = 0, D = 0;

if (r1 >= 0 && c1 >= 0) A = matriks[r1, c1]; if (r1 >= 0 && c2 >= 0) B = matriks[r1, c2]; if (r2 >= 0 && c1 >= 0) C = matriks[r2, c1]; if (r2 >= 0 && c2 >= 0) D = matriks[r2, c2];

return Math.Max(0, A - B - C + D); }

public float HaarX(int baris, int kolom, int size) {


(19)

A-19 }

public float HaarY(int baris, int kolom, int size) {

return BoxIntegral(baris, kolom - size / 2, size / 2, size)

- 1 * BoxIntegral(baris - size / 2, kolom - size / 2, size / 2, size); } } } 5. FastHessian.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using MathNet.Numerics.LinearAlgebra; namespace Gataulah { [Serializable] public class FastHessian {

private class simpananLayer {

public int lebar, tinggi, langkah, saring; public float[] simpanannya;

public byte[] laplasian;

public simpananLayer(int lebar, int tinggi, int langkah, int saring) {

this.lebar = lebar; this.tinggi = tinggi; this.langkah = langkah; this.saring = saring;

simpanannya = new float[lebar * tinggi]; laplasian = new byte[lebar * tinggi]; }

public byte getlaplasian(int baris, int kolom) {

return laplasian[baris * lebar + kolom]; }


(20)

A-20 {

int scale = this.lebar / src.lebar;

return laplasian[(scale * baris) * lebar + (scale * kolom)]; }

public float getsimpanan(int baris, int kolom) {

return simpanannya[baris * lebar + kolom]; }

public float getsimpanan(int baris, int kolom, simpananLayer src) {

int scale = this.lebar / src.lebar;

return simpanannya[(scale * baris) * lebar + (scale * kolom)]; }

}

public static List<IPoint> getIpoints(float thr, int oktaf, int init_contoh, IntegralImage img) {

FastHessian fh = new FastHessian(thr, oktaf, init_contoh, img); return fh.getIpoints();

}

public FastHessian(float thr, int oktaf, int init_contoh, IntegralImage img) {

this.thr = thr; this.oktaf = oktaf;

this.init_contoh = init_contoh; this.img = img;

}

private float thr; private int oktaf; private int init_contoh; private IntegralImage img;

private List<IPoint> ipts;

private List<simpananLayer> simpananPeta;

public List<IPoint> getIpoints() {

int [,] saring_Peta = {{0,1,2,3}, {1,3,4,5}, {3,5,6,7}, {5,7,8,9}, {7,9,10,11}};

if (ipts == null) ipts = new List<IPoint>(); else ipts.Clear();


(21)

A-21

simpananLayer b, m, t;

for (int o = 0; o < oktaf; ++o) for (int i = 0; i <= 1; ++i) {

b = simpananPeta[saring_Peta[o,i]]; m = simpananPeta[saring_Peta[o,i+1]]; t = simpananPeta[saring_Peta[o,i+2]];

for (int r = 0; r < t.tinggi; ++r) {

for (int c = 0; c < t.lebar; ++c) {

if (isExtremum(r, c, t, m, b)) {

interpolateExtremum(r, c, t, m, b); } } } } return ipts; } void buildsimpananPeta() {

if (simpananPeta == null) simpananPeta = new List<simpananLayer>(); else simpananPeta.Clear();

int w = (img.lebar / init_contoh); int h = (img.tinggi / init_contoh); int s = (init_contoh);

if (oktaf >= 1) {

simpananPeta.Add(new simpananLayer(w, h, s, 9)); simpananPeta.Add(new simpananLayer(w, h, s, 15)); simpananPeta.Add(new simpananLayer(w, h, s, 21)); simpananPeta.Add(new simpananLayer(w, h, s, 27)); }

if (oktaf >= 2) {

simpananPeta.Add(new simpananLayer(w / 2, h / 2, s * 2, 39)); simpananPeta.Add(new simpananLayer(w / 2, h / 2, s * 2, 51)); }


(22)

A-22 if (oktaf >= 3)

{

simpananPeta.Add(new simpananLayer(w / 4, h / 4, s * 4, 75)); simpananPeta.Add(new simpananLayer(w / 4, h / 4, s * 4, 99)); }

if (oktaf >= 4) {

simpananPeta.Add(new simpananLayer(w / 8, h / 8, s * 8, 147)); simpananPeta.Add(new simpananLayer(w / 8, h / 8, s * 8, 195)); }

if (oktaf >= 5) {

simpananPeta.Add(new simpananLayer(w / 16, h / 16, s * 16, 291)); simpananPeta.Add(new simpananLayer(w / 16, h / 16, s * 16, 387)); }

for (int i = 0; i < simpananPeta.Count; ++i) {

buildsimpananLayer(simpananPeta[i]); }

}

private void buildsimpananLayer(simpananLayer rl) {

int langkah = rl.langkah; int b = (rl.saring - 1) / 2; int l = rl.saring / 3; int w = rl.saring; float inverse_area = 1f / (w * w); float Dxx, Dyy, Dxy;

for (int r, c, ar = 0, index = 0; ar < rl.tinggi; ++ar) {

for (int ac = 0; ac < rl.lebar; ++ac, index++) {

r = ar * langkah; c = ac * langkah;

Dxx = img.BoxIntegral(r - l + 1, c - b, 2 * l - 1, w) - img.BoxIntegral(r - l + 1, c - l / 2, 2 * l - 1, l) * 3; Dyy = img.BoxIntegral(r - b, c - l + 1, w, 2 * l - 1) - img.BoxIntegral(r - l / 2, c - l + 1, l, 2 * l - 1) * 3; Dxy = + img.BoxIntegral(r - l, c + 1, l, l)

+ img.BoxIntegral(r + 1, c - l, l, l) - img.BoxIntegral(r - l, c - l, l, l)


(23)

A-23

Dxx *= inverse_area; Dyy *= inverse_area; Dxy *= inverse_area;

rl.simpanannya[index] = (Dxx * Dyy - 0.81f * Dxy * Dxy); rl.laplasian[index] = (byte)(Dxx + Dyy >= 0 ? 1 : 0);

} } }

bool isExtremum(int r, int c, simpananLayer t, simpananLayer m, simpananLayer b) {

int layerBorder = (t.saring + 1) / (2 * t.langkah);

if (r <= layerBorder || r >= t.tinggi - layerBorder || c <= layerBorder || c >= t.lebar - layerBorder)

return false;

float candidate = m.getsimpanan(r, c, t); if (candidate < thr)

return false;

for (int rr = -1; rr <= 1; ++rr) {

for (int cc = -1; cc <= 1; ++cc) {

if (t.getsimpanan(r + rr, c + cc) >= candidate ||

((rr != 0 || cc != 0) && m.getsimpanan(r + rr, c + cc, t) >= candidate) || b.getsimpanan(r + rr, c + cc, t) >= candidate)

{ return false; } } } return true; }

void interpolateExtremum(int r, int c, simpananLayer t, simpananLayer m, simpananLayer b) {

matriks D = matriks.Create(BuildDerivative(r, c, t, m, b)); matriks H = matriks.Create(BuildHessian(r, c, t, m, b)); matriks Hi = H.Inverse();

matriks Of = -1 * Hi * D;


(24)

A-24 int saringlangkah = (m.saring - b.saring);

if (Math.Abs(O[0]) < 0.5f && Math.Abs(O[1]) < 0.5f && Math.Abs(O[2]) < 0.5f) {

IPoint ipt = new IPoint();

ipt.x = (float)((c + O[0]) * t.langkah); ipt.y = (float)((r + O[1]) * t.langkah);

ipt.scale = (float)((0.1333f) * (m.saring + O[2] * saringlangkah)); ipt.laplasian = (int)(m.getlaplasian(r,c,t));

ipts.Add(ipt); }

}

private double[,] BuildDerivative(int r, int c, simpananLayer t, simpananLayer m, simpananLayer b)

{

double dx, dy, ds;

dx = (m.getsimpanan(r, c + 1, t) - m.getsimpanan(r, c - 1, t)) / 2f; dy = (m.getsimpanan(r + 1, c, t) - m.getsimpanan(r - 1, c, t)) / 2f; ds = (t.getsimpanan(r, c) - b.getsimpanan(r, c, t)) / 2f;

double[,] D = { { dx }, { dy }, { ds } }; return D;

}

private double[,] BuildHessian(int r, int c, simpananLayer t, simpananLayer m, simpananLayer b)

{

double v, dxx, dyy, dss, dxy, dxs, dys;

v = m.getsimpanan(r, c, t);

dxx = m.getsimpanan(r, c + 1, t) + m.getsimpanan(r, c - 1, t) - 2 * v; dyy = m.getsimpanan(r + 1, c, t) + m.getsimpanan(r - 1, c, t) - 2 * v; dss = t.getsimpanan(r, c) + b.getsimpanan(r, c, t) - 2 * v;

dxy = (m.getsimpanan(r + 1, c + 1, t) - m.getsimpanan(r + 1, c - 1, t) - m.getsimpanan(r - 1, c + 1, t) + m.getsimpanan(r - 1, c - 1, t)) / 4f; dxs = (t.getsimpanan(r, c + 1) - t.getsimpanan(r, c - 1) -

b.getsimpanan(r, c + 1, t) + b.getsimpanan(r, c - 1, t)) / 4f; dys = (t.getsimpanan(r + 1, c) - t.getsimpanan(r - 1, c) -

b.getsimpanan(r + 1, c, t) + b.getsimpanan(r - 1, c, t)) / 4f;

double[,] H = new double[3, 3]; H[0, 0] = dxx;

H[0, 1] = dxy; H[0, 2] = dxs;


(25)

A-25 H[1, 1] = dyy;

H[1, 2] = dys; H[2, 0] = dxs; H[2, 1] = dys; H[2, 2] = dss; return H; } } } 6. EuclideanDistance.cs using System; using System.Collections.Generic; using System.Text; namespace Gataulah {

public class Utils {

private const float FLT_MAX = 3.402823466e+38F;

public static List<IPoint>[] getMatches(List<IPoint> ipts1, List<IPoint> ipts2) {

double dist; double d1, d2;

IPoint match = new IPoint();

List<IPoint>[] matches = new List<IPoint>[2]; matches[0] = new List<IPoint>();

matches[1] = new List<IPoint>();

for (int i = 0; i < ipts1.Count; i++) {

d1 = d2 = FLT_MAX;

for (int j = 0; j < ipts2.Count; j++) {

dist = EuclideanDistance(ipts1[i], ipts2[j]);

if (dist < d1) {

d2 = d1; d1 = dist;


(26)

A-26 }

else if (dist < d2) {

d2 = dist; }

}

if (d1 / d2 < 0.77) { matches[0].Add(ipts1[i]); matches[1].Add(match); } } return matches; }

public static double EuclideanDistance(IPoint ip1, IPoint ip2) {

int count = 0;

double sum = 0.0;

count = ip1.descriptor.Length;

for (int i = 0; i < count; i++) {

sum += Math.Pow(Math.Abs(ip1.descriptor[i] - ip2.descriptor[i]), 2); } return Math.Sqrt(sum); } } }


(27)

B-1

CURRICULUM VITAE

Nama : Aulia Tarindah Putri

Alamat Sekarang : Jln. Gn. Leuser Blok A3 No.31 Tebing Tinggi Alamat Orang Tua : Jln. Gn. Leuser Blok A3 No.31 Tebing Tinggi Telp/ Hp : +6282366661549

Email : auliatarindahputri@gmail.com

Riwayat Pendidikan

2012 – 2016 : S1 Ilmu Komputer Universitas Sumatera Utara, Medan 2009 – 2012 : SMA Negeri 1 Tebing Tinggi

2006 – 2009 : SMP Negeri 1 Tebing Tinggi 2000 – 2006 : SD R.A. Kartini Sei Rampah

Keahlian

Bahasa : Indonesia, Inggris Pemrograman : C#, Java Android

Database : MySql

Desain : Photoshop, Corel Draw Perkantoran : Microsoft Office

Kursus yang diikuti TOEFL, IELTS

Pengalaman Organisasi

[2006 – 2008] Pramuka SMP Negeri 1 [2010 – 2012] OSIS SMA Negeri 1 [2013 – 2016] Pengajar IKLC 2013 - 2016


(28)

B-2

[2013– 2015] Imilkom USU

[2014– 2015] PEMA Fasilkom-TI USU

Pengalaman Kepanitiaan

[2012] Sekretaris Dies Natalis IMILKOM 2012

[2015] Ketua Panitia Seminar Karir PT. Paragon - Wardah

Seminar


(29)

C-1


(30)

C-2


(31)

C-3


(32)

C-4


(33)

C-5


(34)

101

DAFTAR PUSTAKA

Bay, H, Ess A, Tuytelaars, T, Van Gool, L. 2006. SURF: Speeded Up Robust Features. Proceedings of the 9th European Conference on Computer Vision 3951 (1) : 404 – 417.

Devireddy, S.K. 2009. Content Based Image Retrieval. Georgian Electronic Scientific Journal : Computer Science and Telecommunications 2009 22(5). (Online)

http://gesj.internet-academy.org.ge/gesj_articles/1464.pdf(30 November 2015)

IEEE. 1998. Recommended Practice for Software Requirements Specifications – IEEE Std 830. Institute of Electrical and Electronics Engineering, Inc. Kadir, A., Nugroho, L.E, Susanto, A & Santosa. 2011. Leaf Classification Using

Shape, Color, and Texture Features. International Journal of Computer Applications 29 (9) : 15-22.

Kadir, A. & Susanto, A. 2013. Teori dan Aplikasi Pengolahan Citra. ANDI : Yogyakarta.

Long, F., Zhang, H., & Feng, D. D. 2003. Fundamentals of Content Based Image Retrieval, Technological Fundamentals and Applications. NewYork: Springer- Verlag

Lowe, D. G. 1999. Object recognition from local scale-invariant features. Proceeding of the International Conference on Computer Vision.

Manning, C. dkk. 2008. An Introduction to Information Retrieval. Cambridge. Cambridge University Press : England.

Pardede, J. 2013. Implementasi Metode Generalized Vector Space Model pada Aplikasi Information Retrieval. Skripsi. Teknik Informatika Institut Teknologi Bandung : Bandung.

Putra, D. 2010. Pengolahan Citra Digital. ANDI : Yogyakarta

Stegmann, M.B. & Gomez, D.D. 2002. A Brief Introduction to Statistical Shape Analysis (Online) http://www2.imm.dtu.dk/pubdb/views/edoc_download.php /403/pdf/imm403.pdf (15 Desember 2015)

Sutoyo, T. & Mulyanto, E. 2009. Teori Pengolahan Citra Digital. ANDI :Yogyakarta.


(35)

102

Setiawan, A.E., 2015. Perbandingan Content Based Image Retrieval dengan Fitur Warna Menggunakan Metode Colour Histogram dan Fitur Tekstur Menggunakan Metode Grey Level Co-Occurrence Matrices. Skripsi.Universitas Sumatera Utara

Tania, K.D. 2010. Pengenalan Gambar Menggunakan Sebagian Data Gambar. Skripsi. Universitas Sriwijaya

Tuceryan, M. & Jain, A.K. 1998. Texture Analysis Handbook of Pattern Recognition and Computer Vision. World Scientific Computing Co.

Ulum, M.F. 2013. Ekstraksi Titik-Titik Fitur Pada Citra Menggunakan Speeded Up Robust Features (SURF) . Skripsi. Universitas Muhammadiyah Jember. Utami, A.S. 2011. Perancangan Perangkat Lunak Sistem Temu Balik Citra

Menggunakan Jarak Histogram Dengan Model Warna YIQ. Skripsi. Universitas Sumatera Utara.

Zhang, Y. 2002. On the use of CBIR in Image Mosaic Generation. (Online). http://webdocs.cs.ualberta.ca/~zaiane/postscript/thesis/YueZhang2002.pdf (20 Oktober 2015)


(36)

17

BAB 3

ANALISIS DAN PERANCANGAN SISTEM

3.1 Analisis Sistem

Tahapan ini dilakukan untuk menjelaskan permasalahan yang menjadi dasar dalam proses perancangan model sistem sehingga diperoleh pemahaman akan kebutuhan serta tugas dasar yang akan dikerjakan oleh sistem sebagai solusi terhadap permasalahan yang dihadapi tersebut.

3.1.1 Analisis Masalah

Permasalahan yang akan diangkat dari penelitian ini adalah bagaimana menemukan kembali (retrieve) konten gambar ataupun citra yang diinginkan dengan menggunakan Algoritma Speeded-Up Robust Featuress (SURF).

Pada penelitian ini, citra yang dicari merupakan citra digital dalam format .bmp maupun .jpg dan terdiri dari 100 gambar yang terbagi atas 10 kategori. Selanjutnya, koleksi citra akan diproses untuk memperoleh ekstraksi ciri dari tiap citra dan dibandingkan dengan citra query (citra yang akan dicari) menggunakan perbandingan jarak Euclidean Distance. Semakin pendek jarak antara citra koleksi dengan citra query maka semakin tinggi tingkat kemiripan antara kedua citra. Berdasarkan jarak citra yang diperoleh, setelah itu akan dilakukan proses ranking untuk menampilkan hasil temu balik citra dengan tingkat kemiripan paling tinggi ke paling rendah.

Untuk mengidentifikasi masalah digunakan diagram Ishikawa. Diagram Ishikawa adalah sebuah alat grafis yang digunakan untuk mengidentifikasi


(37)

18

mengeksplorasi dan menggambarkan suatu masalah serta sebab-akibat atau disebut juga diagram tulang ikan.

Berikut adalah diagram Ishikawa pada Gambar 3.1.

Gambar 3.1 Diagram Ishikawa

Diagram diatas terbagi atas 2 (dua) bagian yaitu head dan bone. Bone terdiri dari 4 aspek yaitu material, metode, manusia dan mesin. Material adalah apa saja yang diperlukan dalam menjalankan sistem yaitu citra grayscale dengan format .bmp. dan .jpg. Metode adalah kebutuhan yang spesifik dari proses yang terdiri dari 2 (dua) bagian. Pertama berupa algoritma ekstraksi ciri yaitu Speeded-Up Robust Features serta metode untuk mencari jarak antara koleksi citra dengan citra yang akan dicari yaitu Euclidean Distance. Manusia adalah pengguna yang melakukan proses interaksi dengan sistem, yaitu menentukan citra koleksi dan citra yang akan dicari. Mesin adalah apa saja yang dilakukan oleh sistem guna memberikan solusi permasalahan yaitu ekstraksi ciri koleksi citra, membandingkan jarak citra certa menampilkan hasil temu balik citra.

Material Mesin Manusia Metode Temu Balik Citra (Content Based Image Retrieval) dengan Algoritma Speeded-Up Robust Features (SURF) Citra (.bmp, .jpg)

Speeded-Up Robust Features Euclidean Distance

Menentukan Koleksi Citra Menentukan Citra yang dicari

Ekstraksi ciri koleksi citra Membandingkan jarak citra

Menampilkan hasil temu balik citra


(38)

19

3.1.2 Analisis Kebutuhan

Terdapat dua bagian pada analisis kebutuhan, yaitu kebutuhan fungsional dan kebutuhan non-fungsional.

3.1.2.1 Kebutuhan Fungsional

Kebutuhan fungsional sistem terdiri dari:

1. Jenis file citra asli yang digunakan adalah grayscale berformat *.bmp dan .jpg 2. Maksimal sample citra yang digunakan berjumlah 100 citra.

3. Diuji oleh 10 pengguna dan tiap pengguna memilih 1 kategori gambar yang akan dicari dari 10 kategori gambar, Kategori gambar terdiri dari gambar rumah, kupu-kupu sayap terbuka, kupu-kupu sayap tertutup, panda, gedung, bus, burung, tangan, bentuk hati dan pisang.

4. Penelitian terhadap SURF mempertimbangkan faktor rotasi dan resize. 5. Parameter yang digunakan untuk menguji hasil temu balik citra adalah

running time atau waktu proses dan tingkat keberhasilan CBIR menggunakan metode recall dan precision.

6. Metode pengukuran kemiripan yang digunakan adalah Euclidean Distance. 7. Bahasa pemograman yang digunakan adalah C#.

3.1.2.2 Kebutuhan Non-Fungsional

Kebutuhan non-fungsional adalah kebutuhan yang berisi kinerja operasional dan performance dari suatu sistem. (IEEE, 1998) . Berdasarkan IEEE, Terdapat beberapa kebutuhan non-fungsional yang harus dipenuhi diantaranya :

1. Performa

Sistem atau perangkat lunak yang akan dibangun harus dapat menunjukkan hasil yang baik dalam proses temu balik citra.


(39)

20

2. Interface yang baik

Sistem yang akan dibangun harus memiliki interface yang user friendly, artinya sistem ini akan mudah digunakan serta dimengerti oleh user.

3. Hemat Biaya

Sistem yang digunakan tidak memerlukan perangkat tambahan yang memerlukan biaya.

4. Manajemen Kualitas

Sistem atau perangkat lunak yang akan dibangun harus memiliki kualitas yaitu memiliki hasil recall dan precision yang cukup baik serta dapat menghitung nilai running time terhadap proses temu balik citra relevan.

3.1.3 Analisis Proses

Sistem ini memiliki 2 proses, yaitu proses implementasi algoritma Speeded-Up Robust Features untuk ekstraksi ciri dari koleksi citra dan proses perhitungan jarak antar citra dengan Euclidean Distance.

3.2 Pemodelan

Pada bagian ini digunakan Unified Modeling Languange (UML) sebagai bahasa spesifikasi standar suatu model yang berfungsi untuk membantu merancang sistem. Beberapa jenis UML yang digunakan dalam penelitian ini yaitu use case diagram, sequence diagram dan activity diagram.

3.2.1 Preprocessing

Preprocessing adalah proses pengolahan data masukan sebelum data tersebut melalui proses tahapan utama pada suatu sistem. Preprocessing bertujuan untuk memperoleh data yang sesuai dengan kebutuhan.


(40)

21

3.2.1.1 Konversi citra RGB ke Grayscale dan .bmp

Gambar 3.2 Diagram Preprocessing Konversi Citra RGB ke Grayscale

3.2.1. Use Case Diagram

Use case diagram adalah rangkaian sekelompok yang saling terkait dan membentuk sistem secara teratur yang dilakukan oleh seorang aktor. Use case diagram biasanya menggambarkan proses sistem yaitu kebutuhan sistem dari sudut pandang user. Berikut use case diagram dapat dilihat pada Gambar 3.2.

Konversi RGB ke Grayscale dan .bmp

(function)

Sistem melakukan proses ekstraksi ciri seluruh citra

dengan SURF

Sistem mencari citra relevan dengan membandingkan hasil Euclidean Distance Input citra RGB

oleh pengguna

Input citra RGB yang akan dicari pengguna

Sistem mengeluarkan hasil citra relevan


(41)

22

Gambar 3.3 Use Case Diagram

3.2.1.1. Use Case Mencari Citra Relevan

Spesifikasi use case mencari citra relevan dapat dilihat pada Tabel 3.1.

Tabel 3.1 Spesifikasi Use Case Mencari Citra Relevan Name Mencari Citra Relevan

Actors Pengguna

Trigger Pengguna memilih menu Mencari Citra Relevan Preconditions Pengguna mengakses menu Mencari Citra Relevan Post Conditions Sistem akan menampilkan 2 menu pilihan yaitu

pilihan ekstraksi ciri dari koleksi citra dengan menggunakan Speeded-Up Robust Features serta pilihan untuk menampilkan hasil citra relevan dengan


(42)

23

membandingkan kemiripan citra menggunakan Euclidean Distance.

Success Scenario 1. Pengguna mengeksekusi menu Menampilkan Citra Relevan

2. Sistem akan menampilkan halaman Menampilkan Citra Relevan.

3. Pengguna memilih 2 pilihan menu yaitu ekstraksi ciri citra dengan Speeded-Up Robust Features atau membandingkan kemiripan citra dengan Euclidean Distance

Alternative Flows -

3.2.1.2. Use Case Ekstraksi Ciri Citra dengan Speeded-Up Robust Features Spesifikasi use case Ekstraksi Ciri Citra dengan Speeded-Up Robust Features dapat dilihat pada Tabel 3.2.

Tabel 3.2 Spesifikasi Use Case Ekstraksi Ciri Citra dengan Speeded-Up Robust Features

Name Ekstraksi Ciri Citra dengan Speeded-Up Robust Features

Actors Pengguna

Trigger Pengguna memilih menu Mencari Citra Relevan. Preconditions Pengguna mengakses menu Ekstraksi Ciri Citra

dengan Speeded-Up Robust Features

Post Conditions Sistem akan menampilkan komponen yang ada di halaman Ekstraksi Ciri Citra dengan Speeded-Up Robust Features.

Success Scenario 1. Penguna telah memilih Ekstraksi Ciri Citra dengan Speeded-Up Robust Features


(43)

24

3. Pengguna menekan tombol mulai ekstraksi ciri 4. Sistem akan melakukan proses ektraksi ciri

terhadap koleksi citra ( melakukan deteksi dan deskripsi terhadap Interest Point ) serta

menampilkan running time. Alternative Flows -

3.2.1.3. Use Case Membandingkan Kemiripan dengan Euclidean Distance. Spesifikasi use case Membandingkan Kemiripan dengan Euclidean Distance dapat dilihat pada Tabel 3.3.

Tabel 3.3 Spesifikasi Use Case Membandingkan Kemiripan dengan

Euclidean Distance

Name Membandingkan Kemiripan dengan Euclidean Distance

Actors Pengguna

Trigger Pengguna memilih menu Menampilkan Citra Relevan.

Preconditions Pengguna mengakses menu Membandingkan Kemiripan dengan Euclidean Distance.

Post Conditions Sistem akan menampilkan komponen yang ada di halaman Membandingkan Kemiripan dengan Euclidean Distance.

Success Scenario 1. Penguna telah memilih Membandingkan Kemiripan dengan Euclidean Distance. 2. Pengguna menentukan citra yang akan dicari. 3. Pengguna menekan tombol mulai pencarian citra. 4. Sistem akan melakukan proses perhitungan jarak

antara citra yang dicari dengan koleksi citra menggunakan Euclidean Distance dan


(44)

25

Alternative Flows -

3.2.2. Activity Diagram

Activity diagram adalah diagram aktivitas yang mendeskripsikan proses kerja dalam sebuah sistem yang sedang berjalan. Activity diagram bertujuan untuk membantu memahami keseluruhan proses dan menggambarkan interaksi use case.

Activity diagram dapat dilihat pada Gambar 3.3


(45)

26

3.2.3. Sequence Diagram

Sequence diagram merupakan suatu diagram yang menampilkan interaksi-interkasi yang ada pada sistem secara berurutan. Sequence diagram sistem dapat dilihat pada Gambar 3.4.


(46)

27

3.3 Perancangan Sistem 3.3.1 Flowchart Sistem

Gambar 3.6 Flowchart Sistem Keterangan :

1. Mulai

2. Pengguna menentukan / input folder koleksi citra

3. Ubah citra asli ke dalam grayscale dan .bmp serta lakukan proses ekstraksi ciri citra. Deteksi Interest / Key Point dari koleksi citra

4. Lakukan proses Descriptor, deskripsikan atau ekstraksi fitur dari seluruh citra dan simpan ke dalam .bin


(47)

28

6. Lakukan proses Similiarity Comparison, bandingkan deskripsi fitur dari tiap citra dan hitung kemiripan antar fitur citra dengan menghitung jarak citra menggunakan Euclidean Distance.

7. Tampilkan hasil temu balik citra, urutkan dan tampilkan gambar yang memiliki fitur relevan serta running time.

8. Selesai

3.3.2 Perancangan Antarmuka Sistem (Interface)

Perancangan antarmuka digunakan untuk menampilkan antarmuka sistem yang akan digunakan oleh pengguna.

3.3.2.1 Halaman Awal

Halaman awal merupakan halaman yang pertama kali muncul pada saat sistem dijalankan. rancangan halaman awal dapat dilihat pada Gambar 3.6.


(48)

29

Tabel 3.4 Keterangan Gambar Rancangan Interface Halaman Awal

No Keterangan

1 Merupakan Label untuk udul Skripsi 2 Merupakan Label untuk Nama dan NIM

3 Merupakan Picture Box untuk Logo Unviersitas

4 Merupakan Label untuk Program Studi dan Universitas

5 Merupakan Button untuk Menampilkan Halaman Mulai Pencarian Citra 6 Merupakan Button untuk Menampilkan Halaman Bantuan

3.3.2.2 Halaman Menu Pencarian Citra Relevan

rancangan menu pencarian citra relevan dapat dilihat pada Gambar 3.7 berikut :


(49)

30

Tabel 3.5 Keterangan Gambar Rancangan Interface Halaman Pencarian Citra Relevan

No Keterangan

1 Merupakan Label untuk Informasi Folder Koleksi Citra 2 Merupakan Progress Bar untuk Proses Ekstraksi Ciri

3 Merupakan Label untuk Menampilkan Running Time Ekstraksi Ciri 4 Merupakan Combo Box untuk Menentukan Nilai Threshold

5 Merupakan Picture Box untuk Menampilkan Citra-Citra Relevan 6 Merupakan Button untuk Memilih Folder Koleksi Citra

7 Merupakan Button untuk Memulai Ekstraksi Ciri dari Koleksi Citra 8 Merupakan Label untuk Menampilkan Running Time Pencarian Citra 9 Merupakan Label untuk Menampilkan Info Citra Yang Dicari

10 Merupakan Button untuk Memilih Citra Yang Akan Dicari

11 Merupakan Button untuk Mengulang Pencarian Dengan Citra Yang Sama 12 Merupakan Picture Box untuk Menampilkan Citra Yang Akan Dicari 13 Merupakan Label untuk Menampilkan Jumlah Citra Relevan

14 Merupakan Scroll Tool untuk Menampilkan Hasil Lengkap Citra Relevan

3.3.2.3 Halaman Menu Bantuan

rancangan halaman Menu Bantuan dapat dilihat pada Gambar 3.8 berikut :


(50)

31

Tabel 3.6 Keterangan Gambar Rancangan Interface Menu Bantuan

No Keterangan

1 Merupakan Picture Box untuk Screenshot Sistem


(51)

32

BAB 4

IMPLEMENTASI DAN PENGUJIAN

4.1 Implementasi

Implementasi sistem merupakan lanjutan dari tahap analisis dan perancangan sistem. Sistem ini dibangun dengan menggunakan bahasa pemrograman C# dan menggunakan Sharp Develop.

4.1.1 Halaman Awal

Interface halaman awal dapat dilihat pada gambar 4.1.


(52)

33

Halaman awal sistem terdiri dari informasi judul dan data diri pembuat sistem serta dua button. Button yang pertama digunakan untuk membuka halaman pencarian serta yang kedua digunakan untuk membuka halaman bantuan.

4.1.2 Halaman Pencarian Citra Relevan

Interface Halaman Pencarian Citra Relevan dapat dilihat pada Gambar 4.2 . Halaman pencarian terdiri dari 4 bagian utama, yaitu bagian indexing, bagian pemilihan image query, bagian hasil citra relevan dan bagian detail similarity comparison.

Gambar 4.2 Halaman Pencarian Citra Relevan

Untuk memilih folder koleksi citra dan memulai proses ektraksi ciri citra dapat dilakukan dengan menekan button “Pilih Folder” lalu “Mulai Indexing” sehingga proses ekstraksi ciri citra akan berlangsung dan progress bar akan menampilkan status proses tersebut. Ketika proses ekstraksi selesai, running time ekstraksi ciri akan ditampilkan. Namun, jika pengguna hanya ingin menggunakan database hasil koleksi citra yang telah diekstraksi sebelumnya, button yang perlu ditekan adalah “Gunakan Data Yang Tersedia”. Ketika sukses memilih database sebelumnya, akan muncul message box sebagai pemberitahuan. hal ini untuk meningkatkan efisiensi dan menghemat waktu. Seperti yang dapat dilihat pada Area - 1 atau Gambar 4.3.


(53)

34

Gambar 4.3. Halaman Pencarian Citra Relevan - Area 1

Untuk memilih citra yang akan dicari dan memulai proses pencarian citra dan penghitungan kemiripan citra dengan Euclidean Distance dapat dilakukan pada Area - 2 seperti pada Gambar 4.4. Button “Pilih Gambar dan Cari” akan membuka dialog dan pengguna dibebaskan untuk memilih gambar yang akan dijadikan query. Button “Ulangi Pencarian” akan melakukan proses pencarian ulang menggunakan gambar yang telah dipilih sebelumnya.


(54)

35

Hasil pencarian citra relevan ditampilkan pada Area - 3 seperti pada Gambar 4.5. Citra relevan akan diurutkan / ranking berdasarkan persentase tingkat kemiripan antara citra query dengan database koleksi citra.

Gambar 4.5 Halaman Pencarian Citra Relevan - Area 3

Hasil pencarian citra relevan secara detail ditampilkan pada Area - 4 seperti pada Gambar 4.6. Interest Point / Keypoint yang cocok antara citra query dengan citra dari koleksi database akan dihubungkan menggunakan garis berwarna kuning. Orientasi titik interest akan ditampilkan menggunakan garis berwarna hijau. Serta nilai interest point yang memiliki nilai hasil laplasian akan diwarnai dengan lingkaran biru dan merah.


(55)

36

4.1.3 Halaman Bantuan

Halaman menu bantuan merupakan halaman yang menjelaskan cara-cara dalam menggunakan sistem ini. Gambar 4.7 di bawah ini menunjukkan halaman menu bantuan.

Gambar 4.7. Halaman Bantuan 4.1.4 Penjelasan

Seluruh citra yang dipilih akan memasuki proses preprocessing terlebih dahulu. Gambar berformat .jpg akan dikonversi menjadi .bmp, serta citra RGB akan dikonversi menjadi citra Grayscale berskala 0 hingga 1 dengan gradiasi dari warna hitam ke abu-abu serta mendekati putih. Seperti pada gambar 4.8.


(56)

37

Langkah selanjutnya adalah proses deteksi interest point / keypoint dari seluruh koleksi citra. Pada algoritma SURF menggunakan proses filtering berkala menggunakan Scale-Space serta Hessian Matrix dan LoG yang diilustrasikan dengan menggunakan image pyramid. Sehingga pixel citra yang dimasukkan dapat bervariasi. Seperti pada gambar 4.9 dan 4.10.

Gambar 4.9. Proses Scale-Space

Gambar 4.10. Ilustrasi Proses Scale-Space dengan Filtering Berkala Menghitung integral image menggunakan rumus berikut :

∑ , = ∑

≤ =

∑ , ≤


(57)

38

∑ , = ∑ = + − +

≤ = Serta diilustrasikan pada gambar 4.11

Gambar 4.11. Ilustrasi Integral Image

Hasil detektor interest point dimasukkan atau dideskripsikan ke dalam vektor berdimensi 4 menggunakan Haar Wavelet .

� = ∑ , ∑ , ∑ | | , ∑ | |

Lalu dilakukan perbandingan kemiripan citra atau similarity comparison menggunakan perhitungan jarak Euclidean Distance menggunakan persamaan :

, = √∑� −

=

Misalnya terdapat citra yang telah diproses dan dimasukkan ke dalam vektor berdimensi 3, diketahui vektor v1 dan v2 pada deskriptor berdimensi tiga sebagai berikut:

q= {1,2,3 } p= {4,5,6 }


(58)

39

Dilakukan perhitungan jarak antara dua citra menggunakan persamaan Euclidean Distance.

, = √∑� − + − +

=

, = √∑� − + − + −

=

, = √∑� + +

=

, = √∑ 9 + 9 + 9�

=

, = . 9

Maka diperoleh bahwa jarak antara dua citra adalah 5.196. Semakin kecil jarak antara dua citra maka semakin mirip kedua citra tersebut dan sebaliknya.

Setelah itu dilakukan proses ranking berdasarkan presentase kemiripan citra dari hasil Euclidean Distance tersebut. Interest Point yang mirip dimasukkan ke dalam list Match Point. Dan citra relevan akan ditampilkan setelah diurutkan presentase kemiripan secara Descending.

Proses ranking similarity comparison dilakukan dengan rumus :


(59)

40

Tabel 4.1 Proses Ranking 10 Citra

Ranking Nama File Model Feature Match Point Match Precentage

1 Rotasi1.jpg 53 53 100 %

2 Rotasi6.jpg 53 40 75 %

3 Rotasi3.jpg 53 35 66 %

4 Rotasi8.jpg 53 35 66 %

5 Rotasi9.jpg 53 30 57 %

6 Rotasi10.jpg 53 18 34 %

7 Rotasi5.jpg 53 12 23 %

8 Rotasi4.jpg 53 10 19 %

9 Rotasi2.jpg 53 9 17 %

10 Rotasi7.jpg 53 6 11 %

Proses ranking pada tabel 4.1 dilakukan dengan menguji coba citra Rotasi1.jpg dan membandingkannya dengan 20 koleksi citra ( 10 citra uji rotasi dan 10 citra uji skala ) . Ketika proses perbandingan kemiripan antara citra dilakukan sistem menghitung jarak antar citra serta jumlah features yang mirip pada citra query dengan koleksi citra lalu mengurutkan secara descending atau dari kemiripan dengan persentase terbesar hingga terkecil.


(60)

41

Gambar 4.12. Diagram Sistem CBIR dengan SURF

Efisiensi pada sistem CBIR yang telah dirancang ditingkatkan dengan cara melakukan ekstraksi fitur seluruh koleksi citra ke dalam vektor serta memasukkan vektor tersebut ke dalam database. Ketika proses perbandingan antara citra dilakukan, sistem cukup memanggil vektor dalam database yang telah diproses sebelumnya dan membandingkannya dengan citra query atau citra yang akan dicari. Lalu hasil perbandingan diurutkan dari citra relevan yang memiliki kemiripan paling tinggi ke paling rendah.

4.2 Pengujian

Pengujian sistem merupakan tahap lanjutan setelah implementasi sistem. Pengujian sistem bertujuan untuk membuktikan sistem yang dibangun telah berjalan dengan baik. Pengujian sistem ini dilakukan pada citra RGB yang telah dikonversi menjadi grayscale.


(61)

42

4.2.1 Pengujian Proses Pencarian Citra Relevan

Untuk melakukan pengujian terhadap proses pencarian citra relevan menggunakan algoritma Speeded-Up Robust Features (SURF) dan perbandingan kemiripan antara citra menggunakan Euclidean Distance. Threshold yang digunakan bernilai 100 serta akan digunakan 100 citra yang terdiri dari 10 kategori. Kategori terdiri dari :

1. Burung Flamingo 6. Kupu-Kupu Sayap Terbuka

2. Bus 7. Gedung Monas

3. Kupu-Kupu Sayap Tertutup 8. Panda

4. Tangan 9. Pisang

5. Hati 10. Rumah


(62)

43


(63)

44


(64)

45


(65)

46


(66)

47


(67)

48


(68)

49


(69)

50


(70)

51


(71)

52


(72)

53

4.2.2 Pengujian Pengaruh Rotasi

Untuk melakukan pengujian terhadap ketahanan Algoritma Speeded-Up Robust Features (SURF) terhadap rotasi maka dilakukan pengujian terhadap citra "kategori 9 - pisang" yang telah diberikan perubahan arah / rotasi.


(73)

54

4.2.3 Pengujian Pengaruh Skala

Untuk melakukan pengujian terhadap ketahanan Algoritma Speeded-Up Robust Features (SURF) terhadap skala maka dilakukan pengujian terhadap citra "kategori 8 - panda" yang telah diberikan perubahan skala.


(74)

55

4.3 Hasil Pengujian

Pengujian terhadap 100 Citra yang terdiri dari 10 Kategori dilakukan oleh 10 Pengguna. Setiap pengguna memilih 1 Citra sebagai Citra Query dan menggunakan nilai 1000 untuk threshold. Sistem akan menampilkan citra yang relevan dengan citra query / citra yang dicari. Sehingga pengguna dapat melihat hasil temu balik citra yang relevan serta menilai kualitas citra berdasarkan jumlah citra relevan maupun jumlah seluruh citra yang dikembalikan.

4.3.1 Hasil Pengujian Proses Pencarian Citra Relevan 4.3.1.1 Hasil Pengujian Kategori 1

Kategori 1 atau Burung Flamingo menggunakan citra bird1.jpg sebagai citra query. Hasil pengujian proses pencarian citra relevan dari kategori 1 dapat dilihat pada Gambar 4.13 hingga 4.17


(75)

56

Gambar 4.14. Pencarian Citra Relevan Kategori 1 - 2


(76)

57

Gambar 4.16. Pencarian Citra Relevan Kategori 1 - 4


(77)

58

4.3.1.2 Hasil Pengujian Kategori 2

Kategori 2 atau Bus menggunakan citra bus3.jpg sebagai citra query. Hasil pengujian proses pencarian citra relevan dari kategori 2 dapat dilihat pada Gambar 4.18 hingga 4.20

Gambar 4.18. Pencarian Citra Relevan Kategori 2 – 1

Dengan masukkan citra query “bus3.jpg”, sistem mengembalikan 26 citra dari 100 citra.


(78)

59

Gambar 4.20. Pencarian Citra Relevan Kategori 2 – 3 4.3.1.3 Hasil Pengujian Kategori 3

Kategori 3 atau Kupu-Kupu Sayap Tertutup menggunakan citra close1.jpg sebagai citra query. Hasil pengujian proses pencarian citra relevan dari kategori 2 dapat dilihat pada Gambar 4.21 hingga 4.23


(79)

60

Gambar 4.22. Pencarian Citra Relevan Kategori 3 - 2


(80)

61

4.3.1.4 Hasil Pengujian Kategori 4

Kategori 4 atau Bentuk Tangan menggunakan citra hand5.jpg sebagai citra query. Hasil pengujian proses pencarian citra relevan dari kategori 4 dapat dilihat pada Gambar 4.24 hingga 4.29

Gambar 4.24. Pencarian Citra Relevan Kategori 4 - 1

Dengan masukkan citra query “hand5.jpg”, sistem mengembalikan 66 citra dari 100 citra.


(81)

62

Gambar 4.26. Pencarian Citra Relevan Kategori 4 - 3


(82)

63

Gambar 4.28. Pencarian Citra Relevan Kategori 4 - 5


(83)

64

4.3.1.5 Hasil Pengujian Kategori 5

Kategori 5 atau Bentuk Hati menggunakan citra hati1.png sebagai citra query. Hasil pengujian proses pencarian citra relevan dari kategori 5 dapat dilihat pada Gambar 4.30 hingga 4.32

Gambar 4.30. Pencarian Citra Relevan Kategori 5 – 1

Dengan masukkan citra query “hati1.jpg”, sistem mengembalikan 32 citra dari 100 citra.


(84)

65

Gambar 4.32. Pencarian Citra Relevan Kategori 5 - 3

4.3.1.6 Hasil Pengujian Kategori 6

Kategori 6 atau Bentuk Kupu-Kupu Sayap Terbuka menggunakan citra kupu4.jpg sebagai citra query. Hasil pengujian proses pencarian citra relevan dari kategori 6 dapat dilihat pada Gambar 4.33 hingga 4.38

Gambar 4.33. Pencarian Citra Relevan Kategori 6 – 1 “ .jpg”, sistem mengembalikan


(85)

66

Gambar 4.34. Pencarian Citra Relevan Kategori 6 - 2


(86)

67

Gambar 4.36. Pencarian Citra Relevan Kategori 6 - 4


(87)

68

Gambar 4.38. Pencarian Citra Relevan Kategori 6 - 6

4.3.1.7 Hasil Pengujian Kategori 7

Kategori 7 atau Bentuk Gedung Monas menggunakan citra monas2.jpg sebagai citra query. Hasil pengujian proses pencarian citra relevan dari kategori 7 dapat dilihat pada Gambar 4.39 hingga 4.40

Gambar 4.39. Pencarian Citra Relevan Kategori 7 – 1

Dengan masukkan citra query “monas2.jpg”, sistem mengembalikan 21 citra dari 100 citra.


(88)

69

Gambar 4.40. Pencarian Citra Relevan Kategori 7 - 2

4.3.1.8 Hasil Pengujian Kategori 8

Kategori 8 atau Panda menggunakan citra panda2.jpg sebagai citra query. Hasil pengujian proses pencarian citra relevan dari kategori 8 dapat dilihat pada Gambar 4.41 hingga 4.45

Gambar 4.41. Pencarian Citra Relevan Kategori 8 – 1


(89)

70

Gambar 4.42. Pencarian Citra Relevan Kategori 8 - 2


(90)

71

Gambar 4.44. Pencarian Citra Relevan Kategori 8 - 4

Gambar 4.45. Pencarian Citra Relevan Kategori 8 - 5

4.3.1.9 Hasil Pengujian Kategori 9

Kategori 9 atau Pisang menggunakan citra pisang4.jpg sebagai citra query. Hasil pengujian proses pencarian citra relevan dari kategori 9 dapat dilihat pada Gambar 4.46


(91)

72

Gambar 4.46. Pencarian Citra Relevan Kategori 9 - 1

Dengan masukkan citra query “pisang4.jpg”, sistem mengembalikan 36 citra dari 100 citra.


(92)

73

Gambar 4.48. Pencarian Citra Relevan Kategori 9 - 3

4.3.1.10 Hasil Pengujian Kategori 10

Kategori 10 atau Rumah menggunakan citra rumah9.jpg sebagai citra query. Hasil pengujian proses pencarian citra relevan dari kategori 10 dapat dilihat pada Gambar 4.49 hingga 4.51.

Gambar 4.49. Pencarian Citra Relevan Kategori 10 – 1


(93)

74

Gambar 4.50. Pencarian Citra Relevan Kategori 10 - 2


(94)

75

4.3.2 Hasil Pengujian Pengaruh Rotasi

Hasil pengujian terhadap pengaruh rotasi dapat dilihat pada Gambar 4.52 hingga 4.54

Gambar 4.52. Pengujian Rotasi - 1


(95)

76

Gambar 4.54. Pengujian Rotasi - 3

Dengan masukkan citra query “rotasi1.jpg” serta penggunaan nilai threshold 1000 sistem mengembalikan 13 citra dari 20 citra. Untuk detail dari perbandingan kemiripan citra dapat dilihat pada gambar 4.54, citra yang memiliki kemiripan dihubungkan dengan menggunakan garis berwarna kuning.

4.3.2.1 Hasil Pengujian Pengaruh Rotasi - Threshold 1000

Hasil pengujian terhadap pengaruh rotasi dengan menggunakan nilai threshold sebesar 1000 dapat dilihat pada Gambar 4.55 dan Tabel 4.14.


(96)

77

Tabel 4.14 Hasil Citra Uji Rotasi Threshold 1000 Rotasi - Threshold 1000

Ranking Nama File

Presentasi Kemiripan

(%)

Ranking Nama File

Presentasi Kemiripan (%)

1 Rotasi 1 100 6 Rotasi10 34

2 Rotasi 6 75 7 Rotasi5 23

3 Rotasi 3 66 8 Rotasi4 19

4 Rotasi 8 66 9 Rotasi2 17

5 Rotasi 9 57 10 Rotasi7 11

Dengan masukkan citra query “rotasi1.jpg” serta penggunaan nilai threshold 1000 sistem mengembalikan 13 citra dari 20 citra. Untuk ranking dari perbandingan kemiripan citra dapat dilihat pada tabel 4.14, citra yang memiliki kemiripan diurutkan secara descending berdasarkan persentase kemiripannya.

4.3.2.2 Hasil Pengujian Pengaruh Rotasi - Threshold 500

Hasil pengujian terhadap pengaruh rotasi dengan menggunakan nilai threshold sebesar 500 dapat dilihat pada Gambar 4.56 dan Tabel 4.15.


(97)

78

Tabel 4.15 Hasil Citra Uji Rotasi Threshold 500 Rotasi - Threshold 500

Ranking Nama File

Presentasi Kemiripan

(%)

Ranking Nama File

Presentasi Kemiripan (%)

1 Rotasi 1 100 6 Rotasi10 35

2 Rotasi 6 78 7 Rotasi5 16

3 Rotasi 8 65 8 Rotasi4 18

4 Rotasi 3 63 9 Rotasi2 11

5 Rotasi 9 49 10 Rotasi7 19

11 Scala4 2

Dengan masukkan citra query “rotasi1.jpg” serta penggunaan nilai threshold 500 sistem mengembalikan 11 citra dari 20 citra. Untuk ranking dari perbandingan kemiripan citra dapat dilihat pada tabel 4.15, citra yang memiliki kemiripan diurutkan secara descending berdasarkan persentase kemiripannya.

4.3.2.3 Hasil Pengujian Pengaruh Rotasi - Threshold 250

Hasil pengujian terhadap pengaruh rotasi dengan menggunakan nilai threshold sebesar 250 dapat dilihat pada Gambar 4.57 dan Tabel 4.16.


(98)

79

Tabel 4.16 Hasil Citra Uji Rotasi Threshold 250 Rotasi - Threshold 250

Ranking Nama File

Presentasi Kemiripan

(%)

Ranking Nama File

Presentasi Kemiripan (%)

1 Rotasi 1 100 7 Rotasi 5 16

2 Rotasi 6 76 8 Rotasi 7 12

3 Rotasi 8 69 9 Rotasi 2 11

4 Rotasi 3 65 10 Rotasi 4 11

5 Rotasi 9 46 11 Scala 4 2

6 Rotasi 10

38 12 Scala 5 2

Dengan masukkan citra query “rotasi1.jpg” serta penggunaan nilai threshold 500 sistem mengembalikan 12 citra dari 20 citra. Untuk ranking dari perbandingan kemiripan citra dapat dilihat pada tabel 4.14, citra yang memiliki kemiripan diurutkan secara descending berdasarkan persentase kemiripannya.

4.3.3 Hasil Pengujian Pengaruh Skala


(99)

80

Gambar 4.59. Pengujian Skala - 2

Gambar 4.60. Pengujian Skala - 3

Dengan masukkan citra query “skala1.jpg” serta penggunaan nilai threshold berbeda, analisis akan dilakukan terhadap pengaruh gambar yang telah diskala dengan hasil temu balik citra. Detail dari perbandingan kemiripan citra dapat dilihat pada gambar 4.59 dan 4.60, citra yang memiliki kemiripan dihubungkan dengan menggunakan garis berwarna kuning. Pada gambar 4.59 dapat dilihat bahwa walaupun skala gambar telah diperkecil, sistem masih dapat mendeteksi kemiripan antar kedua citra tersebut.


(1)

3.1.2 Analisis Kebutuhan 19

3.1.2.1 Kebutuhan Fungsional 19

3.1.2.2 Kebutuhan Non-Fungsional 19

3.1.3 Analisis Proses 20

3.2 Pemodelan 20

3.2.1 Preprocessing 20

3.2.1.1 Konversi citra RGB ke Grayscale dan .bmp 20

3.2.1 Use Case Diagram 21

3.2.1.1 Use Case Mencari Citra Relevan 22 3.2.1.2 Use Case Ekstraksi Ciri Citra dengan SURF 23 3.2.1.3 Use Case Kemiripan Citra dengan Euclidean Distance 24

3.2.2 Activity Diagram 25

3.2.3 Sequence Diagram 26

3.3 Perancangan Sistem 27

3.3.1 Flowchart Sistem 27

3.3.2 Perancangan Antarmuka Sistem (Interface) 28

3.3.2.1 Halaman Awal 28

3.3.2.2 Halaman Pencarian Citra Relevan 29

3.3.2.3 Halaman Bantuan 30

Bab 4 Implementasi dan Pengujian

4.1 Implementasi 32

4.1.1 Tampilan Halaman Awal 32

4.1.2 Tampilan Halaman Pencarian Citra Relevan 33

4.1.3 Tampilan Halaman Bantuan 35

4.2 Pengujian 36

4.2.1 Pengujian Proses Pencarian Citra Relevan 36

4.2.2 Pengujian Pengujian Pengaruh Rotasi 47

4.2.3 Pengujian Pengaruh Skala 48

4.3 Hasil Pengujian 49

4.3.1 Hasil Pengujian Proses Pencarian Citra Relevan 49

4.3.1.1 Hasil Pengujian Kategori 1 49

4.3.1.2 Hasil Pengujian Kategori 2 52

4.3.1.3 Hasil Pengujian Kategori 3 54

4.3.1.4 Hasil Pengujian Kategori 4 55

4.3.1.5 Hasil Pengujian Kategori 5 58

4.3.1.6 Hasil Pengujian Kategori 6 60

4.3.1.7 Hasil Pengujian Kategori 7 63

4.3.1.8 Hasil Pengujian Kategori 8 64

4.3.1.9 Hasil Pengujian Kategori 9 66

4.3.1.10 Hasil Pengujian Kategori 10 68 4.3.2 Hasil Pengujian Pengujian Pengaruh Rotasi 69 4.3.2.1 Hasil Pengujian Pengaruh Rotasi - Threshold 1000 70 4.3.2.2 Hasil Pengujian Pengaruh Rotasi - Threshold 500 71 4.3.2.3 Hasil Pengujian Pengaruh Rotasi - Threshold 250 72

4.3.3 Hasil Pengujian Pengaruh Skala 74

4.3.3.1 Hasil Pengujian Pengaruh Skala - Threshold 1000 75 4.3.3.2 Hasil Pengujian Pengaruh Skala - Threshold 500 77 4.3.3.3 Hasil Pengujian Pengaruh Skala - Threshold 250 78


(2)

4.4 Parameter Pengujian 79 4.4.1 Parameter Pengujian Proses Pencarian Citra Relevan 80 4.4.1.1 Parameter Pengujian Kategori 1 80 4.4.1.2 Parameter Pengujian Kategori 2 80 4.4.1.3 Parameter Pengujian Kategori 3 81 4.4.1.4 Parameter Pengujian Kategori 4 81 4.4.1.5 Parameter Pengujian Kategori 5 82 4.4.1.6 Parameter Pengujian Kategori 6 82 4.4.1.7 Parameter Pengujian Kategori 7 83 4.4.1.8 Parameter Pengujian Kategori 8 83 4.4.1.9 Parameter Pengujian Kategori 9 84 4.4.1.10 Parameter Pengujian Kategori 10 84 4.4.1.11 Rata-Rata Parameter Pengujian Hasil Citra Relevan 85

4.4.2 Parameter Pengujian Pengaruh Rotasi 85

4.4.2.1 Parameter Pengujian Pengaruh Rotasi - Threshold 1000 85 4.4.2.2 Parameter Pengujian Pengaruh Rotasi - Threshold 500 86 4.4.2.3 Parameter Pengujian Pengaruh Rotasi - Threshold 250 86 4.4.2.4 Rata-Rata Parameter Pengujian Rotasi 87

4.4.3 Parameter Pengujian Pengaruh Skala 87

4.4.3.1 Parameter Pengujian Pengaruh Skala - Threshold 1000 87 4.4.3.2 Parameter Pengujian Pengaruh Skala - Threshold 500 88 4.4.3.3 Parameter Pengujian Pengaruh Skala - Threshold 250 88 4.4.3.4 Rata-Rata Parameter Pengujian Rotasi 89 4.5 Grafik Recall, Precision dan Running Time 89 4.5.1 Grafik Recall, Precision dan Running Time Citra Relevan 89 4.5.2 Grafik Recall, Precision dan Running Time Uji Rotasi dan Skala 90 Bab 5 Kesimpulan dan Saran

5.1 Kesimpulan 99

5.2. Saran 99


(3)

DAFTAR TABEL Nomor

Tabel Nama Tabel Halaman

2.1 3.1 3.2 3.3 3.4 3.5 3.6 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 4.10 4.11 4.12 4.13 4.14 4.15 4.16 4.17 4.18 4.19 4.20 4.21 4.22 4.23 4.24 4.25 4.26 4.27 4.28 4.29 4.30 4.31 4.32 4.33 4.34 4.35 4.36 4.37

Penelitian Sebelumnya Terkait CBIR dan SURF Spesifikasi Use Case Pencarian Citra Relevan

Spesifikasi Use Case Ekstraksi Ciri Citra dengan SURF Spesifikasi Use Case Kemiripan Citra - Euclidean Distance Keterangan Gambar Rancangan Interface Halaman Awal Keterangan Gambar Rancangan Interface Pencarian Citra Keterangan Gambar Rancangan Interface Bantuan

Koleksi 100 Citra - Kategori 1 Burung Flamingo Koleksi 100 Citra - Kategori 2 Bus

Koleksi 100 Citra - Kategori 3 Kupu-Kupu Sayap Tertutup Koleksi 100 Citra - Kategori 4 Bentuk Tangan

Koleksi 100 Citra - Kategori 5 Bentuk Hati

Koleksi 100 Citra - Kategori 6 Kupu-Kupu Sayap Terbuka Koleksi 100 Citra - Kategori 7 Gedung Monas

Koleksi 100 Citra - Kategori 8 Panda Koleksi 100 Citra - Kategori 9 Pisang Koleksi 100 Citra - Kategori 10 Rumah Koleksi Citra Uji Rotasi

Koleksi Citra Uji Skala

Hasil Citra Uji Rotasi Threshold 1000 Hasil Citra Uji Rotasi Threshold 500 Hasil Citra Uji Rotasi Threshold 250 Hasil Citra Uji Skala Threshold 1000 Hasil Citra Uji Skala Threshold 500 Hasil Citra Uji Skala Threshold 250 Hasil Parameter Uji Kategori 1 Hasil Parameter Uji Kategori 2 Hasil Parameter Uji Kategori 3 Hasil Parameter Uji Kategori 4 Hasil Parameter Uji Kategori 5 Hasil Parameter Uji Kategori 6 Hasil Parameter Uji Kategori 7 Hasil Parameter Uji Kategori 8 Hasil Parameter Uji Kategori 9 Hasil Parameter Uji Kategori 10

Hasil Rata-Rata Parameter Uji Citra Relevan Hasil Parameter Uji Rotasi Threshold 1000 Hasil Parameter Uji Rotasi Threshold 500 Hasil Parameter Uji Rotasi Threshold 250 Hasil Rata-Rata Parameter Uji Rotasi Hasil Parameter Uji Skala Threshold 1000 Hasil Parameter Uji Skala Threshold 500 Hasil Parameter Uji Skala Threshold 250 Hasil Rata-Rata Parameter Uji Rotasi

15 22 23 24 29 30 31 37 38 39 40 41 42 43 44 45 46 47 48 71 72 73 76 77 79 80 80 81 81 82 82 83 83 84 84 85 85 86 86 87 87 88 88 89


(4)

DAFTAR GAMBAR

Nomor

Gambar Nama Gambar Halaman

2.1 2.2 2.3 2.4 2.5 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 4.10 4.11 4.12 4.13 4.14 4.15 4.16 4.17 4.18 4.19 4.20 4.21 4.22 4.23 4.24 4.25 4.26 4.27 4.28 4.29

Koordinat Citra Digital Contoh Gambar Citra RGB Contoh Gambar Citra Grayscale Contoh Gambar Citra Biner

Diagram Sistem Content Based Image Retrieval Diagram Ishikawa

Diagram Preprocessing Konversi Citra RGB ke Grayscale Use Case Diagram

Activity Diagram Sequence Diagram Flowchart Sistem

Rancangan Antarmuka Halaman Awal

Rancangan Antarmuka Halaman Pencarian Citra Relevan Rancangan Antarmuka Halaman Bantuan

Tampilan Halaman Awal

Tampilan Halaman Pencarian Citra Relevan

Tampilan Halaman Pencarian Citra Relevan - Area 1 Tampilan Halaman Pencarian Citra Relevan - Area 2 Tampilan Halaman Pencarian Citra Relevan - Area 3 Tampilan Halaman Pencarian Citra Relevan - Area 4 Tampilan Halaman Bantuan

Konversi citra RGB ke Grayscale Proses Scale-Space

Ilustrasi Integral Image

Ilustrasi Proses Scale-Space dengan Filtering Berkala Diagram Sistem CBIR dengan SURF

Pencarian Citra Relevan Kategori 1 – 1 Pencarian Citra Relevan Kategori 1 – 2 Pencarian Citra Relevan Kategori 1 – 3 Pencarian Citra Relevan Kategori 1 – 4 Pencarian Citra Relevan Kategori 1 – 5 Pencarian Citra Relevan Kategori 2 – 1 Pencarian Citra Relevan Kategori 2 – 2 Pencarian Citra Relevan Kategori 2 – 3 Pencarian Citra Relevan Kategori 3 – 1 Pencarian Citra Relevan Kategori 3 – 2 Pencarian Citra Relevan Kategori 3 – 3 Pencarian Citra Relevan Kategori 4 – 1 Pencarian Citra Relevan Kategori 4 – 2 Pencarian Citra Relevan Kategori 4 – 3 Pencarian Citra Relevan Kategori 4 – 4 Pencarian Citra Relevan Kategori 4 – 5 Pencarian Citra Relevan Kategori 4 – 6

6 7 7 8 11 18 21 22 25 26 27 28 29 30 32 33 33 34 34 35 35 36 36 37 37 38 52 53 53 54 54 55 56 56 57 57 58 58 59 59 60 60 61


(5)

4.30 4.31 4.32 4.33 4.34 4.35 4.36 4.37 4.38 4.39 4.40 4.41 4.42 4.43 4.44 4.45 4.46 4.47 4.48 4.49 4.50 4.51 4.52 4.53 4.54 4.55 4.56 4.57 4.58 4.59 4.60 4.61 4.62 4.63 4.64 4.65 4.66 4.67 4.68 4.69

Pencarian Citra Relevan Kategori 5 – 1 Pencarian Citra Relevan Kategori 5 – 2 Pencarian Citra Relevan Kategori 5 – 3 Pencarian Citra Relevan Kategori 6 – 1 Pencarian Citra Relevan Kategori 6 – 2 Pencarian Citra Relevan Kategori 6 – 3 Pencarian Citra Relevan Kategori 6 – 4 Pencarian Citra Relevan Kategori 6 – 5 Pencarian Citra Relevan Kategori 6 – 6 Pencarian Citra Relevan Kategori 7 – 1 Pencarian Citra Relevan Kategori 7 – 2 Pencarian Citra Relevan Kategori 8 – 1 Pencarian Citra Relevan Kategori 8 – 2 Pencarian Citra Relevan Kategori 8 – 3 Pencarian Citra Relevan Kategori 8 – 4 Pencarian Citra Relevan Kategori 8 – 5 Pencarian Citra Relevan Kategori 9 – 1 Pencarian Citra Relevan Kategori 9 – 2 Pencarian Citra Relevan Kategori 9 – 3 Pencarian Citra Relevan Kategori 10 – 1 Pencarian Citra Relevan Kategori 10 – 2 Pencarian Citra Relevan Kategori 10 – 3 Pengujian Rotasi – 1

Pengujian Rotasi – 2 Pengujian Rotasi – 3

Pengujian Rotasi Threshold 1000 Pengujian Rotasi Threshold 500 Pengujian Rotasi Threshold 250 Pengujian Skala – 1

Pengujian Skala – 2 Pengujian Skala – 3

Pengujian Skala Threshold 1000 Pengujian Skala Threshold 1000 - 2 Pengujian Skala Threshold 500 Pengujian Skala Threshold 250 Pengujian Skala Threshold 250 - 2 Grafik Running Time 100 Citra Grafik Recall & Precision 100 Citra

Grafik Recall & Precision Uji Rotasi & Skala Grafik Running Time Uji Rotasi & Skala

61 62 62 63 63 64 64 65 65 66 66 67 67 68 68 69 69 70 70 71 71 72 72 73 73 74 75 76 77 77 78 78 79 80 81 81 94 94 95 95


(6)

DAFTAR LAMPIRAN

Halaman

A. Listing Program A-1

B. Curriculum Vitae B-1