Jumat, 14 September 2012

Sekilas Tentang Accord.net dan AForge.net


Jika anda menggunakan tools C# (languange) sebagai olah citra dan Framework AForge.Net dan Accord.Net lumayan lengkap

lanjut..

Setelah melakukan explore (hanya karena) ingin mengetahui nilai pixel dari suatu citra, mereka  (framework AForge.Net dan Accord.Net) tidak satupun menyediakan class untuk itu. Hampir semua operasi olah citra menggunakan argument class Image.  Misalkan filter (menggunakan convolution)

AForge.Imaging.Filters.Dilatation dilation=new AForge.Imaging.Filters.Dilatation();
dilation.Apply(image)


atau menggunakan cara berikut
// define emboss kernel
            int[,] kernel = {
                        { -2, -1,  0 },
                        { -1,  1,  1 },
                        {  0,  1,  2 } };
            // create filter
            AForge.Imaging.Filters.Convolution filter = new AForge.Imaging.Filters.Convolution( kernel );

Dikarenakan semua menggunakan Class Image

sebagai inputannya bukan matrix atau array sangat menyulitkan bagi pemula yang ingin bereksperimen (daripada menggunakan Matlab). Hampir semua proses read and writel pixel didalam method tersebut dan langsung mengembalikan Image sebagai output argument nya.
Matlab menggunakan berbagai class untuk mempresentasikan data image yaitu
Logical = 1 dan 0
Uint8 = 1 sampai 255
Double = 0 sampai 1
Sedangkan JImage
Format.Logical = 1 dan 0
Format.Uint8 = 1 sampai 255
Format.Float = 0 sampai 1

Hal diatas akan menjadi ambigu, misalkan pada komputasi untuk filter dilation (penulis  ingin melakukan penebalan - mode biner) maka output dari dilation.Apply(image) adalah image maka yang akan tampil bukan 0 (hitam) dan 1 (putih) tapi 255 (putih) à ini sangat benar sekali dikarenakan logical hanya untuk proses morphologi saja bukan untuk format file image (disimpan / disajikan ke standar monitor), maka bila pada mode logical nilai 1 (putih) akan langsung dikonvert ke 255. Yah bagi orang yang paham akan mudah sekali, tapi bagi orang awam akan menjadi membingungkan (mungkin yang diharapkan adalah bilangan logical)

Seringkali kita dihadapkan kasus untuk melakukan komputasi convolution yang menggunakan berbagai filter (komputasi morpologià dilation + blob to count of items )sebelum hasil akhir nya ditampilkan sebagai Image. Jika anda ingin dalam format array2D (matrix), maka anda harus siap-siap lihat source code nya kalau tidak ingin melakukan dalam format class Image.

//init file
Bitmap bitmap=new Bitmap("D:/New Picture (1).bmp");
//init blob
AForge.Imaging.BlobCounter blobs=new AForge.Imaging.BlobCounter(bitmap);
//show after
new Ext.Utility.ShowImage().InitShow(new MyDataBitmap("original jumlah objek before dilation "+blobs.ObjectsCount.ToString(),bitmap,2000));
//init dilate
AForge.Imaging.Filters.Dilatation dilation=new AForge.Imaging.Filters.Dilatation();
Bitmap postDilation=dilation.Apply(bitmap);
//init blob  
blobs=new AForge.Imaging.BlobCounter(postDilation);
//show
new Ext.Utility.ShowImage().InitShow(new MyDataBitmap("jumlah objek after dilation "+blobs.ObjectsCount.ToString(),postDilation,3000));

Class new Ext.Utility.ShowImage().InitShow() merupakan class yang dibuat oleh penulis untuk menampilkan mulitple Windows Form pada modus console (mirip dengan imshow pada matlab).

Histogram

Class Histogram (ambigu) hanya menyediakan komputasi statistik biasa seperti std,mean,max,min,total tidak  menyediakan histogram (nilai sebaran).
Form diatas (dibuat oleh penulis menggunakan ZedGraph)

 

Kesimpulan

Seperti yang sudah dipaparkan sebelumnya bahwa,
  1. kebanyakan class seringkali menggunakan class Image sebagai argument input bukan matrix. Framework langsung melakukan “bedah” pixel dari Image langsung didalam method tersebut serta menghasilkan output berupa class Image
  2. belum adanya class yang menyediakan read dan write value pixel, sehingga semua menggunakan class Image. Anda harus membuat class tersendiri bila menginginkannya

Bitmap bitmap=new Bitmap("D:/hasil.bmp");
Ext.ReadImage readImage=new ReadImage(bitmap);
byte[,]r=readImage.Red;
byte[,]g=readImage.Green;
byte[,]b=readImage.Blue;

//create truecolor
byte[,]red=new byte[255,255];
byte[,]green=new byte[255,255];
byte[,]blue=new byte[255,255];

for(int i=0;i<red.GetLength(0);i++)
{
    for(int j=0;j<red.GetLength(1);j++)
    {
        red[i,j]=(byte)j;
        if(i>100)
        green[i,j]=(byte)j;
        //red[i,j]=(byte)j;

    }
}
Ext.CreateImage create=new Ext.CreateImage(red,green,blue);
Bitmap bitmap=create.Btmp;
new Ext.Utility.ShowImage().InitShow(new MyDataBitmap("true color ",bitmap,2000));

//create gray color
byte[,]gray=new byte[256,256];  
for(int i=0;i<gray.GetLength(0);i++)
{
    for(int j=0;j<gray.GetLength(1);j++)
    {
        gray[i,j]=(byte)i;
    }
}
Ext.CreateImage create=new Ext.CreateImage(gray);
Bitmap bitmap=create.Btmp;
new Ext.Utility.ShowImage().InitShow(new MyDataBitmap("gray ",bitmap,2000));
Note:
Package Ext. merupakan class yang dibuat oleh penulis untuk memudahkan dalam olah citra di C# dalam modus console application
Posting Komentar