Pengenalan Pola Karakter Dan Penerjemahan Aksara Katakana Menggunakan Implementasi Algoritma Associative Memory Tipe Hetero-Associative
LISTING PROGRAM
1. Form1.cs
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Drawing.Imaging; using System.IO; namespace program {public partial class AksaraForm : Form { int[,] totalBobotKarakter; public AksaraForm() { InitializeComponent(); }
public static byte[] ImageToByte(Image img) {
ImageConverter converter = new ImageConverter();
return (byte[])converter.ConvertTo(img, typeof(byte[])); }
public static Image ScaleImage(Image image, int maxWidth, int maxHeight)
{
var newImage = new Bitmap(maxWidth, maxHeight); using (var graphics = Graphics.FromImage(newImage)) graphics.DrawImage(image, 0, 0, maxWidth, maxHeight); return newImage;
}
private void ubahUkuran_Click(object sender, EventArgs e) {
using (var newImage = ScaleImage(pictureBox1.Image, 100, 100)) {
Bitmap gambar = new Bitmap(newImage); pictureBox1.Image = gambar;
}
using (var newImage = ScaleImage(pictureBox2.Image, 100, 100)) {
Bitmap gambar = new Bitmap(newImage); pictureBox2.Image = gambar;
}
using (var newImage = ScaleImage(pictureBox3.Image, 100, 100)) {
Bitmap gambar = new Bitmap(newImage); pictureBox3.Image = gambar;
}
using (var newImage = ScaleImage(pictureBox4.Image, 100, 100)) {
Bitmap gambar = new Bitmap(newImage); pictureBox4.Image = gambar;
}
using (var newImage = ScaleImage(pictureBox5.Image, 100, 100)) {
(2)
lxxvii
pictureBox5.Image = gambar; }
}
private void btnopnimg_Click(object sender, EventArgs e) {
string testFile = @inputDirektori.Text + "\\" + inputNamaKarakter.Text + "1.jpg";
if (File.Exists(testFile)) {
pictureBox1.Image = Image.FromFile(@inputDirektori.Text + "\\" + inputNamaKarakter.Text + "1.jpg");
} else {
MessageBox.Show("File " + testFile + " tidak ditemukan !!", "File sampel", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
testFile = @inputDirektori.Text + "\\" + inputNamaKarakter.Text + "2.jpg";
if (File.Exists(testFile)) {
pictureBox2.Image = Image.FromFile(@inputDirektori.Text + "\\" + inputNamaKarakter.Text + "2.jpg");
} else {
MessageBox.Show("File " + testFile + " tidak ditemukan !!", "File sampel", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
testFile = @inputDirektori.Text + "\\" + inputNamaKarakter.Text + "3.jpg";
if (File.Exists(testFile)) {
pictureBox3.Image = Image.FromFile(@inputDirektori.Text + "\\" + inputNamaKarakter.Text + "3.jpg");
} else {
MessageBox.Show("File " + testFile + " tidak ditemukan !!", "File sampel", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
testFile = @inputDirektori.Text + "\\" + inputNamaKarakter.Text + "4.jpg";
if (File.Exists(testFile)) {
pictureBox4.Image = Image.FromFile(@inputDirektori.Text + "\\" + inputNamaKarakter.Text + "4.jpg");
} else {
MessageBox.Show("File " + testFile + " tidak ditemukan !!", "File sampel", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
testFile = @inputDirektori.Text + "\\" + inputNamaKarakter.Text + "5.jpg";
if (File.Exists(testFile)) {
(3)
pictureBox5.Image = Image.FromFile(@inputDirektori.Text + "\\" + inputNamaKarakter.Text + "5.jpg");
} else {
MessageBox.Show("File " + testFile + " tidak ditemukan !!", "File sampel", MessageBoxButtons.OK, MessageBoxIcon.Error);
} }
private void Normalisasi_Click(object sender, EventArgs e) {
List<Bitmap> kotakgbr = new List<Bitmap>(); Bitmap bp1 = (Bitmap)pictureBox1.Image; Bitmap bp2 = (Bitmap)pictureBox2.Image; Bitmap bp3 = (Bitmap)pictureBox3.Image; Bitmap bp4 = (Bitmap)pictureBox4.Image; Bitmap bp5 = (Bitmap)pictureBox5.Image; kotakgbr.Add(bp1);
kotakgbr.Add(bp2); kotakgbr.Add(bp3); kotakgbr.Add(bp4); kotakgbr.Add(bp5);
for (int i = 1; i <= 5; i++) {
Bitmap gambar = new Bitmap(kotakgbr[i - 1]); byte red, green, blue, grayscale;
for (int y = 0; y < gambar.Height; y++) {
for (int x = 0; x < gambar.Width; x++) {
red = gambar.GetPixel(x, y).R; green = gambar.GetPixel(x, y).G; blue = gambar.GetPixel(x, y).B;
grayscale = Convert.ToByte((red + green + blue) / 3); gambar.SetPixel(x, y, Color.FromArgb(grayscale, grayscale, grayscale));
} }
byte max = 0, min = 255, pixel, t; byte result;
for (int y1 = 0; y1 < gambar.Height; y1++) {
for (int x1 = 0; x1 < gambar.Width; x1++) {
pixel = gambar.GetPixel(x1, y1).R; if (pixel > max)
{
max = pixel; }
if (pixel < min) {
min = pixel; }
} }
t = 220;
for (int y2 = 0; y2 < gambar.Height; y2++) {
for (int x2 = 0; x2 < gambar.Width; x2++) {
pixel = gambar.GetPixel(x2, y2).R; if (pixel > t)
(4)
lxxix
{
result = 255; }
else {
result = 0; }
gambar.SetPixel(x2, y2, Color.FromArgb(result, result, result));
} }
if (i == 1) {
pictureBox1.Image = gambar; }
else if (i == 2) {
pictureBox2.Image = gambar; }
else if (i == 3) {
pictureBox3.Image = gambar; }
else if (i == 4) {
pictureBox4.Image = gambar; }
else if (i == 5) {
pictureBox5.Image = gambar; }
} }
private void hitungbobot_Click(object sender, EventArgs e) {
Dictionary<string, int[]> vektorKeluaran = new Dictionary<string, int[]>();
int[] vektorA = new int[] { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1 };
vektorKeluaran.Add("a", vektorA);
int[] vektorKa = new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1 };
vektorKeluaran.Add("ka", vektorKa);
int[] vektorSa = new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1 };
vektorKeluaran.Add("sa", vektorSa);
int[] vektorTa = new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1 };
vektorKeluaran.Add("ta", vektorTa);
int[] vektorNa = new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1 };
vektorKeluaran.Add("na", vektorNa);
int[] vektorHa = new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1 };
(5)
int[] vektorMa = new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -1 };
vektorKeluaran.Add("ma", vektorMa);
int[] vektorYa = new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1 };
vektorKeluaran.Add("ya", vektorYa);
int[] vektorRa = new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1 };
vektorKeluaran.Add("ra", vektorRa);
int[] vektorWa = new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1 };
vektorKeluaran.Add("wa", vektorWa);
int[] vektorI = new int[] { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 };
vektorKeluaran.Add("i", vektorI);
int[] vektorKi = new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 };
vektorKeluaran.Add("ki", vektorKi);
int[] vektorShi = new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 };
vektorKeluaran.Add("shi", vektorShi);
int[] vektorChi = new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 };
vektorKeluaran.Add("chi", vektorChi);
int[] vektorNi = new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 };
vektorKeluaran.Add("ni", vektorNi);
int[] vektorHi = new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 };
vektorKeluaran.Add("hi", vektorHi);
int[] vektorMi = new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 };
vektorKeluaran.Add("mi", vektorMi);
int[] vektorRi = new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, -1 };
vektorKeluaran.Add("ri", vektorRi);
int[] vektorU = new int[] { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 };
vektorKeluaran.Add("u", vektorU);
int[] vektorKu = new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, -1 };
vektorKeluaran.Add("ku", vektorKu);
int[] vektorSu = new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, -1 };
(6)
lxxxi
int[] vektorTsu = new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, -1 };
vektorKeluaran.Add("tsu", vektorTsu);
int[] vektorNu = new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, -1 };
vektorKeluaran.Add("nu", vektorNu);
int[] vektorFu = new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, -1 };
vektorKeluaran.Add("fu", vektorFu);
int[] vektorMu = new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, -1 };
vektorKeluaran.Add("mu", vektorMu);
int[] vektorYu = new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, -1 };
vektorKeluaran.Add("yu", vektorYu);
int[] vektorRu = new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, -1 };
vektorKeluaran.Add("ru", vektorRu);
int[] vektorE = new int[] { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 };
vektorKeluaran.Add("e", vektorE);
int[] vektorKe = new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, -1 };
vektorKeluaran.Add("ke", vektorKe);
int[] vektorSe = new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, -1 };
vektorKeluaran.Add("se", vektorSe);
int[] vektorTe = new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, -1 };
vektorKeluaran.Add("te", vektorTe);
int[] vektorNe = new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, -1 };
vektorKeluaran.Add("ne", vektorNe);
int[] vektorHe = new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, -1 };
vektorKeluaran.Add("he", vektorHe);
int[] vektorMe = new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, -1 };
vektorKeluaran.Add("me", vektorMe);
int[] vektorRe = new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, -1 };
vektorKeluaran.Add("re", vektorRe);
int[] vektorO = new int[] { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 };
(7)
int[] vektorKo = new int[] { -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 };
vektorKeluaran.Add("ko", vektorKo);
int[] vektorSo = new int[] { -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 };
vektorKeluaran.Add("so", vektorSo);
int[] vektorTo = new int[] { -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 };
vektorKeluaran.Add("to", vektorTo);
int[] vektorNo = new int[] { -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 };
vektorKeluaran.Add("no", vektorNo);
int[] vektorHo = new int[] { -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 };
vektorKeluaran.Add("ho", vektorHo);
int[] vektorMo = new int[] { -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 };
vektorKeluaran.Add("mo", vektorMo);
int[] vektorYo = new int[] { -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 };
vektorKeluaran.Add("yo", vektorYo);
int[] vektorRo = new int[] { -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 };
vektorKeluaran.Add("ro", vektorRo);
int[] vektorWo = new int[] { -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 };
vektorKeluaran.Add("wo", vektorWo);
int[] vektorN = new int[] { 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 };
vektorKeluaran.Add("n", vektorN);
Bitmap gambar1 = (Bitmap)pictureBox1.Image; Bitmap gambar2 = (Bitmap)pictureBox2.Image; Bitmap gambar3 = (Bitmap)pictureBox3.Image; Bitmap gambar4 = (Bitmap)pictureBox4.Image; Bitmap gambar5 = (Bitmap)pictureBox5.Image; List<Bitmap> listGambar = new List<Bitmap>(); List<int[]> listBiner = new List<int[]>(); listGambar.Add(gambar1);
listGambar.Add(gambar2); listGambar.Add(gambar3); listGambar.Add(gambar4); listGambar.Add(gambar5);
int[] vk = vektorKeluaran[inputNamaKarakter.Text]; for (int i = 0; i < 46; i++)
{
InputVektorKeluaran.AppendText(vk[i].ToString()); }
for (int i = 0; i < 5; i++) {
Bitmap gambar = listGambar[i]; int[] binerGambar = new int[10000];
(8)
lxxxiii
byte warna = 0; int counter = 0;
for (int y = 0; y < gambar.Height; y++) {
for (int x = 0; x < gambar.Width; x++) {
warna = gambar.GetPixel(x, y).R; if (warna > 0)
{
binerGambar[counter] = 1; }
else {
binerGambar[counter] = -1; }
counter += 1; }
}
listBiner.Add(binerGambar); }
List<int[,]> listBobotGambar = new List<int[,]>(); for (int iGambar = 0; iGambar < 5; iGambar++) {
int[,] bobotGambar = new int[10000, 46]; int[] vektorGambarKeluaran =
vektorKeluaran[inputNamaKarakter.Text];
int[] binerGambar = listBiner[iGambar]; for (int baris = 0; baris < 10000; baris++) {
for (int kolom = 0; kolom < 46; kolom++) {
bobotGambar[baris, kolom] = binerGambar[baris] * vektorGambarKeluaran[kolom];
} }
listBobotGambar.Add(bobotGambar); }
totalBobotKarakter = new int[10000, 46]; for (int baris = 0; baris < 10000; baris++) {
for (int kolom = 0; kolom < 46; kolom++) {
int totalCell = 0;
for (int iGambar = 0; iGambar < 5; iGambar++) {
totalCell = totalCell + listBobotGambar[iGambar][baris, kolom];
}
totalBobotKarakter[baris, kolom] = totalCell; }
}
if (tampilkanInformasi.Checked) {
informasi.ResetText();
informasi.AppendText("Total Bobot karakter "); informasi.AppendText(inputNamaKarakter.Text);
informasi.AppendText("\n\nYang ditampilkan hanya 1000 baris dari matriks total bobot !! \n\n");
for (int i = 0; i < 1000; i++) {
for (int j = 0; j < 46; j++) {
(9)
if (totalBobotKarakter[i, j] > 0) { informasi.AppendText(" "); informasi.AppendText(totalBobotKarakter[i, j].ToString()); } else { informasi.AppendText(totalBobotKarakter[i, j].ToString()); } } informasi.AppendText("\n"); } }
MessageBox.Show("Penghitungan bobot Selesai", "Pengitungan Bobot", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
private void simpanBobotKarakter_Click(object sender, EventArgs e) {
string path = inputDirektori.Text + "\\" + inputNamaKarakter.Text + ".txt";
using (System.IO.StreamWriter file = new System.IO.StreamWriter(@path))
{
for (int baris = 0; baris < 10000; baris++) {
for (int kolom = 0; kolom < 46; kolom++) {
if (kolom < 45) {
file.Write(totalBobotKarakter[baris, kolom].ToString() + ",");
} else { file.WriteLine(totalBobotKarakter[baris, kolom].ToString()); } } } }
MessageBox.Show("Bobot Karakter telah disimpan ke " +
inputDirektori.Text + "\\" + inputNamaKarakter.Text + ".txt", "Simpan bobot", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
private void hitungBobotMassal_Click(object sender, EventArgs e) {
List<string> daftarKarakter = new List<string>(); daftarKarakter.Add("a"); daftarKarakter.Add("ka"); daftarKarakter.Add("sa"); daftarKarakter.Add("ta"); daftarKarakter.Add("na"); daftarKarakter.Add("ha"); daftarKarakter.Add("ma"); daftarKarakter.Add("ya"); daftarKarakter.Add("ra"); daftarKarakter.Add("wa"); daftarKarakter.Add("i"); daftarKarakter.Add("ki"); daftarKarakter.Add("shi");
(10)
lxxxv
daftarKarakter.Add("chi"); daftarKarakter.Add("ni"); daftarKarakter.Add("hi"); daftarKarakter.Add("mi"); daftarKarakter.Add("ri"); daftarKarakter.Add("u"); daftarKarakter.Add("ku"); daftarKarakter.Add("su"); daftarKarakter.Add("tsu"); daftarKarakter.Add("nu"); daftarKarakter.Add("fu"); daftarKarakter.Add("mu"); daftarKarakter.Add("yu"); daftarKarakter.Add("ru"); daftarKarakter.Add("e"); daftarKarakter.Add("ke"); daftarKarakter.Add("se"); daftarKarakter.Add("te"); daftarKarakter.Add("ne"); daftarKarakter.Add("he"); daftarKarakter.Add("me"); daftarKarakter.Add("re"); daftarKarakter.Add("o"); daftarKarakter.Add("ko"); daftarKarakter.Add("so"); daftarKarakter.Add("to"); daftarKarakter.Add("no"); daftarKarakter.Add("ho"); daftarKarakter.Add("mo"); daftarKarakter.Add("yo"); daftarKarakter.Add("ro"); daftarKarakter.Add("wo"); daftarKarakter.Add("n");Dictionary<string, int[]> vektorKeluaran = new Dictionary<string, int[]>();
int[] vektorA = new int[] { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1 };
vektorKeluaran.Add("a", vektorA);
int[] vektorKa = new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1 };
vektorKeluaran.Add("ka", vektorKa);
int[] vektorSa = new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1 };
vektorKeluaran.Add("sa", vektorSa);
int[] vektorTa = new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1 };
vektorKeluaran.Add("ta", vektorTa);
int[] vektorNa = new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1 };
vektorKeluaran.Add("na", vektorNa);
int[] vektorHa = new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1 };
vektorKeluaran.Add("ha", vektorHa);
int[] vektorMa = new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -1 };
(11)
vektorKeluaran.Add("ma", vektorMa);
int[] vektorYa = new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1 };
vektorKeluaran.Add("ya", vektorYa);
int[] vektorRa = new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1 };
vektorKeluaran.Add("ra", vektorRa);
int[] vektorWa = new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1 };
vektorKeluaran.Add("wa", vektorWa);
int[] vektorI = new int[] { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 };
vektorKeluaran.Add("i", vektorI);
int[] vektorKi = new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 };
vektorKeluaran.Add("ki", vektorKi);
int[] vektorShi = new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 };
vektorKeluaran.Add("shi", vektorShi);
int[] vektorChi = new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 };
vektorKeluaran.Add("chi", vektorChi);
int[] vektorNi = new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 };
vektorKeluaran.Add("ni", vektorNi);
int[] vektorHi = new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 };
vektorKeluaran.Add("hi", vektorHi);
int[] vektorMi = new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 };
vektorKeluaran.Add("mi", vektorMi);
int[] vektorRi = new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, -1 };
vektorKeluaran.Add("ri", vektorRi);
int[] vektorU = new int[] { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 };
vektorKeluaran.Add("u", vektorU);
int[] vektorKu = new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, -1 };
vektorKeluaran.Add("ku", vektorKu);
int[] vektorSu = new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, -1 };
vektorKeluaran.Add("su", vektorSu);
int[] vektorTsu = new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, -1 };
(12)
lxxxvii
int[] vektorNu = new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, -1 };
vektorKeluaran.Add("nu", vektorNu);
int[] vektorFu = new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, -1 };
vektorKeluaran.Add("fu", vektorFu);
int[] vektorMu = new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, -1 };
vektorKeluaran.Add("mu", vektorMu);
int[] vektorYu = new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, -1 };
vektorKeluaran.Add("yu", vektorYu);
int[] vektorRu = new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, -1 };
vektorKeluaran.Add("ru", vektorRu);
int[] vektorE = new int[] { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 };
vektorKeluaran.Add("e", vektorE);
int[] vektorKe = new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, -1 };
vektorKeluaran.Add("ke", vektorKe);
int[] vektorSe = new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, -1 };
vektorKeluaran.Add("se", vektorSe);
int[] vektorTe = new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, -1 };
vektorKeluaran.Add("te", vektorTe);
int[] vektorNe = new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, -1 };
vektorKeluaran.Add("ne", vektorNe);
int[] vektorHe = new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, -1 };
vektorKeluaran.Add("he", vektorHe);
int[] vektorMe = new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, -1 };
vektorKeluaran.Add("me", vektorMe);
int[] vektorRe = new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, --1, -1 };
vektorKeluaran.Add("re", vektorRe);
int[] vektorO = new int[] { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 };
vektorKeluaran.Add("o", vektorO);
int[] vektorKo = new int[] { -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 };
(13)
int[] vektorSo = new int[] { -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 };
vektorKeluaran.Add("so", vektorSo);
int[] vektorTo = new int[] { -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 };
vektorKeluaran.Add("to", vektorTo);
int[] vektorNo = new int[] { -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 };
vektorKeluaran.Add("no", vektorNo);
int[] vektorHo = new int[] { -1, -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 };
vektorKeluaran.Add("ho", vektorHo);
int[] vektorMo = new int[] { -1, -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 };
vektorKeluaran.Add("mo", vektorMo);
int[] vektorYo = new int[] { -1, -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 };
vektorKeluaran.Add("yo", vektorYo);
int[] vektorRo = new int[] { -1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 };
vektorKeluaran.Add("ro", vektorRo);
int[] vektorWo = new int[] { -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 };
vektorKeluaran.Add("wo", vektorWo);
int[] vektorN = new int[] { 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 };
vektorKeluaran.Add("n", vektorN); informasi.ResetText();
for (int i = 0; i < 46; i++) {
string karakter = daftarKarakter[i];
informasi.AppendText("Proses karakter " + karakter + " .... "); Bitmap sampel1 = (Bitmap)Image.FromFile(@inputDirektori.Text +
"\\" + karakter + "1.jpg");
Bitmap sampel2 = (Bitmap)Image.FromFile(@inputDirektori.Text + "\\" + karakter + "2.jpg");
Bitmap sampel3 = (Bitmap)Image.FromFile(@inputDirektori.Text + "\\" + karakter + "3.jpg");
Bitmap sampel4 = (Bitmap)Image.FromFile(@inputDirektori.Text + "\\" + karakter + "4.jpg");
Bitmap sampel5 = (Bitmap)Image.FromFile(@inputDirektori.Text + "\\" + karakter + "5.jpg");
Bitmap sampel6 = (Bitmap)Image.FromFile(@inputDirektori.Text + "\\" + karakter + "6.jpg");
Bitmap sampel7 = (Bitmap)Image.FromFile(@inputDirektori.Text + "\\" + karakter + "7.jpg");
Bitmap sampel8 = (Bitmap)Image.FromFile(@inputDirektori.Text + "\\" + karakter + "8.jpg");
Bitmap sampel9 = (Bitmap)Image.FromFile(@inputDirektori.Text + "\\" + karakter + "9.jpg");
Bitmap sampel10 = (Bitmap)Image.FromFile(@inputDirektori.Text + "\\" + karakter + "10.jpg");
(14)
lxxxix
using (var newImage = ScaleImage(sampel1, 100, 100)) {
Bitmap gambar = new Bitmap(newImage); listSampel.Add(gambar);
}
using (var newImage = ScaleImage(sampel2, 100, 100)) {
Bitmap gambar = new Bitmap(newImage); listSampel.Add(gambar);
}
using (var newImage = ScaleImage(sampel3, 100, 100)) {
Bitmap gambar = new Bitmap(newImage); listSampel.Add(gambar);
}
using (var newImage = ScaleImage(sampel4, 100, 100)) {
Bitmap gambar = new Bitmap(newImage); listSampel.Add(gambar);
}
using (var newImage = ScaleImage(sampel5, 100, 100)) {
Bitmap gambar = new Bitmap(newImage); listSampel.Add(gambar);
}
using (var newImage = ScaleImage(sampel6, 100, 100)) {
Bitmap gambar = new Bitmap(newImage); listSampel.Add(gambar);
}
using (var newImage = ScaleImage(sampel7, 100, 100)) {
Bitmap gambar = new Bitmap(newImage); listSampel.Add(gambar);
}
using (var newImage = ScaleImage(sampel8, 100, 100)) {
Bitmap gambar = new Bitmap(newImage); listSampel.Add(gambar);
}
using (var newImage = ScaleImage(sampel9, 100, 100)) {
Bitmap gambar = new Bitmap(newImage); listSampel.Add(gambar);
}
using (var newImage = ScaleImage(sampel10, 100, 100)) {
Bitmap gambar = new Bitmap(newImage); listSampel.Add(gambar);
}
List<Bitmap> listSampelHitamPutih = new List<Bitmap>(); for (int iList = 0; iList < 10; iList++)
{
Bitmap gambarHitamPutih = new Bitmap(listSampel[iList]); byte red, green, blue, grayscale;
for (int y = 0; y < gambarHitamPutih.Height; y++) {
for (int x = 0; x < gambarHitamPutih.Width; x++) {
red = gambarHitamPutih.GetPixel(x, y).R; green = gambarHitamPutih.GetPixel(x, y).G; blue = gambarHitamPutih.GetPixel(x, y).B;
(15)
grayscale = Convert.ToByte((red + green + blue) / 3);
gambarHitamPutih.SetPixel(x, y, Color.FromArgb(grayscale, grayscale, grayscale));
} }
byte max = 0, min = 255, pixel, t; byte result;
for (int y1 = 0; y1 < gambarHitamPutih.Height; y1++) {
for (int x1 = 0; x1 < gambarHitamPutih.Width; x1++) {
pixel = gambarHitamPutih.GetPixel(x1, y1).R; if (pixel > max)
{
max = pixel; }
if (pixel < min) {
min = pixel; }
} }
t = 220;
for (int y2 = 0; y2 < gambarHitamPutih.Height; y2++) {
for (int x2 = 0; x2 < gambarHitamPutih.Width; x2++) {
pixel = gambarHitamPutih.GetPixel(x2, y2).R; if (pixel > t)
{
result = 255; }
else {
result = 0; }
gambarHitamPutih.SetPixel(x2, y2, Color.FromArgb(result, result, result));
} }
listSampelHitamPutih.Add(gambarHitamPutih); }
List<int[]> listSampleBiner = new List<int[]>();
for (int iHitamPutih = 0; iHitamPutih < 10; iHitamPutih++) {
Bitmap sampleHitamPutih = listSampelHitamPutih[iHitamPutih];
int[] binerGambar = new int[10000]; byte warna = 0;
int counter = 0;
for (int y = 0; y < sampleHitamPutih.Height; y++) {
for (int x = 0; x < sampleHitamPutih.Width; x++) {
warna = sampleHitamPutih.GetPixel(x, y).R; if (warna > 0)
{
binerGambar[counter] = 1; }
(16)
xci
{
binerGambar[counter] = -1; }
counter += 1; }
}
listSampleBiner.Add(binerGambar); }
List<int[,]> listBobotGambar = new List<int[,]>(); for (int iGambar = 0; iGambar < 10; iGambar++) {
int[,] bobotGambar = new int[10000, 46];
int[] vektorGambarKeluaran = vektorKeluaran[karakter]; int[] binerGambar = listSampleBiner[iGambar];
for (int baris = 0; baris < 10000; baris++) {
for (int kolom = 0; kolom < 46; kolom++) {
bobotGambar[baris, kolom] = binerGambar[baris] * vektorGambarKeluaran[kolom];
} }
listBobotGambar.Add(bobotGambar); }
int[,] totalBobotSampelKarakter = new int[10000, 46]; for (int baris = 0; baris < 10000; baris++)
{
for (int kolom = 0; kolom < 46; kolom++) {
int totalCell = 0;
for (int iGambar = 0; iGambar < 10; iGambar++) {
totalCell = totalCell + listBobotGambar[iGambar][baris, kolom];
}
totalBobotSampelKarakter[baris, kolom] = totalCell; }
}
string path = inputDirektori.Text + "\\" + karakter + ".txt"; using (System.IO.StreamWriter file = new
System.IO.StreamWriter(@path)) {
for (int baris = 0; baris < 10000; baris++) {
for (int kolom = 0; kolom < 46; kolom++) {
if (kolom < 45) {
file.Write(totalBobotSampelKarakter[baris, kolom].ToString() + ",");
} else { file.WriteLine(totalBobotSampelKarakter[baris, kolom].ToString()); } } } }
informasi.AppendText("Karakter " + karakter + " selesai di proses !!\n");
(17)
}
MessageBox.Show("Proses bobot semua karakter telah selesai", "Proses banyak karakter", MessageBoxButtons.OK, MessageBoxIcon.Information); }
private void hitungTotalBobotMassal_Click(object sender, EventArgs e) {
List<string> daftarKarakter = new List<string>(); daftarKarakter.Add("a"); daftarKarakter.Add("ka"); daftarKarakter.Add("sa"); daftarKarakter.Add("ta"); daftarKarakter.Add("na"); daftarKarakter.Add("ha"); daftarKarakter.Add("ma"); daftarKarakter.Add("ya"); daftarKarakter.Add("ra"); daftarKarakter.Add("wa"); daftarKarakter.Add("i"); daftarKarakter.Add("ki"); daftarKarakter.Add("shi"); daftarKarakter.Add("chi"); daftarKarakter.Add("ni"); daftarKarakter.Add("hi"); daftarKarakter.Add("mi"); daftarKarakter.Add("ri"); daftarKarakter.Add("u"); daftarKarakter.Add("ku"); daftarKarakter.Add("su"); daftarKarakter.Add("tsu"); daftarKarakter.Add("nu"); daftarKarakter.Add("fu"); daftarKarakter.Add("mu"); daftarKarakter.Add("yu"); daftarKarakter.Add("ru"); daftarKarakter.Add("e"); daftarKarakter.Add("ke"); daftarKarakter.Add("se"); daftarKarakter.Add("te"); daftarKarakter.Add("ne"); daftarKarakter.Add("he"); daftarKarakter.Add("me"); daftarKarakter.Add("re"); daftarKarakter.Add("o"); daftarKarakter.Add("ko"); daftarKarakter.Add("so"); daftarKarakter.Add("to"); daftarKarakter.Add("no"); daftarKarakter.Add("ho"); daftarKarakter.Add("mo"); daftarKarakter.Add("yo"); daftarKarakter.Add("ro"); daftarKarakter.Add("wo"); daftarKarakter.Add("n");
int[,] bobotAkhir = new int[10000, 46]; for (int i = 0; i < 46; i++)
{
string fileBobotKarakter = inputDirektori.Text + "\\" + daftarKarakter[i] + ".txt";
if (!File.Exists(@fileBobotKarakter)) {
MessageBox.Show("File Bobot Karakter belum lengkap, hitung dahulu bobot karakter", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
(18)
xciii
break; }
else {
System.IO.StreamReader file = new System.IO.StreamReader(@fileBobotKarakter);
for (int baris = 0; baris < 10000; baris++) {
string line = file.ReadLine(); string[] isiFile = line.Split(','); for (int kolom = 0; kolom < 46; kolom++) {
bobotAkhir[baris, kolom] = bobotAkhir[baris, kolom] + Convert.ToInt16(isiFile[kolom]);
} }
}
}
string path = inputDirektori.Text + "\\bobot_total.txt"; using (System.IO.StreamWriter file = new
System.IO.StreamWriter(@path)) {
for (int baris = 0; baris < 10000; baris++) {
for (int kolom = 0; kolom < 46; kolom++) {
if (kolom < 45) {
file.Write(bobotAkhir[baris, kolom].ToString() + ","); } else { file.WriteLine(bobotAkhir[baris, kolom].ToString()); } } } }
MessageBox.Show("Proses penghitungan bobot total telah selesai\n " + path, "Proses banyak karakter", MessageBoxButtons.OK,
MessageBoxIcon.Information); }
private void bukaFile_Click(object sender, EventArgs e) {
filePengujianDialog.ShowDialog();
string fileName = filePengujianDialog.FileName; pathFileLabel.Text = fileName;
pbAsli.Image = Image.FromFile(@fileName);
using (var newImage = ScaleImage(pbAsli.Image, 100, 100)) {
Bitmap gbr = new Bitmap(newImage); pbAsli.Image = gbr;
}
pbNormal.Image = Image.FromFile(@fileName);
using (var newImage = ScaleImage(pbNormal.Image, 100, 100)) {
Bitmap gbrN = new Bitmap(newImage); pbNormal.Image = gbrN;
}
Bitmap gambar = (Bitmap)pbNormal.Image; byte red, green, blue, grayscale;
(19)
for (int y = 0; y < gambar.Height; y++) {
for (int x = 0; x < gambar.Width; x++) {
red = gambar.GetPixel(x, y).R; green = gambar.GetPixel(x, y).G; blue = gambar.GetPixel(x, y).B;
grayscale = Convert.ToByte((red + green + blue) / 3); gambar.SetPixel(x, y, Color.FromArgb(grayscale, grayscale, grayscale));
} }
byte max = 0, min = 255, pixel, t; byte result;
for (int y1 = 0; y1 < gambar.Height; y1++) {
for (int x1 = 0; x1 < gambar.Width; x1++) {
pixel = gambar.GetPixel(x1, y1).R; if (pixel > max)
{
max = pixel; }
if (pixel < min) {
min = pixel; }
} }
t = 220;
for (int y2 = 0; y2 < gambar.Height; y2++) {
for (int x2 = 0; x2 < gambar.Width; x2++) {
pixel = gambar.GetPixel(x2, y2).R; if (pixel > t)
{
result = 255; }
else {
result = 0; }
gambar.SetPixel(x2, y2, Color.FromArgb(result, result, result));
} }
pbNormal.Image = gambar; }
private void lakukanPengujian_Click(object sender, EventArgs e) {
List<string> daftarKarakter = new List<string>(); daftarKarakter.Add("a ア");
daftarKarakter.Add("ka "); daftarKarakter.Add("sa サ"); daftarKarakter.Add("ta タ"); daftarKarakter.Add("na "); daftarKarakter.Add("ha "); daftarKarakter.Add("ma "); daftarKarakter.Add("ya ヤ"); daftarKarakter.Add("ra ");
(20)
xcv
daftarKarakter.Add("wa ワ"); daftarKarakter.Add("i イ"); daftarKarakter.Add("ki キ"); daftarKarakter.Add("shi シ"); daftarKarakter.Add("chi チ"); daftarKarakter.Add("ni "); daftarKarakter.Add("hi ヒ"); daftarKarakter.Add("mi "); daftarKarakter.Add("ri "); daftarKarakter.Add("u ウ"); daftarKarakter.Add("ku ク"); daftarKarakter.Add("su ス"); daftarKarakter.Add("tsu ツ"); daftarKarakter.Add("nu "); daftarKarakter.Add("fu フ"); daftarKarakter.Add("mu "); daftarKarakter.Add("yu ユ"); daftarKarakter.Add("ru "); daftarKarakter.Add("e エ"); daftarKarakter.Add("ke ケ"); daftarKarakter.Add("se セ"); daftarKarakter.Add("te テ"); daftarKarakter.Add("ne "); daftarKarakter.Add("he ヘ"); daftarKarakter.Add("me "); daftarKarakter.Add("re "); daftarKarakter.Add("o "); daftarKarakter.Add("ko コ"); daftarKarakter.Add("so ソ"); daftarKarakter.Add("to ト"); daftarKarakter.Add("no "); daftarKarakter.Add("ho ホ"); daftarKarakter.Add("mo "); daftarKarakter.Add("yo "); daftarKarakter.Add("ro "); daftarKarakter.Add("wo "); daftarKarakter.Add("n ");
int[] binerGambarUji = new int[10000]; Bitmap gambar = (Bitmap)pbNormal.Image; byte warna = 0;
int counter = 0;
for (int y = 0; y < gambar.Height; y++) {
for (int x = 0; x < gambar.Width; x++) {
warna = gambar.GetPixel(x, y).R; if (warna > 0)
{
binerGambarUji[counter] = 1; }
else {
binerGambarUji[counter] = -1; }
counter += 1; }
}
(21)
string pathBobotTotal = inputDirektori.Text + "\\bobot_total.txt"; if (File.Exists(pathBobotTotal))
{
System.IO.StreamReader file = new System.IO.StreamReader(pathBobotTotal);
for (int baris = 0; baris < 10000; baris++) {
string line = file.ReadLine(); string[] isiFile = line.Split(','); for (int kolom = 0; kolom < 46; kolom++) {
bobotTotal[baris, kolom] = Convert.ToInt16(isiFile[kolom]);
} }
int[] hasilKali = new int[46];
for (int kolom = 0; kolom < 46; kolom++) {
int isiHasilkali = 0;
for (int baris = 0; baris <10000; baris ++) {
isiHasilkali += bobotTotal[baris, kolom] * binerGambarUji[baris];
}
hasilKali[kolom] = isiHasilkali; }
int max = hasilKali[0];
informasiUji.AppendText("Hasil Perkalian vektor\n\n"); for (int x = 0; x < 46; x++)
{
if (hasilKali[x] > max) {
max = hasilKali[x]; }
informasiUji.AppendText(hasilKali[x].ToString() + " "); }
informasiUji.AppendText("\n\n"); int[] hasilAktivasi = new int[46];
string vk = "";
for (int y = 0; y < 46; y++) {
if (hasilKali[y] == max) {
hasilAktivasi[y] = 1; }
else {
hasilAktivasi[y] = -1; }
vk = vk + " " + hasilAktivasi[y].ToString(); }
vektorKeluarLabel.Text = vk; int indexKarakter = 0; for (int z = 0; z < 46; z++) {
if (hasilAktivasi[z] == 1) {
indexKarakter = z - 45; if (indexKarakter < 0) {
indexKarakter = indexKarakter * -1; }
(22)
xcvii
break; }
}
string karakterHasil = daftarKarakter[indexKarakter]; namaKarakterKeluaranLabel.Text = karakterHasil; }
else {
MessageBox.Show("File Bobot Total tidak ditemukan !!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
} } } }
(23)
DAFTAR PUSTAKA
Ahmad, Usman. 2005. Pengolahan Citra Digital dan Teknik Pemrogramannya.
Yokyakarta : Graha Ilmu.
Bishop, Christopher M. 1999. Pattern Recognition and Feed-forward Network.
Cambridge, U.K. : Microsoft Research.
Bishop, Christopher M. 1996. Neural Networks: A Pattern Recognition Perspective.
Birmingham, U.K. : Aston University.
Bishop, Christopher M. 1995. Neural Networks for Pattern Recognition. Oxford:
Clarendon Press.
Ginting, Jakup. 2014. Implementasi Jaringan Saraf Tiruan Untuk Pengenalan Pola
dan Penerjemahan Aksara Karo Dengan Metode Associative Memory Tipe
Hetero-Association. Skripsi. Medan, Indonesia : Universitas Sumatera
Utara.
Hermawan, Arief. 2006 . Jaringan Saraf Tiruan Teori dan Aplikasi. Yogyakarta :
Andi Offset.
Kosko, Bart. 1987. Adaptive Bidirectional Associative Memory. Applied Optics
Journal Vol 26 Issue 23: 4947-4960.
Kurniati, Yayang. 2015. Implementasi Metode Bidirectional Associative Memory
Pada Absensi Berbasis Identifikasi Wajah. Skripsi. Medan, Indonesia :
Universitas Sumatera Utara.
Puspitaningrum, D. 2006. Pengantar Jaringan Saraf Tiruan. Yokyakarta : Penerbit
Andi.
Rao, Valluru B. 1995. C++ Neural Networks and Fuzzy Logic. MTBooks, IDG Books
Worldwide, Inc.
Rojas, Raul. 1996. Neural Networks A Systematic Introduction. Berlin :
Springer-Verlag.
Romauli, Tika Siregar. 2015. Implementasi Jaringan Syaraf Metode Bidirectional
Associative Memory. Skripsi. Medan, Indonesia : Universitas Sumatera
Utara.
(24)
xxxiii
BAB III
ANALISIS DAN PERANCANGAN SISTEM
3.1
Analisis Sistem
Tahap ini bertujuan memberikan gambaran yang jelas terhadap sistem yang akan
dibangun. Tahap ini menjabarkan kebutuhan-kebutuhan yang berguna untuk
perancangan sistem agar sistem yang dibangun sesuai dengan masalah yang akan
diselesaikan.
3.1.1
Analisis Masalah
Permasalahan yang akan diselesaikan dengan menggunakan sistem ini adalah
pengenalan pola citra aksara Katakana. Citra aksara Katakana didapatkan melalui
proses scanning tulisan tangan aksara Katakana dan dikonversi ke dalam citra digital.
Sebelum diolah, citra digital harus melalui beberapa tahap pengolahan citra
seperti proses pengubahan ukuran serta proses pengubahan warna citra. Melalui
proses ini akan diperoleh nilai dari citra yang selanjutnya akan digunakan untuk
pengenalan pola dengan jaringan saraf tiruan.
Sistem ini menggunakan metode jaringan saraf tiruan associative memory tipe
hetero-associative. Metode ini akan mengasosiasikan input dengan output yang telah
disediakan sebelumnya. Dalam metode ini akan dilakukan proses pelatihan untuk
melatih sistem agar dapat mengenali masukan citra aksara Katakana serta proses
pengujian untuk menguji apakah sistem mampu mengenali pola citra aksara Katakana
baik itu dalam kondisi baik ataupun cacat (noisy).
Banyaknya data pelatihan adalah 460 (masing-masing 10 data dari 46 pola
karakter), terdiri dari 46 huruf.
Analisis permasalahan lebih lanjut dijelaskan melalui Diagram Ishikawa yang
dapat dilihat pada Gambar 3.1.
(25)
Pengenalan pola Metode
Material
Metode pengenalan pola yang digunakan masih manual
Memerlukan contoh sampel aksara untuk diproses Membutuhkan aksara yang asli
untuk dicocokkan
Aksara Katakana
Bentuk aksara yang unik mempersulit penerjemahan
Gambar 3.1 Diagram Ishikawa
3.1.2
Analisis Persyaratan (Requirement Analysis)
Analisis persyaratan dilakukan untuk mengidentifikasikan dan menyatakan
persyaratan. Analisis persyaratan terdiri atas dua bagian yaitu analisis persyaratan
fungsional (functional requirement) dan analisis persyaratan nonfungsional
(nonfunctional requirement). Persyaratan fungsional adalah deskripsi mengenai
aktivitas dan layanan yang harus diberikan / disediakan oleh sebuah sistem, dan
persyaratan nonfungsional merupakan deskripsi mengenai fitur, karakteristik, dan
batasan lainnya yang menentukan apakah sistem memuaskan atau tidak. Kedua
analisis ini merupakan hal penting untuk menentukan hal-hal yang harus dimiliki
sistem.
3.1.2.1
Analisis Persyaratan Fungsional
Analisis fungsional dibutuhkan untuk mengetahui hal-hal yang bisa dikerjakan oleh
sistem. Dalam pengenalan pola karakter aksara Katakana dengan metode associative
memory tipe hetero-associative ini, persyaratan fungsional yang harus dipenuhi,
antara lain:
1.
File citra aksara Katakana yang akan diproses adalah file citra yang berformat
*.jpg.
3.1.2.2
Analisis Persyaratan Nonfungsional
Analisis persyaratan nonfungsional berhubungan dengan hal-hal berikut ini:
1.
Performa
(26)
xxxv
Perangkat lunak yang akan dibangun dapat menunjukkan hasil dari proses
pelatihan dan pengenalan pola aksara Katakana yang dilakukan oleh sistem.
2.
Mudah dipelajari dan digunakan
Perangkat lunak yang akan dibangun harus sederhana agar mudah dipelajari oleh
pengguna (user).
3.
Hemat biaya
Perangkat lunak yang dibangun tidak memerlukan perangkat tambahan ataupun
perangkat pendukung dalam proses eksekusinya.
4.
Dokumentasi
Perangkat lunak yang akan dibangun dapat menyimpan nilai citra saat proses
pengolahan citra serta nilai bobot yang dihasilkan saat citra dilatih. Persen akurasi
yang diperoleh saat proses pengujian akan disimpan pada perangkat lunak ini.
5.
Manajemen kualitas
Perangkat lunak yang akan dibangun akan memiliki kualitas yang baik yaitu
proses pengolahan citra, pelatihan, dan pengujian yang relatif cepat.
6.
Kontrol
Perangkat lunak yang dibangun akan menampilkan message error (pesan
kesalahan) jika pengguna tidak lengkap memasukkan masukan ataupun jika
masukan yang dimasukkan salah.
3.2
Pemodelan Sistem
Secara umum, sistem pengenalan pola karakter aksara Katakana ini terdiri dari 2
proses, yaitu proses pelatihan dan proses pengujian. Pemodelan system pada
penelitian ini menggunakan UML (Unified Modeling Language) yang mencakup use
case diagram, activity diagram, dan sequence diagram. UML merupakan satu
kumpulan konvensi pemodelan yang digunakan untuk menentukan atau
menggambarkan sebuah sistem software yang terkait dengan objek.
3.2.1 Use Case Diagram
Use Case Diagram menggambarkan fungsionalitas yang diharapkan dari sistem,
kebutuhan sistem dari sudut pandang user, dan interaksi antara sistem dan pengguna.
Use Case merupakan alat bantu terbaik untuk menjelaskan kepada pengguna cara
(27)
kerja sebuah sistem. Use Case diawali oleh pengguna yang disebut Actor yang
menginisiasi kegiatan sistem yaitu sebuah use case. Diagram use case menunjukkan 3
aspek dari sistem yaitu: actor, use case, dan system/sub system boundary.
Gambaran use case diagram untuk sistem yang akan dibangun dapat dilihat pada
Gambar 3.2.
Pelatihan
Pengujian
User
<<uses>>
<<uses>>
Sistem
Gambar 3.2 Use Case Diagram Sistem
User memiliki control untuk melakukan beberapa fungsi yang diinginkan,
yaitu pelatihan dan pengujian. Pada pelatihan terjadi beberapa fungsi yaitu
pengolahan citra dimana citra RGB dirubah ke citra biner, kemudian diambil nilainya.
Nilai tersebut kemudian diasosiasikan dengan aksaranya sehingga didapatkan bobot.
Pada pengujian fungsi yang terjadi yaitu pengolahan citra, hasil pengolahan citra
dikalikan dengan bobot yang didapat dari proses pengujian kemudian dimasukkan
fungsi aktivasinya.
Dokumentasi naratif use case pelatihan dan pengujian dapat dilihat pada Tabel 3.1
dan Tabel 3.2.
(28)
xxxvii
Tabel 3.1 Dokumentasi Naratif Use Case Pelatihan Sistem
Nama Use Case
Pelatihan Sistem
Aktor
Programmer dan user
Deskripsi
Use case ini mendeskripsikan proses pelatihan sistem
Prakondisi
Sudah masuk dalam tampilan antarmuka Pelatihan
Bidang khas
Kegiatan user
Respon system
1.
Atur alamat direktori
gambar sampel
2.
Tekan tombol buka citra
3.
Tekan tombol ubah
ukuran
4.
Tekan tombol
normalisasi warna
5.
Tekan tombol hitung
bobot
6.
Tekan tombol simpan
bobot karakter
7.
Tekan tombol hitung
total bobot semua
karakter
1.
Sistem
menyimpan
alamat direktori gambar
sampel
2.
Sistem membuka citra
dan menampilkannya
3.
Sistem mengubah ukuran
citra yang ditampilkan
4.
Sistem mengubah citra
aksara ke citra biner
5.
Sistem melatih citra
6.
Sistem menyimpan nilai
bobot
7.
Sistem menghitung nilai
keseluruhan bobot
karakter
Bidang alternatif
1. Tekan tab proses
pengujian
1. Sistem menampilkan
form proses pengujian
Post-kondisi
Sistem telah menyimpan hasil proses pelatihan
Tabel 3.2 Dokumentasi Naratif Use Case Pengujian Sistem
Nama Use Case
Pengujian Sistem
Aktor
User
Deskripsi
Use case ini mendeskripsikan proses pengujian sistem
Prakondisi
Sudah masuk dalam tampilan antarmuka pengujian
Bidang khas
Kegiatan user
Respon system
1.
Tekan tombol buka file
2.
Tekan tombol lakukan
pengujian
1.
Sistem menampilkan
antarmuka pengambilan
gambar dan menampilkan
citra aksara yang dipilih
2.
Sistem melakukan proses
pengujian dan pengenalan
serta memberikan hasil
citra
(29)
pelatihan
form proses pelatihan
Post-kondisi
Sistem menampilkan hasil dari citra aksara yang diuji
3.2.2 Activity Diagram (Diagram Aktivitas)
Activity Diagram adalah bentuk visual dari jalur kerja yang berisi tindakan dan
aktivitas yang juga dapat berisi pilihan atau pengulangan. Dengan kata lain, diagram
ini menggambarkan alur aktivitas dari sebuah sistem secara garis besar. Activity
Diagram digunakan untuk menganalisa proses dari sebuah sistem. Pada sistem ini
terdapat dua proses utama yaitu proses pelatihan citra dan proses pengujian.
(30)
xxxix
Gambar 3.3 Activity Diagram Pelatihan
Pada Gambar 3.3 dapat dilihat bahwa user membuka citra yang akan dilatih,
kemudian dilakukan pra pengolahan citra. Setelah citra diolah diambil nilai binernya
dalam bentuk vektor, kemudian ditranspose dan dikalikan dengan vektor abjad. Hasil
akumulasi perkalian keseluruhannya menjadi bobot. Bila keseluruhan proses berhasil,
maka sistem menampilkan dialog menyatakan proses pelatihan berhasil.
Activity Diagram dari proses pengujian dapat dilihat pada Gambar 3.4
User menentukan alamat direktori gambar sampel
User Sistem
Sistem menyimpan alamat direktori gambar sampel
User menekan tombol buka citra
Membuka dan menampilkan citra pada aplikasi
User menekan tombol ubah ukuran
Sistem melakukan proses pengubahan ukuran citra
User menekan tombol normalisasi warna
Sistem mengkonversi citra RGB ke citra biner
Sistem mengubah nilai fitur citra ke dalam vektor User menekan tombol hitung bobot
Sistem melakukan perkalian transpose antara vektor citra dan vektor abjad
Sistem mengakumulasikan semua hasil perkalian dari sampel sehingga menjadi bobot
Sistem menyimpan hasil bobot
Sistem menampilkan keterangan berhasil User menekan tombol simpan bobot karakter
(31)
Gambar 3.4 Activity Diagram Pengujian
Pada Gambar 3.4 dapat dilihat bahwa user tetap memilih serta melakukan
proses pra pengolahan citra pada citra aksara. Setelah citra diproses dan didapat nilai
vektornya, kemudian user menekan tombol uji untuk memulai proses perkalian antara
vektor citra dengan bobot yang kita dapat dari proses pelatihan. Jika proses ini
berhasil maka sistem akan menampilkan dialog menyakan proses pengujian berhasil
dan akan menampilkan abjad sesuai dengan nilai yang diperoleh dari hasil pengujian.
3.2.3 Sequence Diagram
User
User menekan tombol buka file opendialog untuk memilih citra
Sistem
User memilih citra yang akan diuji
Sistem melakukan proses mengubah ukuran citra
Sistem mengubah citra RGB ke citra biner
Sistem mengubah nilai citra ke vektor User menekan tombol lakukan pengujian
Sistem melakukan proses perkalian antara vektor citra dengan vektor bobot
Sistem menampilkan abjad Sistem memasukkan fungsi aktivasi
(32)
xli
Sequence Diagram menjelaskan interaksi antar objek yang terdapat dalam suatu
sistem dan terjadi komunikasi berupa pesan yang disusun berdasarkan urutan waktu.
Sederhananya sequence diagram adalah gambaran tahap demi tahap, termasuk
kronologi (urutan) perubahan secara logis dari sistem. Objek-objek tersebut diurutkan
dari kiri ke kanan, actor yang menginisiasi interaksi biasanya ditaruh di paling kiri
dari diagram.
Sequence Diagram dari sistem dapat dilihat pada Gambar 3.5
User
Pelatihan Pengujian
Pra Pengolahan Citra Aksara
Binerisasi Nilai Biner Aksara
Latih Bobot dan Error
Pra Pengolahan Nilai Aksara dalam Vektor
Uji Abjad
Gambar 3.5 Sequence Diagram Sistem
Pada Gambar 3.5 menunjukkan bahwa pertama sistem akan melakukan proses
pelatihan. Pada proses pelatihan terdapat beberapa proses yaitu pra pengolahan dan
binerisasi yang akan menghasilkan nilai bobot. Setelah proses pelatihan selesai
dilanjutkan ke proses pengujian dimana terjadi proses pra pengolahan citra dan proses
pengujian yang akan menghasilkan abjad aksara.
3.3
Flowchart Sistem
Flowchart adalah penyajian yang sistematis tentang proses dan logika dari kegiatan
penanganan informasi atau penggambaran secara grafik dari langkah-langkah dan
(33)
urut-urutan prosedur dari suatu program. Flowchart menolong analisis dan
programmer untuk memecahkan masalah ke dalam segmen-segmen yang lebih kecil
dan menolong dalam menganalisis alternative-alternatif lain dalam pengoperasian.
Flowchart berisi gambar atau bagan yang memperlihatkan urutan dan hubungan antar
proses beserta pernyataannya. Setiap simbol pada flowchart menggambarkan proses
tertentu, dan antara proses digambarkan dengan garis penghubung.
Aplikasi yang akan dibangun ini mempunyai skema yang bisa digambarkan
dengan flowchart. Pada flowchart dapat kita lihat ada 2 proses utama yaitu proses
pelatihan pada sebelah kiri dan proses pengujian pada sebelah kanan. Pada proses
pelatihan, semua sampel dalam bentuk citra jpeg akan diolah untuk memperoleh citra
biner. Citra biner akan diasosiasikan dengan abjad aksaranya sehingga memperoleh
bobot yang akan diakumulasikan.
Pada proses pengujian, bobot yang telah diakumulasi sehingga menjadi bobot
total akan dikalikan dengan citra biner aksara yang akan diuji. Dan dari proses itu
akan diketahui apakah pola dikenali atau tidak dan hasil pengujiannya akan
ditampilkan oleh program. Proses sistem mulai dari proses pelatihan sampai proses
pengujian dapat dilihat pada Gambar 3.6.
(34)
xliii
Mulai
For i=1:460 Masukkan aksara katakana
dalam bentuk citra jpeg
Pra pengolahan citra jpeg
Citra diolah untuk memperoleh citra
biner
Asosiasikan nilai citra biner aksara katakana dengan nilai pasangannya
(abjad)
Hasil akumulasi
bobot
Pengujian berhasil dan
ditampilkan abjad dari citra
aksara katakana
Selesai
Apakah i=460? Tidak
Apakah Pola Dikenali?
Ya
Tidak
Ya Citra biner
For i:1:460 Citra diuji dengan
melakukan perkalian antara citra biner aksara
dan bobot total
Gambar 3.6 Flowchart
Proses Pelatihan dan Pengujian
(35)
Pseudocode adalah deskripsi dari algoritma yang menggunakan struktur sederhana
dari bahasa pemrograman yang ditujukan agar dapat dipahami oleh manusia. Tujuan
penggunaannya adalah untuk memudahkan dalam memahami prinsip kerja dari suatu
algoritma.
3.4.1 Pseudocode Proses Pelatihan JST
SCALING DAN BINERISASI
citra_aksara ← imread(nama_file)
citra_aksara ← imresize(citra_aksara,[100 100]); Gray ← rgb2gray(citra_aksara);
thresh ← graythresh(gray);
citra_biner ← im2bw(gray,thresh); PELATIHAN
total_bobot ←0 for m=1:46 for n=1:10
for b=1:168
if ekstraksi_aksara(1,b)==0 ekstraksi_aksara(1,b)=-1; end
end
bobot(m)(n) ← ekstraksi_aksara(m)(n)T
.nilai_abjad(m) total_bobot = total_bobot + bobot(m)(n)
end end
3.4.2 Pseudocode Proses Pengujian JST
SCALING DAN BINERISASI
citra_aksara ← imread(nama_file)
citra_aksara ← imresize(citra_aksara,[100 100]); Gray ← rgb2gray(citra_aksara);
thresh ← graythresh(gray);
citra_biner ← im2bw(gray,thresh); PENGUJIAN
(36)
xlv
for n=1:10
for b=1:168
if ekstraksi_aksara(1,b)==0 ekstraksi_aksara(1,b)=-1; end
end
hasil_uji(m)(n) ← ekstraksi_aksara(m)(n).total_bobot if hasil_uji(m)(n) == nilai_abjad
disp(Abjad) else
disp(“Gagal”) end
end
3.5
Perancangan Antarmuka (Interface) Sistem
Merupakan mekanisme komunikasi antara pengguna (user) dengan sistem.
Antarmuka pemakai dapat menerima informasi dari pengguna dan memberikan
informasi kepada pengguna untuk membantu mengarahkan alur penelusuran masalah
(37)
sampai ditemukan suatu solusi. Antarmuka sistem yang akan dibangun menggunakan
Bahasa Pemograman Microsoft Visual Studio 2010 (C#).
Untuk perancangan antarmuka pemakai akan dirancang kedalam form. Ada 2
form utama yang dimiliki sistem yaitu form pelatihan dan form pengujian. Pada
penjelasan masing-masing form akan dibahas secara detail sebagai berikut.
3.5.1 Form Pelatihan
Form inilah yang ditampilkan jika user ingin melakukan pelatihan citra. Tampilan
rancangan form pelatihan dapat dilihat pada Gambar 3.7.
Form Pelatihan
Buka Citra Ubah Ukuran
Latih
Reset Bobot
Binerisasi Ekstraksi Fitur Citra
Informasi 1
2
3 4
5
6
7 8
9
Gambar 3.7 Form Pelatihan
Komponen yang digunakan pada form pelatihan berdasarkan Gambar 3.7 terdiri dari :
1.
PictureBox (Citra)
Berfungsi untuk menampilkan citra yang ingin diolah dan hasil olahannya.
2.
TextBox
Berfungsi untuk menentukan citra yang akan ditampilkan dan diolah.
3.
Button (Buka Citra)
(38)
xlvii
4.
Button (Ubah Ukuran)
Berfungsi untuk mengubah ukuran citra yang akan diolah.
5.
Button (Latih)
Berfungsi untuk melatih citra yang telah diekstraksi fiturnya.
6.
Button (Reset Bobot)
Berfungsi untuk mereset nilai bobot menjadi nol.
7.
Button (Binerisasi)
Berfungsi untuk mengubah citra RGB ke citra biner.
8.
Button (Ekstraksi Fitur)
Berfungsi untuk mengekstraksi fitur citra yang telah dibinerisasi.
9.
TextBox (Informasi)
Berfungsi untuk menampilkan keterangan tentang proses pengolahan dan
pelatihan citra.
3.5.2 Form Pengujian
Pada form ini, citra akan diuji apakah dapat dikenali atau tidak dikenali oleh sistem.
Tampilan rancangan form pengujian dapat dilihat pada Gambar 3.8.
Form Pengujian
Buka Citra Uji Uji Banyak
Citra Uji Hasil Uji
1
2 3 4
5
6
7 Jumlah Karakter yang Berhasil Dikenali
Persentase Akurasi
Gambar 3.8 Form Pengujian
(39)
1.
PictureBox (Citra)
Berfungsi untuk menampilkan citra yang akan diolah dan diuji.
2.
Button (Buka Citra)
Berfungsi untuk membuka file citra yang akan diolah dan diuji.
3.
Button (Uji)
Berfungsi untuk menguji citra apakah dapat dikenali atau tidak.
4.
Button (Uji Banyak)
Berfungsi untuk menguji keseluruhan citra yang terdapat di penyimpanan data
apakah dapat dikenali atau tidak.
5.
Label (Abjad Citra)
Berfungsi untuk menampilkan abjad dari citra yang telah diolah dan diuji.
6.
TextBox (Jumlah Karakter yang Berhasil Dikenali)
Berfungsi untuk menampilkan jumlah karakter yang berhasil dikenali.
7.
TextBox (Persentase Akurasi)
(40)
xlix
BAB IV
IMPLEMENTASI DAN PENGUJIAN SISTEM
4.1
Implementasi Sistem
Implementasi sistem merupakan kelanjutan dari tahap perancangan. Implementasi
merupakan suatu tahap penerapan algoritma kedalam suatu program yang telah
dirancang. Sedangkan pengujian merupakan suatu proses uji coba suatu program yang
telah diimplementasikan dengan algoritma untuk mendapatkan hasil yang sesuai
dengan yang diharapkan oleh pengguna. Implementasi dilakukan berdasarkan
perancangan yang dilakukan sebelumnya. Perancanagn sistem yang baik akan
memudahkan pengembangan sistem dalam tahap implementasi.
Komponen yang dibutuhkan dalam pengimplementasian sistem ini adalah
sebagai berikut :
1.
Hardware (Perangkat Keras)
Hardware (Perangkat Keras) adalah komponen-komponen peralatan yang membentuk
suatu sistem komputer sehingga dapat melaksanakan tugasnya. Adapun hardware
yang digunakan untuk menjalankan aplikasi ini adalah :
a.
Processor Intel Core i5
b.
Memory (RAM) 2 GB
c.
Hardisk 500 GB
d.
Mouse dan Keyboard
2.
Software (Perangkat Lunak)
Software (Perangkat Lunak) adalah sekumpulan intruksi yang telah diprogram terlebih
dahulu secara rinci, untuk mengendalikan dan mengkoordinasikan kerja
elemen-elemen perangkat keras komputer di dalam sebuah sistem informasi. Software yang
diperlukan untuk menjalankan aplikasi ini adalah :
a.
Sistem Operasi Windows 7
b.
Software Microsoft Visual Studio 2010 (C#)
(1)
vi
CHARACTER PATTERN RECOGNITION AND TRANSLATION AKSARA KATAKANA USING IMPLEMENTATION OF ALGORITHM ASSOCIATIVE
MEMORY HETERO-ASSOCIATIVE TYPE ABSTRACT
Studying Japanese Katakana characters relatively difficult, especially the characters are used different from the Latin alphabet that we usually use. The unique shape of character requires special attention and a lot more time in studying writing. Neural networks and pattern recognition can help ease learning character. In this research, artificial neural network algorithm used is Associative Memory Hetero-Associative type. There are two processes in this research that is process of training and testing. The training process begins from Katakana characters handwriting is converted into digital image then processed to obtain the value of the binary image. The value of each pixel of the image is associated and used as input to the neural network. The end of this process produces the weight matrix values that will serve as the basis for testing Katakana character patterns. In the testing process tested characters will be processed with the value obtained in the training process. Results from the research showed that the method of associative memory hetero-associative type can recognize patterns of 74.7826% from the pattern that has been trained and 63.0435% of the samples testing patterns (not trained).
Keywords: Neural Network, Associative Memory Hetero-association type, Pattern Recognition, Aksara Katakana.
(2)
vii
DAFTAR ISI
Persetujuan i
Pernyataan ii
Ucapan Terima Kasih iii
Abstrak v
Abstract vi
Daftar Isi vii
Daftar Tabel ix
Daftar Gambar x
Daftar Lampiran xi
Bab 1 Pendahuluan
1.1Latar Belakang Masalah 1
1.2Perumusan Masalah 2
1.3Batasan Masalah 2
1.4Tujuan Penelitian 2
1.5Manfaat Penelitian 3
1.6Metodologi Peneltian 3
1.7Sistematika penulisan 4
Bab 2 Landasan Teori
2.1 Jaringan Syaraf Tiruan 5
2.2 Pelatihan Terbimbing (Supervised Training) dan Tak Terbimbing
(Unsupervised Training) 8
2.3 Arsitektur JST 8
2.4 Metode JST 11
2.5 Associative Memory 14
2.6 Bagian-bagian dalam Associative memory 15
2.6.1 Auto-associative memory 15
2.6.2 Hetero-associative memory 15
2.7 Pemgenalan Pola 17
2.8 Citra Digital 18
2.8.1 Format Citra JPEG 20
2.9 Aksara Katakana 20
2.1 Penelitian Terdahulu 21
Bab 3 Analisis dan Perancangan Sistem
3.1 Analisis Sistem 23
3.1.1 Analisis Masalah 23
3.1.2 Analisis Persyaratan (Requirement Analysis) 24 3.1.2.1 Analisis Persyaratan Fungsional 24 3.1.2.2 Analisis Persyaratan Non Fungsional 25
3.2 Pemodelan Sistem 25
3.2.1 Use Case Diagram 26
3.2.2 Activity Diagram (Diagram Aktivitas) 28
3.2.3 Sequence Diagram 31
(3)
viii
3.4 Pseudocode 34
3.4.1 Pseudocode Proses Pelatihan JST 34
3.4.2 Pseudocode Proses Pengujian JST 34
3.5 Perancangan Antarmuka (Interface) Sistem 36
3.5.1 Form Pelatihan 36
3.5.2 Form Pengujian 37
Bab 4 Implementasi dan Pengujian Sistem
4.1 Implementasi Sistem 39
4.1.1 Implementasi Algoritma Associative Memory tipe Hetero-
Association 40
4.2 Tampilan Interface Sistem 44
4.2.1 Form Proses Pelatihan 44
4.2.2 Form Proses Pengujian 45
4.3 Pengujian Sistem 46
4.3.1 Proses Pelatihan 47
4.3.2 Proses Pengujian 51
4.4 Hasil Pengujian 54
4.4.1 Pengujian Pada Citra Yang Telah Dilatih 54 4.4.2 Pengujian Pada Citra Testing (Belum Dilatih) 60 4.5 Analisis Penyebab Kegagalan Dalam Pengenalan Karakter 62 Bab 5 Kesimpulan dan Saran
5.1 Kesimpulan 63
5.2 Saran 64
(4)
ix
DAFTAR TABEL
Hal
Tabel 2.1 Perbandingan jenis file gambar 20
Tabel 2.2 Huruf-huruf Katakana 21
Tabel 3.1 Dakumentasi Naratif Use Case Pelatihan Sistem 27 Tabel 3.2 Dakumentasi Naratif Use Case Pengujian Sistem 28
Tabel 4.1 Hasil Pengujian Citra Yang Dilatih 55
Tabel 4.2 Citra Yang Mengalami Kesalahan Pada Pengenalan 56
Tabel 4.3 Hasil Pengujian Citra Testing 60
Tabel 4.4 Citra Yang Mengalami Kesalahan Dalam Pengenalan 61 Tabel 4.5 Tabulasi Kemiripan Karakter Pada Aksara Katakana 62
(5)
x
DAFTAR GAMBAR
Hal
Gambar 2.1 Model Struktur JST 6
Gambar 2.2 Model Struktur JST 7
Gambar 2.3 Jaringan dengan lapisan tunggal 9
Gambar 2.4 Jaringan dengan lapisan banyak 10
Gambar 2.5 Jaringan dengan lapisan kompetitif 10
Gambar 2.6 Backpropagation 11
Gambar 2.7 Learning vector quantization 12
Gambar 2.8 Hebb Rule 13
Gambar 2.9 Associative Memory 15
Gambar 2.10 Representasi konseptual dari sistem pengenalan pola 18 Gambar 2.11 Sistem Koordinat pada Citra Digital 19
Gambar 3.1 Diagram Ishikawa 24
Gambar 3.2 Use Case Diagram Sistem 26
Gambar 3.3 Activity Diagram Pelatihan 29
Gambar 3.4 Activity Diagram Pengujian 30
Gambar 3.5 Sequence Diagram Sistem 31
Gambar 3.6 Flowchart Proses Pelatihan dan Pengujian 33
Gambar 3.7 Form Pelatihan 36
Gambar 3.8 Form Pengujian 38
Gambar 4.1 Form Proses Pelatihan 45
Gambar 4.2 Form Proses Pengujian 46
Gambar 4.3 Alamat Direktori Gambar 47
Gambar 4.4 Buka Citra 47
Gambar 4.5 Ubah Ukuran 48
Gambar 4.6 Listing Program Ubah Ukuran 48
Gambar 4.7 Normalisasi Warna 48
Gambar 4.8 Listing Program Normalisasi Warna 49
Gambar 4.9 Hitung Bobot 50
Gambar 4.10 Listing Program Hitung Bobot 50
Gambar 4.11 Simpan Bobat 51
Gambar 4.12 Hitung Bobot Total 51
Gambar 4.13 Pop-up Window Buka File 51
Gambar 4.14 Buka File Uji 52
Gambar 4.15 Proses Pengujian 53
(6)
xi
DAFTAR LAMPIRAN
Listing Program A-1