Jumat, 22 November 2013

Membuat Aplikasi Pengolahan Citra Menggunakan OpenCv - Part 3

BAB 3
Tahapan Pembuatan Aplikasi Histogram Citra

Pengertian histogram dalam pengolahan citra adalah .representasi grafis untuk distribusi warna dari citra digital atau menggambarkan penyebaran nilai-nilai intensitas pixel dari suatu citra atau bagian tertentu di dalam citra. Dari sebuah histogram dapat diketahui frekuensi kemunculan relatif dari intensitas pada citra, kecerahan, dan kontas dari sebuah gambar. 


Histogram citra adalah suatu grafik yang menyatakan hubungan antara BV (brightness value) dengan frekuensi. Dari histogram pada suatu citra yang ada kita dapat menentukan berapa buah objek yang terdapat pada citra tersebut. Satu kurva sempurna mencerminkan satu buah objek. Jadi semakin banyak kurva yang terdapat pada suatu histogram maka semakin bervariasi pula objek pada citra tersebut. Untuk tiap band yang berbeda pada satu citra, memiliki histogram dengan bentuk kurva yang berbeda-beda pula.

Histogram citra merupakan salah satu bentuk representasi grafis karakteristik spektral citra yang bersangkutan. Dengan histogram, analis citra dapat memahami citra yang dipelajari misalnya aspek kecerahan dan ketajamannya. Dari histogram juga kadang-kadang dapat diduga jenis saluran spektral citra yang digunakan. Perubahan atas distribusi nilai pada citra secara langsung berakibat pada perubahan tampilan histogram. Sebaliknya, dengan memainkan bentuk histogramnya banyak program pengolah citra secara interaktif mampu mengubah tampilan citranya. Dengan kata lain, perangkat lunak pengolah citra kadang-kadang menggunakan histogram sebagai jembatan komunikasi antara pengguna dengan data citra. 
Histogram citra dipresentasikan dengan dua bentuk: pertama tabel yang memuat kolom-kolom nilai piksel jumlah absolut setiap nilai piksel, jumlah komulatif piksel, presentase absolut setiap nilai, dan presentase komulatifnya; kedua, gambaran grafis yang menunjukkan nilai piksel pada sumbu x dan frekuensi kemunculan pada sumbu y. Melalui gambaran grafis histogram ini, secara umum dapat diketahui sifat-sifat citra yang diwakilinya. Misalnya citra yang direkam dengan spectrum gelombang relatif pendek akan menghasilkan “ bukit tunggal “ histogram yang sempit (unimodal) wilayah yang memuat tubuh air agak luas akan menghasilkan kenampakan histogram dengan dua puncak, apabila direkam pada spektrum inframerah dekat (bi-modal). Histogram unimodal yang sempit biasanya kurang mampu menyajikan kenampakan obyek secara tajam, sedangkan histogram yang gemuk (lebar) relatif lebih tajam dibandingkan yang sempit.

Penajaman kontras citra melalui histogram dapat dilakukan dengan dua macam cara yaitu perentangan kontras dan ekualisasi histogram. Perentangan kontras merupakan upaya mempertajam kenampakan citra dengan merentang nilai maksimmum dan nilai minimum citra. Kompresi citra justru sebaliknya dilakukan dengan memampatkan histogram yaitu menggeser nilai minimum ke nilai minimum baru yang lebih tinggi dan menggeser nilai maksimum ke nilai maksimum baru yang lebih rendah sehingga histogramnya menjadi lebih “langsing”. Berbeda halnya dengan perentangan kontras yang bersifat linier, ekualisasi histogram merupakan upaya penajaman secara non- linier yang menata kembali distribusi nilai piksel citra dalam bentuk histogram ke bentuk histogram yang baru, dimana dapat terjadi penggabungan beberapa nilai menjadi nilai baru dengan frekuensi kemunculan yang baru pula. Untuk penajaman citra sendiri meliputi semua operasi yang menghasilkan citra baru dengan kenampakan visual dan karakteristik visual yang berbeda. Citra baru disini maksudnya aadalah citra dengan kenampakan yang lebih bagus dibanding dengan citra aslinya.

Penajaman citra (enhancement) dalam pengertiannya adalah proses mengubah nilai piksel secara sistematis sehingga menghasilkan efek kenampakan citra yang lebih ekspresif sesuai dengan kebutuhan pengguna. Meliputi semua operasi yang menghasilkan citra baru dengan kenampakan visual dan karakteristik spektral yang berbeda. Penajaman Kontras ini bertujuan untuk memperoleh kesan kontras yang lebih tinggi. Dengan mentransformasi seluruh nilai kecerahan maka hasilnya adalah berupa citra baru dengan nilai maksimum awal, dan nilai minimum baru lebih rendah dari nilai minimum awal dan jika dilihat secara visual hasilnya berupa citra baru yang variasi hitam putihnya lebih menonjol sehingga tampak lebih tajam dan memudahkan proses interpretasi. Kontras citra dapat dilakukan dengan merentangkan nilai kecerahan pikselnya. Citra asli biasanya memiliki panjang gelombang yang lebih sempit dari 0-255. Sehingga hasil citra baru memiliki histogram yang memiliki kurva lebih besar. Pemfilteran adalah cara untuk ekstraksi bagian data tertentu dari suatu himpunan data dengan menghilangkan bagian-bagian data yang tidak diinginkan.
Filter dirancang untuk menyaring informasi spectral sehingga menghasilkan citra baru yang mempunyai variasi nilai spektral yang berbeda dengan citra asli. Terdapat dua jenis filtering, yaitu filter high pass dan filter low pass.
  • Filter high pass menghasilkan citra dengan variasi nilai kecerahan yang besar dari piksel ke piksel, sedangkan filter low pass justru sebaliknya, memiliki fungsi untuk menaikkan frekwensi sehingga batas satu bentuk dengan bentuk lainnya menjadi jelas. Tujuannya untuk menonjolkan perbedaan antara objek ataupun perbedaan nilai, kondisi ataupun sifat antar objek yang diwakili oleh nilai piksel.
  • Filter low pass adalah batas antara satu bentuk dengan bentuk lainnya menjadi kabur sehingga terkesan memiliki gradasi yang halus. Tujuannya untuk memperhalus kenampakan citra.
Dalam pembuatan aplikasi pengolahan citra menggunakan OpenCV kita menggunakan microsoft visual studio 2008 untuk penulisan sintak dan untuk melakukan proses eksekusi.

1. Langkah pertama adalah buka software Microsoft Visual Studio 2008. Untuk membuat project baru pilih New Project >> Visual C++ >> Win 32 >> (kemudian isi Name dengan coba) >>  OK . Karena nama project yang kita gunakan adalah coba.



2. Setelah itu kita buka folder OpenCv untuk mengambil kodingan project yang akan kita buat. Alamat yang digunakan adalah opencv >> samples >> cpp. Kodingan yang kami gunakan adalah image. Kodingan tersebut kami copy kemudian paste pada Visual Studio.

Kodingan yang digunakan

// coba.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"


#include <stdio.h>
#include <iostream>
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/flann/miniflann.hpp"

using namespace cv; // all the new API is put into "cv" namespace. Export its content
using namespace std;
using namespace cv::flann;

static void help()
{
    cout <<
    "\nThis program shows how to use cv::Mat and IplImages converting back and forth.\n"
    "It shows reading of images, converting to planes and merging back, color conversion\n"
    "and also iterating through pixels.\n"
    "Call:\n"
    "./image [image-name Default: lena.jpg]\n" << endl;
}

// enable/disable use of mixed API in the code below.
#define DEMO_MIXED_API_USE 1

int main( int argc, char** argv )
{
    help();
    const char* imagename = argc > 1 ? argv[1] : "lena.jpg";
#if DEMO_MIXED_API_USE
    Ptr<IplImage> iplimg = cvLoadImage(imagename); // Ptr<T> is safe ref-conting pointer class
    if(iplimg.empty())
    {
        fprintf(stderr, "Can not load image %s\n", imagename);
        return -1;
    }
    Mat img(iplimg); // cv::Mat replaces the CvMat and IplImage, but it's easy to convert
    // between the old and the new data structures (by default, only the header
    // is converted, while the data is shared)
#else
    Mat img = imread(imagename); // the newer cvLoadImage alternative, MATLAB-style function
    if(img.empty())
    {
        fprintf(stderr, "Can not load image %s\n", imagename);
        return -1;
    }
#endif

    if( !img.data ) // check if the image has been loaded properly
        return -1;

    Mat img_yuv;
    cvtColor(img, img_yuv, CV_BGR2YCrCb); // convert image to YUV color space. The output image will be created automatically

    vector<Mat> planes; // Vector is template vector class, similar to STL's vector. It can store matrices too.
    split(img_yuv, planes); // split the image into separate color planes

#if 1
    // method 1. process Y plane using an iterator
    MatIterator_<uchar> it = planes[0].begin<uchar>(), it_end = planes[0].end<uchar>();
    for(; it != it_end; ++it)
    {
        double v = *it*1.7 + rand()%21-10;
        *it = saturate_cast<uchar>(v*v/255.);
    }

    // method 2. process the first chroma plane using pre-stored row pointer.
    // method 3. process the second chroma plane using individual element access
    for( int y = 0; y < img_yuv.rows; y++ )
    {
        uchar* Uptr = planes[1].ptr<uchar>(y);
        for( int x = 0; x < img_yuv.cols; x++ )
        {
            Uptr[x] = saturate_cast<uchar>((Uptr[x]-128)/2 + 128);
            uchar& Vxy = planes[2].at<uchar>(y, x);
            Vxy = saturate_cast<uchar>((Vxy-128)/2 + 128);
        }
    }

#else
    Mat noise(img.size(), CV_8U); // another Mat constructor; allocates a matrix of the specified size and type
    randn(noise, Scalar::all(128), Scalar::all(20)); // fills the matrix with normally distributed random values;
                                                     // there is also randu() for uniformly distributed random number generation
    GaussianBlur(noise, noise, Size(3, 3), 0.5, 0.5); // blur the noise a bit, kernel size is 3x3 and both sigma's are set to 0.5

    const double brightness_gain = 0;
    const double contrast_gain = 1.7;
#if DEMO_MIXED_API_USE
    // it's easy to pass the new matrices to the functions that only work with IplImage or CvMat:
    // step 1) - convert the headers, data will not be copied
    IplImage cv_planes_0 = planes[0], cv_noise = noise;
    // step 2) call the function; do not forget unary "&" to form pointers
    cvAddWeighted(&cv_planes_0, contrast_gain, &cv_noise, 1, -128 + brightness_gain, &cv_planes_0);
#else
    addWeighted(planes[0], contrast_gain, noise, 1, -128 + brightness_gain, planes[0]);
#endif
    const double color_scale = 0.5;
    // Mat::convertTo() replaces cvConvertScale. One must explicitly specify the output matrix type (we keep it intact - planes[1].type())
    planes[1].convertTo(planes[1], planes[1].type(), color_scale, 128*(1-color_scale));
    // alternative form of cv::convertScale if we know the datatype at compile time ("uchar" here).
    // This expression will not create any temporary arrays and should be almost as fast as the above variant
    planes[2] = Mat_<uchar>(planes[2]*color_scale + 128*(1-color_scale));

    // Mat::mul replaces cvMul(). Again, no temporary arrays are created in case of simple expressions.
    planes[0] = planes[0].mul(planes[0], 1./255);
#endif

    // now merge the results back
    merge(planes, img_yuv);
    // and produce the output RGB image
    cvtColor(img_yuv, img, CV_YCrCb2BGR);

    // this is counterpart for cvNamedWindow
    namedWindow("image with grain", CV_WINDOW_AUTOSIZE);
#if DEMO_MIXED_API_USE
    // this is to demonstrate that img and iplimg really share the data - the result of the above
    // processing is stored in img and thus in iplimg too.
    cvShowImage("image with grain", iplimg);
#else
    imshow("image with grain", img);
#endif
    waitKey();

    return 0;
    // all the memory will automatically be released by Vector<>, Mat and Ptr<> destructors.
}


Tampilan kodingan image pada folder opencv setelah kita copy paste pada visual studio


3. Kemudian kita setting relese dan debug. Untuk mengaturnya kita masuk ke Project >> Coba Properties


4. Ketika sudah tampil coba property page nya kemudian klik Linker >>  Input. Pertama kita atur relese. Untuk mengatur relese kita ubah pada bagian Configuration >> Relese >> Additional Include Directories. Kita kita input kodingan. Kodingan yang kita input adalah:
opencv_features2d246.lib
opencv_highgui246.lib
opencv_core246.lib
opencv_imgproc246.lib
opencv_ml246.lib
opencv_objdetect246.lib
opencv_video246.lib
opencv_contrib246.lib
opencv_calib3d246.lib



    Setelah itu klik OK

5. Setelah itu kita atur Debug. Caranya sama hanya saja pada Configuration kita ubah menjadi Debug. Yang berbeda hanya kodingannya. Kodingan yang digunakan pada debug adalah:          
                        opencv_features2d246.lib
opencv_highgui246d.lib
opencv_core246d.lib
opencv_imgproc246d.lib
opencv_ml246d.lib
opencv_objdetect246d.lib
opencv_video246d.lib
opencv_contrib246d.lib
opencv_calib3d246d.lib



Setelah itu klik OK
Jika Relese dan Debug sudah kita atur kemudian pilih Apply >> OK

6. Langkah selanjutnya adalah mengatur alamat folder pada Tools. Kita pilih Tools >> Properties Project >> Project and Solution >> VC++ Directories. Pertama kita atur Library File. Maka yang kita atur pada show directories >> Library files. Selanjutnya kita pilih new line (kita masukan alamat folder penyimpanan) >> OK.

kita coppy paste C:\opencv\build\x86\vc9\lib pada library files



7. Setelah itu kita atur library pada Include files. Kita ubah Show directories foe menjadi Include files.ada 2 alamat yag akan kita input yaitu:
C:\opencv\build\include



C:\opencv\include\opencv



Kemudian pilih OK

8. Setelah itu kita copy paste image yang ada pada folder opencv ke dalam folder visual studio. Pertama kita buka folder opencv >> samples >> cpp >> pilih gambar(kita gunakan gambar dengan namafile adalah lena). Image yang ada pada opencv lalu kita copy paste ke dalam folder visual studio.


9. Setelah itu kita paste image tersebut ke dalam folder Visual Studio 2008 >> Projects >> coba >> coba. Tampilan folder saat image berhasil kita paste pada folder visual studio.

10. Setelah semua settingan selesai kita atur lalu pilih save project. Kemudian kita jalankan program dengan menngunakan tombol F5 pada keyboard atau kita pilih Debug >> start Debugging.
Jika program berhasil maka hasil gambar seperti ini:






Daftar Pustaka

0 komentar:

Posting Komentar

By :
Free Blog Templates