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