• 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 : 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

(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

Keadaan ketenagakerjaan di Jawa Timur pada keadaan Februari 2015 digambarkan dengan menurunnya jumlah angkatan kerja maupun jumlah penduduk yang bekerja sehingga

Misalnya pada akhir tahun adalah musim penghujan, dimana pada bulan ini cocok untuk turun kesawah tetapi tidak cocok untuk musim panen sehingga petani harus mampu memperkirakan

Analisi data yang kita gunakan adalah analisa data kuantitatif yang dilakukan dengan cara mengumpulkan data dari hasil analisa tentang programa atau

Melaksanakan verifikasi dan kajian terhadap permohonan perizinan bidang koperasi, usaha kecil, dan menengah sesuai dengan lingkup tugas seksi berpedoman pada ketentuan

hubungan komunikasi interpersonal orang tua dalam membentuk perkembangan. anak usia sekolah di SD

Sistem tertentu adalah suatu sistem yang operasinya dapat diprediksi secara tepat sedangkan sistem tak tertentu adalah sistem dengan perilaku ke depan yang tidak

Selain itu, yang membedakan sebaran alel gen APOE antara penderita Sindrom Down dengan populasi normal yang dalam hal ini diwakili oleh kontrol adalah pada

Dilihat dari sisi kognitif, perkembangan anak usia sekolah berada pada tahap.. konkret dengan perkembangan kemampuan anak yang sudah