• Tidak ada hasil yang ditemukan

BAB V PENUTUP

5.2 Saran

Penelitian ini menguji dengan metode Modified Direction Feature (MDF) untuk ekstrasi fitur dan Multi-SVM untuk klasifikasi terjemahan aksara Lontara menggunakan input data gambar 150 x 120. Pengembangan Sistem Penerjemah ini dapat dilakukan dengan penambahan database kata sehingga ke depannya dapat digunakan untuk menerjemahkan kalimat yang menggunakan Aksara Lontara.

DAFTAR PUSTAKA

Agung, Tjokorda. 2009. Pengenalan Huruf Bali Menggunakan Metode Modified Feature(MDF) dan Learning Vector Quantization (LQV). Tesis. Institut Teknologi Telkom.

Alex, Verawati Herman. 2015. Aplikasi Aksara Lontara Makassar. Skripsi. Institut Teknologi Telkom.

Amutiara, 2015. Pengantar Pengolahan Citra

(http://amutiara.staff.gunadarma.ac.id/Downloads/files/39981/Bab1_Pengantar+Pengola han+Citra.pdf)

Arsy, Asyraful Insan. 2016. Sistem Penerjemah Aksara Lontara MDF-FD. Tesis. Program Pascasarjana Universitas Hasanudin.

Bertalya. 2005. Representasi Citra. Universitas Gunadarma.

Ferdiyanti, Yurike. 2016. Aplikasi Pembelajaran Bahasa Madura dan Aksara Jawa Berbasis Android. Tugas Akhir. Universitas Telkom.

Golhar, Reetesh V. 2016. Design and implementation of android base mobile app for an institute.

http://ieeexplore.ieee.org/document/7755391/. IEEE

Fauzy, Misbah Riyandi. Mengubah Tulisan Tangan Menjadi Text Digital OCR dengan Menggunakan Metode Segmentasi dan Korelasi. Skripsi. Teknik Elektro Universitas Diponegoro.

Oktaviani. 2017. Analisis Uji Komparasi Operasi pada Android dan Blackberry. Universitas Gunadarma.

Putra, Darma. 2010. Pengolahan Citra Digital. Yogyakarta: Penerbit Andi.

Rizky, Mahathir. 2018. Pengenalan Aksara Mbojo pada Manuskrip Kuno. Tesis. Program Pascasarjana Universitas Hasanuddin.

Robby. 2015. Client-Server. (http://robby.c.staff.gunadarma.ac.id/Downloads/files/44361/client-server.pdf), diakses 9 Desember 2017

Sembiring, Krisantus. 2007. Penerapan Teknik Support Vector Machine untuk Pendeteksian Intrusi pada Jaringan. Tugas Akhir. ITB.

Surya, Ardyandrea Arstya. 2017. Analisis Perancangan Aplikasi Penerjemah Aksara Jawa

menggunakan Metode Backpropagation. (online).

http://openlibrary.telkomuniversity.ac.id/home/catalog/id/134917/slug/analisis-dan-

perancangan-aplikasi-penerjemah-aksara-jawa-menggunakan-metode-backpropagation.html, diakses 15 Agustus 2017

Wara, Raizal Dzil. 2013. Matlab Untuk Pemula. Diakses 11 Agustus 2017, dari Telkom Library.

Widiarti, Anastasia Rita. 2017. The Model and Implementation of Javanese Script Image Transliteration. http://ieeexplore.ieee.org/document/8262542/. IEEE

Wihanry, Indra dan Chyan. 2015. Perancangan Aplikasi Pembelajaran Aksara Lontara dengan Metode Game Based Learning. Jurnal tematika, Universitas Atmajaya Makassar.

Lampiran 1

 Data Training

Lampiran 2

Tabel Testing data tanpa blitz dan menggunakan blitz.

No Input Uji 1 Uji 2 Uji 3 Uji 4 Uji 5

1 Akka

2 Anang

3 Ala

4 Ambik

5 Baca

6 Bage

7 Bakbi

8 Bakuk

9 Bali

10 Balu

11 Bampa

12 Basa

13 Bissa

14 Bokong

15 Bongka

16 Boya

17 Buang

18 Bukku

19 Buno

20 Cata`

21 Ceppa

22 Cili

23 Cini

24 Didi`

25 Dince

26 Ekbu

27 Elli

28 Era

29 Ewa

30 Gajang

31 Gandeng

32 Gappa

33 Gerrak

34 Gessa

35 Gettung

36 Giling

37 Goccang Lanjutan Tabel

38 Guru

39 Inung

40 Irek

41 Iso

42 Jaik

43 Jallo

44 Jamma

45 Jujung

46 Kaek

47 Katto

48 Kemmo

49 Lampa

50 Lamung

51 Lappo

52 Lari

53 Lellung

54 Leppe

55 Lesu

56 Linga

57 Lisu

58 Lukka

59 Lumpa

60 Lurang

No Input Uji 1 Uji 2 Uji 3 Uji4 Uji 5 1 Akka

2 Anang 3 Ala 4 Ambik 5 Baca 6 Bage 7 Bakbi

8 Bakuk

9 Bali

10 Balu

11 Bampa

12 Basa

13 Bissa

14 Bokong

15 Bongka

16 Boya

17 Buang

18 Bukku

19 Buno

20 Cata`

21 Ceppa

22 Cili

23 Cini

24 Didi`

25 Dince

26 Ekbu

27 Elli

28 Era

29 Ewa

30 Gajang

31 Gandeng

32 Gappa

33 Gerrak

34 Gessa Lanjutan Tabel

35 Gettung

36 Giling

37 Goccang

38 Guru

39 Inung

40 Irek

41 Iso

42 Jaik

43 Jallo

44 Jamma

45 Jujung

46 Kaek

47 Katto

48 Kemmo

49 Lampa

50 Lamung

51 Lappo

52 Lari

53 Lellung

54 Leppe

55 Lesu

56 Linga

57 Lisu

58 Lukka

59 Lumpa

60 Lurang

Lampiran 3

 Data Tulisan Berwarna

 Data Tulisan Tangan

Lampiran 4

 MainActivity.java

package com.example.lenovo.lontara;

import android.Manifest;

import android.app.Activity;

import android.app.ProgressDialog;

import android.content.Context;

import android.content.Intent;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.media.Image;

import android.net.Uri;

import android.os.AsyncTask;

import android.provider.MediaStore;

import android.support.v4.app.ActivityCompat;

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;

import android.util.Log;

import android.view.View;

import android.widget.Button;

import android.widget.ImageView;

import android.widget.Toast;

import com.example.lenovo.lontara.helper.FileUri;

import java.io.DataOutputStream;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.io.InputStream;

import java.net.HttpURLConnection;

import java.net.MalformedURLException;

import java.net.URL;

import java.sql.Connection;

public class MainActivity extends Activity {

private static final String TAG = "MainActivity";

//private static final int CAMERA_PICK_INTENT_CODE = 100;

public static final int CAMERA_CAPTURE_IMAGE_REQUEST_CODE = 100;

ImageView resultView;

private Context mContext = this;

private final static String INPUT_IMG_FILENAME = "/temp.jpg"; //name for storing image captured by camera view

private final String SERVERURL =

"http://192.168.43.83/EE368_Android_Tutorial3_Server/computeSIFT.php";

ImageView image;

File sdCard;

private int RequestPermissionCode = 0;

private int WriteRequestPermissionCode = 1;

private int ReadRequestPermissionCode = 2;

private Uri fileUri;

Bitmap bitmapResult;

@Override

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

Button btnCamera = (Button) findViewById(R.id.btn_camera);

fileUri = Uri.EMPTY;

EnableRuntimePermissionToAccessCamera();

resultView = (ImageView) findViewById(R.id.result_from_server);

btnCamera.setOnClickListener(new View.OnClickListener() { @Override

public void onClick(View v) {

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

fileUri =

FileUri.getOutputMediaFileUri(FileUri.MEDIA_TYPE_IMAGE);

intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);

startActivityForResult(intent, CAMERA_CAPTURE_IMAGE_REQUEST_CODE);

} });

} /**

* Here we store the file url as it will be null after returning from camera

* app */

@Override

public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState);

// save file url in bundle as it will be null on scren orientation // changes

outState.putParcelable("file_uri", fileUri);

}

@Override

protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState);

if (savedInstanceState != null){

fileUri = savedInstanceState.getParcelable("file_uri");

} }

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

if (requestCode == CAMERA_CAPTURE_IMAGE_REQUEST_CODE && resultCode ==

RESULT_OK) {

/*final Intent intent = new Intent(this, Result.class);

startActivity(intent);*/

//if (data != null) {

Log.d(TAG,"Data Is Not Null");

ServerTask task = new ServerTask(this);

task.execute(fileUri.getPath());

//} else {

//Log.e(TAG,"Data Is Null");

//}

} }

// Requesting runtime permission to access camera.

public void EnableRuntimePermissionToAccessCamera(){

if

(ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.CAMERA))

{

// Printing toast message after enabling runtime permission.

Toast.makeText(MainActivity.this,"CAMERA permission allows us to Access CAMERA app", Toast.LENGTH_LONG).show();

ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.CAMERA}, RequestPermissionCode);

} else {

ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.CAMERA}, RequestPermissionCode);

} if

(ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE))

{

// Printing toast message after enabling runtime permission.

Toast.makeText(MainActivity.this,"Write SD permission allows us to save Captured Image from the app", Toast.LENGTH_LONG).show();

ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},

WriteRequestPermissionCode);

} else {

ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},

WriteRequestPermissionCode);

} if

(ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE))

{

// Printing toast message after enabling runtime permission.

Toast.makeText(MainActivity.this,"Read SD permission allows us to read Captured Image from the app", Toast.LENGTH_LONG).show();

ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},

ReadRequestPermissionCode);

} else {

ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},

ReadRequestPermissionCode);

} }

private class ServerTask extends AsyncTask<String, Integer , Void>

{

public byte[] dataToServer;

//Task state

private final int UPLOADING_PHOTO_STATE = 0;

private final int SERVER_PROC_STATE = 1;

private ProgressDialog dialog;

Context context;

//upload photo to server

HttpURLConnection uploadPhoto(FileInputStream fileInputStream) {

final String serverFileName = "test"+ (int) Math.round(Math.random()*1000) + ".jpg";

final String lineEnd = "\r\n";

final String twoHyphens = "--";

final String boundary = "*****";

try {

URL url = new URL(SERVERURL);

// Open a HTTP connection to the URL final HttpURLConnection conn = (HttpURLConnection)url.openConnection();

// Allow Inputs

conn.setDoInput(true);

// Allow Outputs

conn.setDoOutput(true);

// Don't use a cached copy.

conn.setUseCaches(false);

// Use a post method.

conn.setRequestMethod("POST");

conn.setRequestProperty("Connection", "Keep-Alive");

conn.setRequestProperty("Content-Type", "multipart/form-data;boundary="+boundary);

DataOutputStream dos = new DataOutputStream(

conn.getOutputStream() );

dos.writeBytes(twoHyphens + boundary + lineEnd);

dos.writeBytes("Content-Disposition: form-data;

name=\"uploadedfile\";filename=\"" + serverFileName +"\"" + lineEnd);

dos.writeBytes(lineEnd);

// create a buffer of maximum size

int bytesAvailable = fileInputStream.available();

int maxBufferSize = 1024;

int bufferSize = Math.min(bytesAvailable, maxBufferSize);

byte[] buffer = new byte[bufferSize];

// read file and write it into form...

int bytesRead = fileInputStream.read(buffer, 0, bufferSize);

while (bytesRead > 0) {

dos.write(buffer, 0, bufferSize);

bytesAvailable = fileInputStream.available();

bufferSize = Math.min(bytesAvailable, maxBufferSize);

bytesRead = fileInputStream.read(buffer, 0, bufferSize);

}

// send multipart form data after file data...

dos.writeBytes(lineEnd);

dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);

publishProgress(SERVER_PROC_STATE);

// close streams

fileInputStream.close();

dos.flush();

return conn;

}

catch (MalformedURLException ex){

Log.e(TAG, "error: " + ex.getMessage(), ex);

return null;

}

catch (IOException ioe){

Log.e(TAG, "error: " + ioe.getMessage(), ioe);

return null;

} }

//get image result from server and display it in result view void getResultImage(HttpURLConnection conn){

// retrieve the response from server InputStream is;

try {

is = conn.getInputStream();

//get result image from server

bitmapResult = BitmapFactory.decodeStream(is);

Log.d(TAG,conn.toString());

is.close();

} catch (IOException e) { Log.e(TAG,e.toString());

e.printStackTrace();

} }

//Main code for processing image algorithm on the server void processImage(String inputImageFilePath){

publishProgress(UPLOADING_PHOTO_STATE);

File inputFile = new File(inputImageFilePath);

try {

//create file stream for captured image file FileInputStream fileInputStream = new FileInputStream(inputFile);

//upload photo

final HttpURLConnection conn = uploadPhoto(fileInputStream);

Log.d(TAG,"Result from server : " + conn.getResponseMessage());

//get processed photo from server if (conn != null){

getResultImage(conn);}

fileInputStream.close();

}

catch (FileNotFoundException ex){

Log.e(TAG, ex.toString());

}

catch (IOException ex){

Log.e(TAG, ex.toString());

} }

public ServerTask(Context context) { this.context = context;

}

protected void onPreExecute() {

this.dialog = new ProgressDialog(context);

this.dialog.setMessage("Photo captured");

this.dialog.show();

}

@Override

protected Void doInBackground(String... params) { //background operation

String uploadFilePath = params[0];

processImage(uploadFilePath);

//release camera when previous image is processed return null;

}

//progress update, display dialogs @Override

protected void onProgressUpdate(Integer... progress) { if(progress[0] == UPLOADING_PHOTO_STATE){

dialog.setMessage("Uploading");

dialog.show();

}

else if (progress[0] == SERVER_PROC_STATE){

if (dialog.isShowing()) { dialog.dismiss();

}

this.dialog = new ProgressDialog(context);

this.dialog.setMessage("Processing");

this.dialog.show();

} }

@Override

protected void onPostExecute(Void param) { if (dialog.isShowing()) {

dialog.dismiss();

}

if(bitmapResult != null){

resultView.setImageBitmap(bitmapResult);

} } } }

 Ekstraksifitur

clc;

clear all;

close all;

gmbr_file= dir('*.jpg');

for i =1:length(gmbr_file) namafile=gmbr_file(i).name;

rgb = imread(namafile);

%rgb = imread([b a]);

R = imresize(rgb,[150 120]);

gray =rgb2gray(R);

%imtool(gray);

level = graythresh(gray);

ambang = round(level*150);

% imwrite (gray,'gray.jpg');

[tinggi, lebar] = size(gray);

% ambang = 90;

Biner = zeros(tinggi, lebar);

for baris = 1 : tinggi for kolom = 1 : lebar

if gray(baris, kolom) >= ambang Biner(baris, kolom) = 0;

else

Biner(baris, kolom) = 1;

end end end

%imtool (Biner);

d1x = [-1 0 1];

d1y = [-1;0;1];

Ix = conv2(Biner,d1x,'same');

Iy = conv2(Biner,d1y,'same');

J = sqrt((Ix.^2)+(Iy.^2));

%imshow(J);

measure= regionprops(J,'centroid');

[row col]=size(J);

rowtoshift= round(row/2 - measure.Centroid(2));

coltoshift= round(col/2 - measure.Centroid(1));

gambartengah= circshift(J,[rowtoshift coltoshift]);

% imtool(Biner);

% imtool(gambartengah);

%Membuat Bounding Box

%Img = imread('akka.jpg');

L = imclearborder(gambartengah);

M = imfill(L,'holes');

N = bwareaopen(M,100);

[row,col] = find(N==1);

[a,b] = size(N);

mask = false(a,b);

mask(min(row):max(row),min(col):max(col)) = 1;

mask = bwperim(mask,8);

mask = imdilate(mask,strel('square',4));

R = gambartengah(:,:,1);

G = gambartengah(:,:,1);

B = gambartengah(:,:,1);

R(mask) = 1;

G(mask) = 1;

B(mask) = 0;

RGB = cat(3,R,G,B);

%figure, imshow(RGB);

% Melakukan cropping hasil segmentasi

crop = imcrop(gambartengah,[min(col) min(row) max(col)-min(col) max(row)-min(row)]);

%figure, imshow(crop);

%Deteksi Tepi melalui operasi konvolusi dengan operator selisih terpusat

%imtool(J);

%imtool(Biner);

[lt dt] = mdf_feature(crop,5);

b = struct2array([dt lt]);

%to vektor

[baris, kolom] = size (b);

A = b(1,:);

for x= 1:baris-1 B = b((x+1),:);

A = [A B];

end;

MDF{i} = A;

end

% tes = C';

tes2 = MDF';

nilaifitur = cell2mat(tes2);

save fitur nilaifitur -append

 Mdf_feature

function [location_transitions, direction_transitions]=

mdf_feature(img,num_lines)

%thinned_image = get_skeleton(img);

%t = thinning1(img);

%H = ones(2);

%c = (dilasi(t, H));

thinned_image = img;

%just to work accordingly to paper

%find the lower left pixel that has the value 1 start_pixel = find_start_pixel(thinned_image);

thinned_image( start_pixel(1), start_pixel(2)) = -1;

segmented_image = get_df(start_pixel, thinned_image);

[location_transitions, direction_transitions] = analyse_matrix_transictions(segmented_image);

location_transitions = averaging_features(location_transitions, num_lines);

direction_transitions = averaging_features(direction_transitions, num_lines);

end

function feature_structure = averaging_features(feature_structure, num_lines) result = [];

field_names = fieldnames(feature_structure);

for k = 1 : size(field_names,1)

temp = getfield(feature_structure, char(field_names(k)));

result = average_lines(temp, num_lines);

feature_structure = setfield(feature_structure, char(field_names(k)), result);

end end

function segmented_image = clean_start_points(segmented_image) intersections = 9;

for r = 1 : size(segmented_image, 1)

c = find(segmented_image(r, : ) == -1);

for k = 1 : length(c)

segmented_image(r, c(k)) = intersections;

end

end end

function s_pixel = find_start_pixel(img) for r = size(img,1) : -1 : 1

c = find(img(r, : ) == 1);

if(isempty(c) == 0) s_pixel = [r c(1)];

return;

end end end

function img = get_df(pixel, img) %img

%pause;

point = struct('row', pixel(1), 'col', pixel(2), 'segment', 1, 'previous_dir', struct('direction',1,'number',0,'length',0));

segments = [struct('segment', [point])];

queue = [point];

img( point.row, point.col) = -1;

while (length(queue) > 0) %img

%segments %pause

point = queue(1);

queue(1) = [];

neighbours = find_neighbours(point, img);

for i = 1 : length(neighbours)

img( neighbours(i).row, neighbours(i).col ) = 9;

end

if length(neighbours) == 1

neighbours(1).previous_dir = refresh_previous_direction(

point.previous_dir, get_direction(point, neighbours(1)));

img( neighbours(1).row, neighbours(1).col ) = neighbours(1).previous_dir.direction;

queue = [neighbours(1), queue];

this_segment = segments(neighbours(1).segment).segment;

this_segment = [this_segment, neighbours(1)];

segments(neighbours(1).segment).segment = this_segment;

elseif length(neighbours) > 1 change = false;

for i = 1 : length(neighbours)

neighbours(i).previous_dir.direction = get_direction(point, neighbours(i));

%neighbours(i).previous_dir.direction %point.previous_dir.direction

%pause

if new_segment(point, neighbours(i)) || change

img =

normalize_segment(segments(neighbours(i).segment).segment,img);

segments = [segments, struct('segment', [neighbours(i)])];

neighbours(i).segment = length(segments);

queue = [queue, neighbours(i)];

img( neighbours(i).row, neighbours(i).col ) = -1;

else

change = true;

neighbours(i).previous_dir = refresh_previous_direction(

point.previous_dir, get_direction(point, neighbours(i)));

img( neighbours(i).row, neighbours(i).col ) = neighbours(i).previous_dir.direction;

queue = [neighbours(i), queue];

this_segment = segments(neighbours(i).segment).segment;

this_segment = [this_segment, neighbours(i)];

segments(neighbours(i).segment).segment = this_segment;

end end else

if length(segments(point.segment).segment) ~= 0

img = normalize_segment(segments(point.segment).segment,img);

end end end end

function img = normalize_segment(pixels_segment, img) count = zeros(1,5);

count(1) = -1;

for i = 2 : length(pixels_segment) r = pixels_segment(i).row;

c = pixels_segment(i).col;

count( img( r, c ) ) = count( img( r, c ) ) + 1;

end

[values, index] = max(count);

if(count(index(1)) > 0)

img(pixels_segment(1).row, pixels_segment(1).col) = index(1);

else

img(pixels_segment(1).row, pixels_segment(1).col) = 9;

end end

function previous_direction = refresh_previous_direction(previous_direction, next_direction)

if previous_direction.direction == next_direction

previous_direction.length = previous_direction.length + 1;

else

previous_direction = struct('direction', next_direction, 'number', previous_direction.number, 'length', 0);

end end

function direction = get_direction(pixel, next) difference_y = pixel.col - next.col;

difference = abs(pixel.row - next.row + difference_y);

direction = difference + 3;

if difference == 1 && difference_y == 0 direction = 2;

end end

function result = find_neighbours(pixel, img) result = [];

%checks if the actual pixel has more than to neighbours. If yes, it is an intersection point

neighbours = [-1 0; -1 1; 0 1; 1 1; 1 0; 1 -1; 0 -1; -1 -1];

conta = 0;

for i = 1 : size(neighbours,1) try

if(img(pixel.row + neighbours(i,1), pixel.col + neighbours(i,2)) ==

1)

new_neigh = struct('row', pixel.row + neighbours(i,1), 'col', pixel.col + neighbours(i,2),'segment',pixel.segment, 'previous_dir', struct('direction',1,'number',0,'length',0));

result = [result , new_neigh];

end

catch exception continue end

end end

function result = new_segment(pixel, next_pixel)

result = first_condition(pixel, next_pixel) || second_condition(pixel, next_pixel);

result = result || third_condition(pixel) || fourth_condition(pixel);

end

function result = first_condition(pixel, next_pixel)

result = (pixel.previous_dir.direction == 3) &&

(next_pixel.previous_dir.direction == 5);

end

function result = second_condition(pixel, next_pixel)

result = (next_pixel.previous_dir.direction == 3) &&

(pixel.previous_dir.direction == 5);

end

function result = third_condition(pixel) result = pixel.previous_dir.number > 3;

end

function result = fourth_condition(pixel) result = (pixel.previous_dir.length > 3);

end

function [location_transitions, direction_transitions] = analyse_matrix_transictions(matrix)

%lr = left to right %rl = right to left %tb = top to bottom %bt = bottom to top

location_transitions = struct('left_right', [], 'right_left', [], 'top_bottom', [], 'bottom_top', []);

direction_transitions = struct('left_right', [], 'right_left', [], 'top_bottom', [], 'bottom_top', []);

for i = 1:size(matrix,1) row = matrix(i,:);

[lt_lr lt_rl dt_lr dt_rl] = analyse_lines(row);

location_transitions.left_right = [ location_transitions.left_right ; lt_lr];

location_transitions.right_left = [ location_transitions.right_left ; lt_rl];

direction_transitions.left_right = [ direction_transitions.left_right ; dt_lr];

direction_transitions.right_left = [ direction_transitions.right_left ; dt_rl];

end

for i = 1:size(matrix,2) col = matrix(:,i);

[lt_tb lt_bt dt_tb dt_bt] = analyse_lines(col);

location_transitions.top_bottom = [ location_transitions.top_bottom ; lt_tb];

location_transitions.bottom_top = [ location_transitions.bottom_top ; lt_bt];

direction_transitions.top_bottom = [ direction_transitions.top_bottom ; dt_tb];

direction_transitions.bottom_top = [ direction_transitions.bottom_top ; dt_bt];

end end

function [lt_normal lt_inverse dt_normal dt_inverse] = analyse_lines(line) %lines can be either columns or rows

%directions are:

%left to right %right to left %top to bottom %bottom to top len = length(line);

p1 = get_transition_points( line );

p2 = get_transition_points( line(len:-1:1) );

lt_normal = get_location_transitions(p1, len);

lt_inverse = get_location_transitions(p2, len);

dt_normal = get_direction_transitions(p1);

dt_inverse = get_direction_transitions(p2);

end

%transitions -> Nx2 [index, value in matrix] //ubah dsni function transitions = get_transition_points(line) transitions = zeros(3,2);

count = 1;

i = 1;

while count <= 3 && i < length(line)

if line(i) == 0 && line(i+1) > 0 transitions(count,1) = i + 1;

transitions(count,2) = line(i + 1);

count = count + 1;

end i = i+1;

end end

function lt = get_location_transitions(transitions, line_length)

lt = zeros(1,3);

size(transitions);

for i = 1 : min(size(transitions,1), 3)

lt(i) = 1 - (transitions(i,1) / line_length);

end end

function dt = get_direction_transitions(transitions) dt = zeros(1,3);

for i = 1 : min(size(transitions,1), 3) dt(i) = transitions(i,2) / 10;

end end

 Msvm_training

clc clear all close all

%mengambil file .mat yang telah dibuat load 'fitur';

%isi dari file .mat tsb Sample=nilaifitur;

%jumlah data(target data) class=target;

%melatih antara nilai pada file .mat dan jumlah data Model=svm.train(Sample,class);%svm linear

%memprediksi antara model dengan nilai pada file .mat predict=svm.predict(Model,Sample);

disp('kelas_real prediksi') disp([class predict])

%jumlah class pada real, dibaca pada diagonalnya, jika akurasi 100% maka hanya diagonalnya yang terbaca

confusion = confusionmat(target,predict);

Accuracy=mean(class==predict)*100;

fprintf('\nAccuracy =%d\n',Accuracy) save model Model

 Msvm_testing

function msvm_testing(input_img_path, output_img_path)

if nargin < 2

input_img_path=('./upload/akka.jpg');

output_img_path =('./output/ange1.jpg');

end

%rgb = imread([b a]);

InputImg = imread(input_img_path);

R = imresize(InputImg,[150 120]);

gray =rgb2gray(R);

%imtool(gray);

level = graythresh(gray);

ambang = round(level*200);

% imwrite (gray,'gray.jpg');

[tinggi, lebar] = size(gray);

% ambang = 90;

%imshow(ambang);

Biner = zeros(tinggi, lebar);

for baris = 1 : tinggi for kolom = 1 : lebar

if gray(baris, kolom) >= ambang Biner(baris, kolom) = 0;

else

Biner(baris, kolom) = 1;

end end end

imtool (Biner);

d1x = [-1 0 1];

d1y = [-1;0;1];

Ix = conv2(Biner,d1x,'same');

Iy = conv2(Biner,d1y,'same');

J = sqrt((Ix.^2)+(Iy.^2));

%imshow(J);

measure= regionprops(J,'centroid');

[row col]=size(J);

rowtoshift= round(row/2 - measure.Centroid(2));

coltoshift= round(col/2 - measure.Centroid(1));

gambartengah= circshift(J,[rowtoshift coltoshift]);

%imtool(Biner);

%imtool(gambartengah);

%Deteksi Tepi melalui operasi konvolusi dengan operator selisih terpusat

%Membuat Bounding Box

%Img = imread('akka.jpg');

L = imclearborder(gambartengah);

M = imfill(L,'holes');

N = bwareaopen(M,100);

[row,col] = find(N==1);

[a,b] = size(N);

mask = false(a,b);

mask(min(row):max(row),min(col):max(col)) = 1;

mask = bwperim(mask,8);

mask = imdilate(mask,strel('square',4));

R = gambartengah(:,:,1);

G = gambartengah(:,:,1);

B = gambartengah(:,:,1);

R(mask) = 1;

G(mask) = 1;

B(mask) = 0;

RGB = cat(3,R,G,B);

figure, imshow(RGB);

% Melakukan cropping hasil segmentasi

crop = imcrop(gambartengah,[min(col) min(row) max(col)-min(col) max(row)-min(row)]);

imtool(crop);

%imtool(J);

%imtool(Biner);

[lt dt] = mdf_feature(crop,5);

b = struct2array([dt lt]);

%to vektor

[baris, kolom] = size (b);

A = b(1,:);

for x= 1:baris-1 B = b((x+1),:);

A = [A B];

end;

MDF = A;

imshow(A);

nilaifitur = MDF;

load 'model'

predict=svm.predict(Model,nilaifitur);

if predict == 1

myicon = imread('akkagambar.jpg');

elseif predict == 2

myicon = imread('alagambar.jpg');

elseif predict == 3

myicon = imread('ambikgambar.jpg');

elseif predict == 4

myicon= imread('ananggambar.jpg');

elseif predict == 5

myicon = imread('bacagambar.jpg');

elseif predict == 6

myicon = imread('bagegambar.jpg');

elseif predict == 7

myicon = imread('bakbigambar.jpg');

elseif predict == 8

myicon = imread('bakukgambar.jpg');

elseif predict == 9

myicon = imread('baligambar.jpg');

elseif predict == 10

myicon = imread('balugambar.jpg');

elseif predict == 11

myicon = imread('bampagambar.jpg');

elseif predict == 12

myicon = imread('bissagambar.jpg');

elseif predict == 13

myicon = imread('bicikgambar.jpg');

elseif predict == 14

myicon = imread('basagambar.jpg');

elseif predict == 15

myicon = imread('bokonggambar.jpg');

elseif predict == 16

myicon = imread('bongkagambar.jpg');

elseif predict == 17

myicon = imread('boyagambar.jpg');

elseif predict == 18

myicon = imread('buanggambar.jpg');

elseif predict == 19

myicon = imread('bukkugambar.jpg');

elseif predict == 20

myicon = imread('bunogambar.jpg');

elseif predict == 21

myicon = imread('catakgambar.jpg');

elseif predict == 22

myicon = imread('ceppagambar.jpg');

elseif predict == 23

myicon = imread('ciligambar.jpg');

elseif predict == 24

myicon = imread('cinigambar.jpg');

elseif predict == 25

myicon = imread('cukugambar.jpg');

elseif predict == 26

myicon = imread('dengkagambar.jpg');

elseif predict == 27

myicon = imread('didikgambar.jpg');

elseif predict == 28

myicon = imread('dincegambar.jpg');

elseif predict == 29

myicon = imread('ekbugambar.jpg');

elseif predict == 30

myicon = imread('elligambar.jpg');

elseif predict == 31

myicon = imread('eragambar.jpg');

elseif predict == 32

myicon = imread('ewagambar.jpg');

elseif predict == 33

myicon = imread('gappagambar.jpg');

elseif predict == 34

myicon = imread('gajanggambar.jpg');

elseif predict == 35

myicon = imread('gandenggambar.jpg');

elseif predict == 36

myicon = imread('garugambar.jpg');

elseif predict == 37

myicon = imread('gattunggambar.jpg');

elseif predict == 38

myicon = imread('gerrakgambar.jpg');

elseif predict == 39

myicon = imread('gessagambar.jpg');

elseif predict ==40

myicon = imread('gettunggambar.jpg');

elseif predict == 41

myicon = imread('gilinggambar.jpg');

elseif predict == 42

myicon = imread('goccanggambar.jpg');

elseif predict == 43

myicon = imread('gurugambar.jpg');

elseif predict == 44

myicon = imread('inunggambar.jpg');

elseif predict == 45

myicon = imread('irekgambar.jpg');

elseif predict == 46

myicon = imread('isogambar.jpg');

elseif predict == 47

Dokumen terkait