Kamis, 27 Oktober 2011

Sangat penting menggunakan FRAMEWORK di C# (part 1)

Bagi para programer pasti sudah tidak asing lagi dengan yang namanya FRAMEWORK, apa itu FRAME WORK? jika diterjemahkan dalam bahasa indonesia artinya adalah kerangka kerja, terus maksudnya? Kerangka kerja merupakan sekumpulan script atau code program yang telah ditata sedemikian rupa sehingga memudahkan kita dalam proses pemanggilan dan penggunaanya. Jadi dengan kata lain FRAMEWORK adalah sekumpulan function fucntion. Mengapa membutuhkan FRAMEWORK? banyak jawaban untuk menjawab pertanyaan ini. Pertama dengan menggunakan framerwork program lebih simple, programer tidak lagi memikirkan algoritma melainkan fokus memikirkan konsep, misalnya saja jika seorang programer harus membuat suatu algortima tentang solver quadratic programing programer akan kesulitan, kedua dengan menggunakan FRAMEWORK proses pengerjaan project semakain cepat dan semakin mudah dan yang lebih penting hasilnya semakin akurat. Beberapa algoritma dan metode dalam sebuah framework sudah diuji hasil akurasinya. Masih bingung.? Akan saya contohkan bagaimana perlunya kita menggunakan FRAMEWORK. Berikut ini adalah framework  FRAMEWORK yang direkomendasikan Accord, Aforge dan Zed Grap dimana kesemua FRAMEWORK ini dikembangkan dengan lisensi Free dan di prakasai oleh GOOGLE.


Sekarang perhatikan prevew project dibawah ini

Gambar 1. Preview program membuat histogram
Waupun grafik histogram diatas bisa dibuat tanpa menggunakan FRAMEWORK (secara manual) programer akan kesulitan mengatur tata letak, nilai dan parameter parameter lainnya yang berhubungan dengan grafik tersebut. tetapi kita lihat bedanya jika menggunakan FREMEWORK. Berikut source code untuk membuat grafik diatas.


private void getDataHistogram()
   {
     int[,] temp = new int[256, 1];
     int nilaiPixel;
     PointPairList dataGraph = new PointPairList();
     for (int i = 0; i < gambar.Width; i++)
      {
       for (int j = 0; j < gambar.Height; j++)
         {
           nilaiPixel = gambar.GetPixel(i, j).R;
           temp[nilaiPixel, 0] = temp[nilaiPixel, 0] + 1;
         }
      }
      for (int i = 0; i < 256; i++)
        {
           dataGraph.Add(i, temp[i, 0]);
        }
     LineItem myCurve = myPane.AddCurve("data", dataGraph,;
     Color.Blue,SymbolType.None);
     myCurve.Line.Fill = new Fill(Color.White, Color.Blue, 45f);
     myPane.XAxis.Scale.Max=258;
     zedGraphControl1.AxisChange();            
  }


Sekarang bandingkan dengan membuat grafik diatas tanpa menggunakan FRAMEWORK, jika ditotal ada sekitar 1000 baris lebih source code untuk membuat grafik seperti diatas, menggunakan FRAMEWORK hanya sekitar kurang dari 25 baris.

Contoh kasus kedua, Mengapa penting menggunakan FRAMEWORK?
Pada contoh kasus kedua akan saya tunjukan bagaimana FRAMEWORK sangat efektif untuk menyelesaiakan pekerjaan kita, contoh kasus pada proses deteksi tepi citra, bagi yang suka ilmu komputasi silahkan perhatikan contoh berikut ini

                                                  (a)                           (b)                        (c)
Gambar 2. Preview hasil deteksi tepi

Pada gambar diatas merupakan contoh proses deteksi tepi pada citra digital, gambar a adalah gambar asli sedangkan gambar (b) dan gambar (c) merupakan deteksi tepi dengan kernel CANNY dan juga kernel SOBEL. Pada proses deteksi tepi menggunakan kernel Canny sedikit agak rumit dibandingkan dengan metode lain, akan tetapi silahkan lihat source code deteksi tepi canny menggunakan FRAMEWORK Aforge.

Source code deteksi canny dengan Aforge

Bitmap gambar = new Bitmap(openFileDialog1.FileName);
    pictureBox3.Image = gambar;
    pictureBox3.Width = gambar.Width;
    pictureBox3.Height = gambar.Height;
    Grayscale gray = new Grayscale(0.2125, 0.7154, 0.0721);
    CannyEdgeDetector cany = new CannyEdgeDetector(0,70);
    Bitmap hasil=cany.Apply(gray.Apply(gambar));
    pictureBox4.Image = hasil;
    pictureBox4.Width = gambar.Width;
    pictureBox4.Height = gambar.Height;


Source code deteksi tepi dengan kernel Sobel


Bitmap gambar = new Bitmap(openFileDialog1.FileName);
    pictureBox5.Image = gambar;
    pictureBox5.Width = gambar.Width;
    pictureBox5.Height = gambar.Height;
    Grayscale gray = new Grayscale(0.2125, 0.7154, 0.0721);
    SobelEdgeDetector sobel = new SobelEdgeDetector();
    Bitmap hasil = sobel.Apply(gray.Apply(gambar));
    pictureBox6.Image = hasil;
    pictureBox6.Width = gambar.Width;
    pictureBox6.Height = gambar.Height;


Begitu simple dan begitu mudah kan mengimplementasikan deteksi tepi menggunakan FRAMEWORK. sekedar catatan saja bahwasanya kemampuan Aforge dan Accord ini tidak hanya sebatas itu saja FRAMEWORK ini bisa menangani Audio, Control, Audition, Direct Sound, Image Filter, Machine Learning, Math Decompotion, Optimization, Learning, Analysis, Statistics, Komputer VIsion, Wavelet dan masih banyak lagi.
Dan bandingkan dengan source code deteksi tepi menggunakan kernel Sobel jika membuat algoritmanya sendiri, kurang lebih seperti berikut ini

Source Code Deteksi tepi

Bitmap gambar = new Bitmap(data);
int[,] dataPixel; 
int[,] hasilAkhir; 
double dataX = 0; 
double dataY = 0; 
double hasil = 0;
gambar = MakeGrayscale(gambar);                   
dataPixel = new int[gambar.Height + 2, gambar.Width + 2]; 
hasilAkhir=new int[gambar.Height+2, gambar.Width + 2];
dataPixel[i + 1, j + 1] = gambar.GetPixel(j, i).R;                 }}             
for (int i = 1; i < gambar.Height + 1; i++) {
 for (int j = 1; j < gambar.Width + 1; j++){
  dataX = 0;
  dataY = 0;
  hasil = 0; 
  dataX = dataX + (dataPixel[i - 1, j - 1] * sobelX[0, 0]);
  dataX = dataX + (dataPixel[i, j - 1] * sobelX[1, 0]);
  dataX = dataX + (dataPixel[i + 1, j - 1] * sobelX[2, 0]);
  dataX = dataX + (dataPixel[i - 1, j + 1] * sobelX[0, 2]);
  dataX = dataX + (dataPixel[i, j + 1] * sobelX[1, 2]);
  dataX = dataX + (dataPixel[i + 1, j + 1] * sobelX[2, 2]);
  dataX = Math.Pow(Math.Pow(dataX, 2), 0.5);
  dataY = dataY + (dataPixel[i - 1, j - 1] * sobelY[0, 0]);
  dataY = dataY + (dataPixel[i - 1, j] * sobelY[0, 1]);
  dataY = dataY + (dataPixel[i - 1, j + 1] * sobelY[0, 2]);
  dataY = dataY + (dataPixel[i + 1, j - 1] * sobelY[2, 0]);
  dataY = dataY + (dataPixel[i + 1, j] * sobelY[2, 1]);
  dataY = dataY + (dataPixel[i + 1, j + 1] * sobelY[2, 2]);
  dataY = Math.Pow(Math.Pow(dataY, 2), 0.5);
  hasil = dataY + dataX;
  hasil = hasil/ 255;
  hasilAkhir[i, j] = Convert.ToInt16(hasil);
 }
}
for (int i = 0; i < hasilAkhir.GetLength(0); i++){
 for (int j = 0; j < hasilAkhir.GetLength(1); j++){
  if (hasilAkhir[i, j] > 0)
  {
   hasilAkhir[i, j] = 255;
  }
  else
  {
   hasilAkhir[i, j] = 0;
  }
 }
}  
Bitmap temp=new Bitmap (gambar.Width, gambar.Height);
for (int i = 0; i < gambar.Height; i++){
 for (int j = 0; j < gambar.Width; j++){ 
  temp.SetPixel(j, i, Color.FromArgb(hasilAkhir[i, j],   hasilAkhir[i, j], hasilAkhir[i, j]));
 } 
}
return temp;

to be continued....

Tidak ada komentar:

Posting Komentar