loading...

Jumat, 19 Oktober 2018

BAB 4 - Operasi Dasar Olah Citra Digital


Banyak teknik dasar olah citra yang telah disediakan oleh AForge diantaranya adalah operasi konvolusi (filtering), thresholding, morphologi, dan blob, corner detection, histogram equalization, line - circle - shape detection yang dibungkus secara rapi dalam bentuk class pada package AForge.Imaging dan AForge.Imaging.Filters.

Tulisan dibawah ini akan membahas mengenai
  1. Konvolusi
  2. Edge Detection
  3. Thresholding
  4. Morphology
  5. Geometry Moment Invariant - shape analyst
dst..

Konvolusi

Konvolusi merupakan salah satu operasi dasar untuk analisis citra yang memberikan efek tertentu pada citra. Beberapa kegunaan dari konvolusi seperti smoothing, sharpening, blur, dan deteksi tepi. Operasi Konvolusi menggunakan array 2D sebagai masukan dan array 2D square sebagai filter/kernel. Hasil dari konvolusi akan berbeda tergantung dari jenis kernelnya. Berikut contoh perhitungan dari konvolusi


Jika
x array 2D sebagai matrix input
h array 2D sebagai matrix (kernel / filter)
m, i adalah kolom dari input (x) dan kernel (h)
n, j adalah baris  dari input (x) dan kernel (h)
y sebagai ouput

Misalkan kita ingin menghitung  y[1,1] maka, ingat bahwa y[kolom,baris] bukan y[baris,kolom]

= x[0,0]*h[1,1]+x[1,0]*h[0,1]+x[2,0]*h[-1,1]
+x[0,1]*h[1,0]+x[1,1]*h[0,0]+x[2,1]*h[-1,0]
+x[0,2]*h[1,-1]+x[1,2]*h[0,-1]+x[2,2]*h[-1,-1]
Maka akan terlihat seperti berikut

Berikut untuk perhitungan yang lainnya

y[0,0]    = x[-1,-1] * h[1,1] + x[0,-1] * h[0,1] + x[1,-1] * h[-1,1]
    + x[-1,0] * h[1,0] + x[0,0] * h[0,0] + x[1,0] * h[-1,0]
    + x[-1,1] * h[1,-1] + x[0,1] * h[0,-1] + x[1,1] * h[-1,-1]
    = 0 * 1 + 0 * 2 + 0 * 1 + 0 * 0 + 1 * 0 + 2 * 0 + 0 *-1 + 4 * -2 + 5 * -1 = -13
y[1,0]    = x[0,-1] * h[1,1] + x[1,-1] * h[0,1] + x[2,-1] * h[-1,1]
    + x[0,0] * h[1,0] + x[1,0] * h[0,0] + x[2,0] * h[-1,0]
    + x[0,1] * h[1,-1] + x[1,1] * h[0,-1] + x[2,1] * h[-1,-1]
    = 0 * 1 + 0 * 2 + 0 * 1 + 1 * 0 + 2 * 0 + 3 * 0 + 4 * -1 + 5 * -2 + 6 * -1 = -20
y[2,0]    = x[1,-1] * h[1,1] + x[2,-1] * h[0,1] + x[3,-1] * h[-1,1]
    + x[1,0] * h[1,0] + x[2,0] * h[0,0] + x[3,0] * h[-1,0]
    + x[1,1] * h[1,-1] + x[2,1] * h[0,-1] + x[3,1] * h[-1,-1]
    = 0 * 1 + 0 * 2 + 0 * 1 + 2 * 0 + 3 * 0 + 0 * 0 + 5 * -1 + 6 * -2 + 0 * -1 = -17
y[0,1]    = x[-1,0] * h[1,1] + x[0,0] * h[0,1] + x[1,0] * h[-1,1]
    + x[-1,1] * h[1,0] + x[0,1] * h[0,0] + x[1,1] * h[-1,0]
    + x[-1,2] * h[1,-1] + x[0,2] * h[0,-1] + x[1,2] * h[-1,-1]
    = 0 * 1 + 1 * 2 + 2 * 1 + 0 * 0 + 4 * 0 + 5 * 0 + 0 * -1 + 7 * -2 + 8 * -1 = -18
y[1,1]    = x[0,0] * h[1,1] + x[1,0] * h[0,1] + x[2,0] * h[-1,1]
    + x[0,1] * h[1,0] + x[1,1] * h[0,0] + x[2,1] * h[-1,0]
    + x[0,2] * h[1,-1] + x[1,2] * h[0,-1] + x[2,2] * h[-1,-1]
    = 1 * 1 + 2 * 2 + 3 * 1 + 4 * 0 + 5 * 0 + 6 * 0 + 7 * -1 + 8 * -2 + 9 * -1 = -24
y[2,1]    = x[1,0] * h[1,1] + x[2,0] * h[0,1] + x[3,0] * h[-1,1]
    + x[1,1] * h[1,0] + x[2,1] * h[0,0] + x[3,1] * h[-1,0]
    + x[1,2] * h[1,-1] + x[2,2] * h[0,-1] + x[3,2] * h[-1,-1]
    = 2 * 1 + 3 * 2 + 0 * 1 + 5 * 0 + 6 * 0 + 0 * 0 + 8 * -1 + 9 * -2 + 0 * -1=-18
y[0,2]    = x[-1,1] * h[1,1] + x[0,1] * h[0,1] + x[1,1] * h[-1,1]
    + x[-1,2] * h[1,0] + x[0,2] * h[0,0] + x[1,2] * h[-1,0]
    + x[-1,3] * h[1,-1] + x[0,3] * h[0,-1] + x[1,3] * h[-1,-1]
    = 0 * 1 + 4 * 2 + 5 * 1 + 0 * 0 + 7 * 0 + 8 * 0 + 0 * -1 + 0 * -2 + 0 * -1 = 13
y[1,2]    = x[0,1] * h[1,1] + x[1,1] * h[0,1] + x[2,1] * h[-1,1]
    + x[0,2] * h[1,0] + x[1,2] * h[0,0] + x[2,2] * h[-1,0]
    + x[0,3] * h[1,-1] + x[1,3] * h[0,-1] + x[2,3] * h[-1,-1]
    = 4 * 1 + 5 * 2 + 6 * 1 + 7 * 0 + 8 * 0 + 9 * 0 +0 * -1 + 0 * -2 + 0 * -1 = 20
y[2,2]    = x[1,1] * h[1,1] + x[2,1] * h[0,1] + x[3,1] * h[-1,1]
    + x[1,2] * h[1,0] + x[2,2] * h[0,0] + x[3,2] * h[-1,0]
    + x[1,3] * h[1,-1] + x[2,3] * h[0,-1] + x[3,3] * h[-1,-1]
    = 5* 1 + 6 * 2 + 0 * 1 + 8 * 0 + 9 * 0 + 0 * 0 + 0 * -1 + 0 * -2 + 0 * -1 = 17

Jenis-Jenis Kernel

Berikut jenis kernel yang sering digunakan untuk menampilkan efek tertentu pada citra digital.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Drawing.Imaging;
using System.Drawing;
using System.Windows.Forms;
using AForge;
using AForge.Imaging.Filters;
using Accord.Controls;
using Accord.Imaging.Converters;
namespace Image_Viewer
{
    class Program
    {
        static void Main(string[] args)
        {


            Bitmap image = (Bitmap)Bitmap.FromFile("D:/image.jpg");
            Accord.Controls.ImageBox.Show(new Bitmap(image)).SetTitle("Original");
            int[,] sharpen = {
                            {  0, -1,  0 },
                            { -1,  5, -1 },
                            {  0, -1,  0 }
                            };
            int[,] blur = { { 1, 2, 3, 2, 1 },
                            { 2, 4, 5, 4, 2 },
                            { 3, 5, 6, 5, 3 },
                            { 2, 4, 5, 4, 2 },
                            { 1, 2, 3, 2, 1 }
                            };
            int[,] emboss = { { -2, -1,  0 },
                            { -1,  1,  1 },
                            {  0,  1,  2 }
                            };
            Program.konvolution(sharpen, "sharpen",image);
            Program.konvolution(blur, "blur", image);
            Program.konvolution(emboss, "emboss", image);
            Console.ReadLine();
        }
        public static void demo()
        {
            Bitmap image = (Bitmap)Bitmap.FromFile("D:/image.jpg");
            Accord.Controls.ImageBox.Show(new Bitmap(image)).SetTitle("Original");
            Blur filter = new Blur();
            // apply the filter
            filter.ApplyInPlace(image);
            Accord.Controls.ImageBox.Show(new Bitmap(image), PictureBoxSizeMode.Zoom).SetTitle("Blur");
        }
        public static void konvolution(int [,] kernel, string title, Bitmap image)
        {
            
            Bitmap image_result = new Bitmap(image);
            Convolution filter = new Convolution(kernel);            
            filter.ApplyInPlace(image_result);
            Accord.Controls.ImageBox.Show(new Bitmap(image_result)).SetTitle(title);


        }
    }
}

Baca Juga : http://www.softscients.web.id/2018/08/bab-3-framework-aforge-dan-accord-net.html

Menghasilkan


Cukup mudah bukan? 

Deteksi Tepi/Edge Detection

Selain berfungsi untuk melakukan filtering atau pemberian efek terhadap citra, konvolusi juga bisa digunakan untuk melakukan edge detection (deteksi tepi) dengan menggunakan class yang telah disediakan oleh AForge yaitu
Oiya, jangan lupa bahwa untuk deteksi tepi hanya berlaku untuk format
PixelFormat.Format8bppIndexed

baca juga: https://stackoverflow.com/questions/34483369/source-pixel-format-is-not-supported-by-the-filter-in-aforge-net

Homogenity Edge Detector

The filter finds objects' edges by calculating maximum difference of processing pixel with neighboring pixels in 8 direction.

Difference Edge Detector

The filter finds objects' edges by calculating maximum difference between pixels in 4 directions around the processing pixel.

Sobel Edge Detector

The filter searches for objects' edges by applying Sobel operator.

Canny Edge Detector

The filter searches for objects' edges by applying Canny edge detector.
lihat pada function DemoPenerapanDeteksiTepi()

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Drawing.Imaging;
using System.Drawing;
using System.Windows.Forms;
using AForge;
using AForge.Imaging.Filters;
using Accord.Controls;
using Accord.Imaging.Converters;
namespace Image_Viewer
{
    class Program
    {
        static void Main(string[] args)
        {


            DemoPenerapanDeteksiTepi();
            Console.ReadLine();
        }
        public static void DemoPenerapanDeteksiTepi()
        {
            //https://stackoverflow.com/questions/34483369/source-pixel-format-is-not-supported-by-the-filter-in-aforge-net


            Bitmap image = (Bitmap)Bitmap.FromFile("D:/cat.jpg");

            if (image.PixelFormat != PixelFormat.Format8bppIndexed) //jika truecolor, maka convert dulu
            {
                Grayscale rgb2grayscale = new Grayscale(0.2125, 0.7154, 0.0721);
                image = rgb2grayscale.Apply(image);

            }

            Accord.Controls.ImageBox.Show(new Bitmap(image)).SetTitle("Original");
            // create filter
            HomogenityEdgeDetector filter = new HomogenityEdgeDetector();
            // apply the filter
            Bitmap HO = filter.Apply(image);
            Accord.Controls.ImageBox.Show(new Bitmap(HO)).SetTitle("HomogenityEdgeDetector");

            // create filter
            DifferenceEdgeDetector filter2 = new DifferenceEdgeDetector();
            // apply the filter
            Bitmap DI = filter2.Apply(image);
            Accord.Controls.ImageBox.Show(new Bitmap(DI)).SetTitle("DifferenceEdgeDetector");

        }
        public static void DemoTampilGambar()
        {
            Bitmap image = (Bitmap)Bitmap.FromFile("D:/image.jpg");
            Accord.Controls.ImageBox.Show(new Bitmap(image)).SetTitle("Original");
            Blur filter = new Blur();
            // apply the filter
            filter.ApplyInPlace(image);
            Accord.Controls.ImageBox.Show(new Bitmap(image), PictureBoxSizeMode.Zoom).SetTitle("Blur");
        }
        
        public static void DemoPenerapanKonvolution()
        {
            Bitmap image = (Bitmap)Bitmap.FromFile("D:/image.jpg");
            Accord.Controls.ImageBox.Show(new Bitmap(image)).SetTitle("Original");
            int[,] sharpen = {
                            {  0, -1,  0 },
                            { -1,  5, -1 },
                            {  0, -1,  0 }
                            };
            int[,] blur = { { 1, 2, 3, 2, 1 },
                            { 2, 4, 5, 4, 2 },
                            { 3, 5, 6, 5, 3 },
                            { 2, 4, 5, 4, 2 },
                            { 1, 2, 3, 2, 1 }
                            };
            int[,] emboss = { { -2, -1,  0 },
                            { -1,  1,  1 },
                            {  0,  1,  2 }
                            };
            Program.konvolution(sharpen, "sharpen", image);
            Program.konvolution(blur, "blur", image);
            Program.konvolution(emboss, "emboss", image);
        }
        public static void konvolution(int [,] kernel, string title, Bitmap image)
        {
            
            Bitmap image_result = new Bitmap(image);
             Convolution filter = new Convolution(kernel);            
            filter.ApplyInPlace(image_result);
            Accord.Controls.ImageBox.Show(new Bitmap(image_result)).SetTitle(title);


        }
    }
}



Pada sesi ini, diharapkan sudah paham sedikit-demi sedikit cara kerja library yang kita gunakan.

Thresholding

Thresholding (pengambangan) mencari nilai T (ambang batas) yang digunakan untuk melakukan proses konversi citra true color dalam format black white. Ada banyak metode untuk mendapatkan nilai ambang batas sebagai acuan untuk mengkategorikan nilai suatu pixel termasuk warna hitam atau putih jika dalam format biner maka (1 dan 0) dan format grayscale (0 dan 255) salah satu yang paling banyak dikenal luas dan digunakan sebagai standar yaitu metode Otsu. Kita langsung menggunakan function saja yaitu kelas OtsuThreshold()
<untuk menghemat pembahasan> maka ditampilkan saja kode intinya
Bitmap image = (Bitmap)Bitmap.FromFile("D:/cat.jpg");

if (image.PixelFormat != PixelFormat.Format8bppIndexed) //jika truecolor, maka convert dulu
{
 Grayscale rgb2grayscale = new Grayscale(0.2125, 0.7154, 0.0721);
 image = rgb2grayscale.Apply(image);

}
OtsuThreshold tr = new OtsuThreshold();
Bitmap image_result = new Bitmap(image);
image_result = tr.Apply(image);
Accord.Controls.ImageBox.Show(new Bitmap(image)).SetTitle("Gambar Asli");
Accord.Controls.ImageBox.Show(new Bitmap(image_result)).SetTitle("Operasi Thresholding");

hasilnya


Morphologi

Secara sederhana morphologi adalah bentuk dan struktur. Operasi morphologi bekerja dalam format biner yaitu 1 dan 0. Beberapa operasi yang sering digunakan yaitu
  1. Dilation (penebalan) yaitu menambahkan sejumlah pixel terhadap semua arah dari sebuah structure element
  2. Erotion (penipisan) yaitu mengurangi sejumlah pixel  terhadap semua arah dari sebuah structure element
  3. Opening yaitu operasi erotion disertai dengan dilation berfungsi untuk menghilangkan objek - objek kecil yang terdapat dalam citra
  4. Closing yaitu operasi dilation disertai dengan erotion
Operasi morphologi melibatkan dua input himpunan yaitu citra (format biner) dengan suatu kernel yang disebut dengan  Structure Element sebagai dasar operasinya nya. Berikut dibawah ini ilustrasi dari operasi morphologi.

Kita bisa setting mengenai structure element nya juga, yaitu efek seberapa besar operasi morphologi dilakukan.




Bitmap image = (Bitmap)Bitmap.FromFile("D:/morphologi.png");

if (image.PixelFormat != PixelFormat.Format8bppIndexed) //jika truecolor, maka convert dulu
{
 Grayscale rgb2grayscale = new Grayscale(0.2125, 0.7154, 0.0721);
 image = rgb2grayscale.Apply(image);

}
//penerapan BW
OtsuThreshold tr = new OtsuThreshold();
tr.ApplyInPlace(image);
//modifikasi structure element
short[,] se = new short[5, 5]{
   { 1,1,1,1,1 },
   { 1,1,1,1,1 },
   { 1,1,1,1,1 },
   { 1,1,1,1,1 },
   { 1,1,1,1,1 },
   };
Dilatation dilation = new Dilatation(se);

Bitmap dila = dilation.Apply(image);
Erosion erosion = new Erosion(se);
Bitmap ero = erosion.Apply(image);
Opening opening = new Opening(se);
Bitmap op = opening.Apply(image);
Closing closing = new Closing(se);
Bitmap clo = closing.Apply(image);
Accord.Controls.ImageBox.Show(new Bitmap(image)).SetTitle("Gambar Asli");
Accord.Controls.ImageBox.Show(new Bitmap(dila)).SetTitle("Dilation");
Accord.Controls.ImageBox.Show(new Bitmap(ero)).SetTitle("Erotion");
Accord.Controls.ImageBox.Show(new Bitmap(op)).SetTitle("Opening");
Accord.Controls.ImageBox.Show(new Bitmap(clo)).SetTitle("Closing");







Labelling

Penandaan komponen terhubung yaitu mengelompokan pixel kedalam suatu komponen terhubung menurut aturan ketetanggaan. Setiap komponen yang tidak terhubung (disjoint) akan diberi suatu tanda yang berbeda. Langkah nya yaitu periksa (scan) citra dengan bergerak dari sepanjang baris sampai sudah menemukan pixel p (nilai p berada dalam matrix V). Bila p sudah ditemukan maka periksa nilai pixel tetangganya. Berikut adalah penandaan untuk nilai ketetanggan 4 dan 8



Berikut contoh ilustrasi dari labelling dengan nilai 4 dan 8 ketetanggaan.



Biasanya diterapkan untuk menghitung dan menentukan lokasi objek, kita bisa menggunakan
class BlobCounter()
berisi informasi mengenai location X dan Y setiap objek

Bitmap image = (Bitmap)Bitmap.FromFile("D:/labelling.png");

if (image.PixelFormat != PixelFormat.Format8bppIndexed) //jika truecolor, maka convert dulu
{
 Grayscale rgb2grayscale = new Grayscale(0.2125, 0.7154, 0.0721);
 image = rgb2grayscale.Apply(image);

}

//penerapan BW
OtsuThreshold tr = new OtsuThreshold();
Bitmap black_white = tr.Apply(image);

//clone ke format truecolor agar bisa ditulis berwarna
Bitmap image_color = AForge.Imaging.Image.Clone(black_white,PixelFormat.Format24bppRgb);


BlobCounter blobCounter = new BlobCounter();
blobCounter.ProcessImage(image);
AForge.Imaging.Blob[] blobs = blobCounter.GetObjectsInformation();
System.Drawing.Image drawing_color = (System.Drawing.Image)image_color;
Graphics g = Graphics.FromImage(drawing_color);
Font drawFont = new Font("Arial", 24);
SolidBrush drawBrush = new SolidBrush(Color.Red);
PointF drawPoint;
int i = 1;
foreach (AForge.Imaging.Blob blob in blobs)
{
 //dapatkan lokasi titik tengah nya
 drawPoint = new PointF(blob.CenterOfGravity.X,
        blob.CenterOfGravity.Y);

 blobCounter.ExtractBlobsImage(image, blob, true);
 Bitmap bw = blob.Image.ToManagedImage();
 g.DrawString(i.ToString(), drawFont, drawBrush, drawPoint);
 i++;

}
Accord.Controls.ImageBox.Show(new Bitmap(drawing_color)).SetTitle("Terdapat : "+(i-1)+" objek");


 

Geometri Moment Invariant

Geometri Moment Invariant bisa digunakan untuk shape analyst lho, mari kita bahas mengenai moment

Moment

Momen suatu objek dapat menggambarkan luas area, posisi, orientasi, dan paramater yang  lainnya. Persamaan dasar dari momen sebagai berikut

Dengan i dan j adalah posisi dari suatu pixel dengan nilai intensitas axy. Momen tingkat ke 0 dan ke 1 didefinisikan sebagai berikut
Titik pusat (center of gravity) x’ dan y’ sebagai berikut
Misalkan 
maka
Area  = 2
M00 = 2
M10 = 7
M01 = 4

akan dilanjutkan berikutnya











Tidak ada komentar: