• Tidak ada hasil yang ditemukan

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

N/A
N/A
Protected

Academic year: 2017

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

Copied!
33
0
0

Teks penuh

(1)

Listing Program

public partial class MainWindow : Window {

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

}

void btnhelp_Click(object sender, RoutedEventArgs e) {

HelpWindow win2 = new HelpWindow(); win2.Show();

(2)

{ 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();

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

private void InitIndexDirectory() {

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

private void SetIndexDirectory(string folder) {

(3)

Properties.Settings.Default.IndexFolder = folder;

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);

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

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

{

(4)

DirectoryInfo di = new DirectoryInfo(SourceFolder);

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

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

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

(5)

string _folderName = IndexDirectory;

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

private void btnIndex_Click(object sender, RoutedEventArgs e) {

(6)

{

private void IndexBgWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)

{

pbIndex.Value = e.ProgressPercentage + 1; }

//004b

(7)

else

private void AccordSurfAlgoIndexing(SurfSettings surfSetting) {

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

(8)

openSurfDetails = mi;

private void mnuOpenSurfDetail_Click(object sender, RoutedEventArgs e) {

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

File.Exists(selectedObserverImage);

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

(9)

} }

private void mnuOpenPic_Click(object sender, RoutedEventArgs e) {

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

File.Exists(selectedObserverImage);

private void btnSelectQueryImage_Click(object sender, RoutedEventArgs e) {

private void btnQueryImage_Click(object sender, RoutedEventArgs e) {

(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)

(12)

(13)

private void WriteQueryStatus(string msg)

private int GetNumberOfImageFilesInIndexDirectory() {

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

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

(14)

Bitmap returnBitmap;

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

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

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;

(15)

}

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

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();

(16)

}

private void PaintSURF(Bitmap img1, Bitmap img2, List<IPoint>[] matches) { pt.X, pt.Y), new System.Drawing.Point(x + pt.X + ptR.X, pt.Y + ptR.Y));

(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)

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) {

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

(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)

{

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>();

(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) {

(22)

if (oktaf >= 3)

buildsimpananLayer(simpananPeta[i]); }

}

(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)

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

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

(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)

}

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)

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 : [email protected]

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

(28)

[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)
(30)
(31)
(32)
(33)

Referensi

Dokumen terkait

2014 : Seminar Nasional Literasi

Konten Video Berbasis Speeded Up Robust Features.Institut

Pada tahap ini dilakukan pengumpulan dan analisa data yang berhubungan dengan penelitian ini seperti cara kerja Content Based Video Retrieval (CBVR) dan fungsi

Content Based Video Retrieval memiliki empat tahapan yaitu segmentasi video yang menghasilkan frame – frame, ekstraksi keyframe merupakan tahapan memilih frame kunci dari

Kata Kunci : Video, Citra, Temu Balik, Ekstraksi Fitur, Content Based Video Retrieval (CBVR), Speeded-Up Robust Features (SURF)... IMPLEMENTATION OF CONTENT BASED

Poltak Sihombing, M.Kom selaku Ketua Program Studi S1 Ilmu Komputer Universitas Sumatera Utara dan sekaligus Dosen Pembimbing I yang telah memberikan bimbingan,

Pencocokan fitur, yaitu mencari nilai kemiripan dari setiap titik titik yang menarik antara citra uji dan citra latih dengan menggunakan FLANN, yaitu dengan mencari

Dalam penelitian ini, dikembangkan aplikasi untuk mendeteksi rambu lalu lintas, yang dapat digunakan pada kendaraan yang bergerak, dengan menggunakan algoritma speeded up