Saturday, June 23, 2012

Enchance Image with Histogram Equalization


Hari itu Jum'at, 22 Juni 2012. Tidak terasa sudah berada di penghujung semester. Libur akademik didepan mata. Tapi sayangnya yang libur cuma kegiatan akademiknya saja. Beberapa kewajiban lain tidak ikut libur. Hehe, tapi ya sudahlah namanya juga kewajiban dijalani saja lah.
Alhamdulillah, semua urusan akademik telah beres, tinggal tawakkal dan ikhlas dengan hasil yang didapat. Kalo lebih baik dari ekspektasi ya rejeki, klo sedikit mengecewakan ya sudah berarti harus belajar lagi.
Akhir semester saatnya merapikan file di laptop. Tapi berbeda dari akhir semester yang sudah terlewati, akhir semester ini bakal lebih banyak file yang dirapikan karena akhir semester ini harus merapikan file 1 tahun terakhir, semester lalu belum sempat. Hehe.
Ya sudah, mau tidak mau lah, indikator harrdisk juga sudah merah, segera dirapikan saja.
Sambil menata file di tempat yang sesuai sambil buka-buka file lama. Sampai akhirnya ketemu file kuliah Image Processing yang saya sendiri lupa pernah punya file itu. Hehe, maklum sudah setahun yang lalu. Akhirnya biar tidak lupa lagi ditulis saja lah, hehe.
File yang saya temukan itu ternyata adalah file tugas kuliah. Tugas itu berkaitan dengan enhancement pada image processing. Enhancement itu sendiri adalah proses membuat gambar jadi lebih mudah diidentifikasi sehingga memudahkan proses berikutnya dalam serangkaian image processing. Proses enchancement itu sendiri bisa menggunakan banyak metode. Nah, di file yang saya temukan itu menggunakan metode paling sederhana yaitu metode Histogram Equalization. Mungkin cukup asing istilahnya kalo belum belajar image processing. Yaa sekedr istilah sih, yang jelas langkah-langkahnya adalah:
1.       Resize gambar input ke ukuran tertentu(optional).
public Bitmap ResizeBitmap(Bitmap b, int nWidth, int nHeight)
        {
            Bitmap result = new Bitmap(nWidth, nHeight);
            using (Graphics g = Graphics.FromImage((Image)result))
                g.DrawImage(b, 0, 0, nWidth, nHeight);
            return result;
        }

2.       Mengubah gambar input menjadi gambar gray(abu-abu).
public Bitmap ToGrayscale(Bitmap original)
        {
            Bitmap newBitmap = new Bitmap(original.Width, original.Height);
            for (int i = 0; i < original.Width; i++)
            {
                for (int j = 0; j < original.Height; j++)
                {
                    //get the pixel from the original image
                    Color originalColor = original.GetPixel(i, j);
                    int grayScale = (int)((originalColor.R * .3) + (originalColor.G * .59) + (originalColor.B * .11));
                    Arr[i, j] = (uint)grayScale;
                    Color newColor = Color.FromArgb(grayScale, grayScale, grayScale);
                    newBitmap.SetPixel(i, j, newColor);
                }
            }
            return newBitmap;
        }

3.       Menyimpan nilai pixel gambar ke dalam sebuah array 2 dimensi sesuai resolusi gambar.
        public short[,] CreateArray(Bitmap Input)
        {
            short [,]arr = new short[256, 256];
            for (short i = 0; i < Input.Width; i++)
            {
                for (short j = 0; j < Input.Height; j++)
                {
                    arr[i, j] = ColorToShort( Input.GetPixel(i, j));
                }
            }
                return arr;
        }

4.       Membuat histogram dari data level keabuan dari tiap pixel gambar yang telah berbentuk array 2 dimensi.
public uint[] FindNumberPixel(uint[] Graylevel, uint[] NewGray, uint[,]Array)
        {
            for (short i = 0; i < 256; i++)
            {
                Graylevel[i] = 0;
                NewGray[i] = 0;
            }
            for (short i = 0; i < 256; i++)
            {
                for (short j = 0; j < 256; j++)
                {
                    for (short k = 0; k < 256; k++)
                        if (Array[i, j] % 256 == k)
                            Graylevel[k]++;

                }
            }
            NewGray[0] = Graylevel[0];
            for (short i = 1; i < 256; i++)
                NewGray[i] = NewGray[i - 1] + Graylevel[i - 1];
            return NewGray;
        }

5.       Melakukan proses equalization atau perataan level keabuan.
for (short i = 0; i < 256; i++)
            {
                for (short j = 0; j < 256; j++)
                {
                    for (short k = 0; k < 256; k++)
                    {
                        if(Array[i, j] == k)
                        NewArray[i, j] = 256 * NewGray[k] / (256 * 256);
                    }

                }
            }


6.       Mengembalikan array hasil equalization ke bentuk gambar.
public Bitmap CreateNewImage(uint[,] Array)
        {
            Bitmap Input = new Bitmap(256, 256);
            Color capt = new Color();
            for (short i = 0; i < Input.Width; i++)
            {
                for (short j = 0; j < Input.Height; j++)
                {
                    if (Array[i, j] >= 256) Array[i, j] = 255;
                    capt = Color.FromArgb((int)Array[i, j], (int)Array[i, j], (int)Array[i, j]);
                    Input.SetPixel(i, j, capt);
                }
            }
            return Input;
        }

7.       Done. Hasil Testing.



Gambar kiri merupakan gambar input yang telah diubah ke gray, gambar kanan adalah gambar output. Text dibawah gambar merupakan nilai-nilai gray yang berubah-ubah selama pemrosesan gambar.
Cukup sederhana, namun hasilnya cukup lumayan, tidak kalah lah sama hasil Photosop :p.
Tertarik? Silahkan mencoba sendiri, source code open source kok, silahkan dipakai sesuai kebutuhan. Asal bermanfaat it’s okay :D

Source code bisa didownload disini

Sekian dulu, semoga sedikit cerita yang agak nglantur ini bisa bermanfaat. Amiin :D 

0 comments:

Post a Comment

 
Copyright (c) 2010 printf("hello world"); and Powered by Blogger.