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