Belajar membuat Aplikasi Pengolahan Citra

39
Membuat Aplikasi Pengolahan Citra dengan OpenCV Mahisa Ajy Kusuma | http://mahisaajy.blogspot.com | @mahisaajay

description

mudahnya membuat pengolahan citra digital

Transcript of Belajar membuat Aplikasi Pengolahan Citra

  • Membuat Aplikasi Pengolahan Citra dengan OpenCV Mahisa Ajy Kusuma | http://mahisaajy.blogspot.com | @mahisaajay

  • http://mahisaajy.blogspot.com/

    1

    KATA PENGANTAR

    Puji syukur kehadirat Allah SWT, atas berkat dan rahmat-Nya pula sehingga penulis dapat menyelesaikan

    penulisan ebook: Membuat Aplikasi Pengolahan Citra dengan OpenCV ini dengan baik.

    Ebook ini menjelaskan mengenai bagaimana membuat aplikasi pengolahan citra. Penulis menggunakan

    bahasa C/C++ dan OpenCV, serta compiler yang digunakan yaitu Microsoft Visual C++ 2010 Express.

    Pembuatan ebook ini diharapkan dapat membantu para mahasiswa/i yang sedang mempelajari mata

    kuliah Grafik Komputer dan Pengolahan Citra, semoga dapat membantu bagaimana memahami algoritma

    yang digunakan dalam teknik pengolahan citra.

    Dalam kesempatan ini, penulis mengucapkan terima kasih kepada kedua orang tua penulis (atas doanya

    sehingga saya sudah melangkah sejauh ini), seluruh dosen Universitas Gunadarma khusunya untuk Ibu

    Lussiana ETP (terimakasih bu atas ilmunya selama beberapa minggu, saya belajar banyak hal karena ibu).

    Kemudian salam penulis untuk semua mahasiswa Gunadarma angkatan 2010 terutama kelas SMSI 01,

    ayo guys tetap pertahankan semangat kita, kalau kita yakin InsyaAllah kita bisa menjalani ini semua.

    Akhir kata, penulis akui masih banyak sekali kekurangan di dalam ebook ini. Oleh karena itu, penulis

    mengharapkan kritik dan saran yang bersifat membangun. Ok, enjoy this ebook. =)

    Januari 2013

    Penulis

  • http://mahisaajy.blogspot.com/

    2

    DAFTAR ISI

    KATA PENGANTAR .....1

    BAB 1 PENDAHULUAN ....3

    BAB 2 - INSTALASI DAN KONFIGURASI ...4

    BAB 3 - PROGRAM 1: HISTOGRAM CITRA ....12

    BAB 4 - PROGRAM 2: PERBAIKAN CITRA ..20

    BAB 5 - PROGRAM 3: DETEKSI TEPI CITRA ..24

    PENUTUP ......28

    DAFTAR PUSTAKA.29

    LAMPIRAN ...30

  • http://mahisaajy.blogspot.com/

    3

    BAB 1

    PENDAHULUAN

    Seiring dengan pesatnya kemajuan teknologi informasi, data atau informasi semakin banyak bila dilihat

    dari bentuk dan jenisnya. Mulai dari teks, gambar, audio, dan juga video.

    Gambar, atau yang bisa juga disebut sebagai citra, berperan sangat penting sebagai bentuk informasi

    visual. Ada yang mengatakan bahwa citra (gambar) lebih berarti dari ribuan kata-kata. Saya

    membenarkan hal tersebut, karena memang benar dengan melihat suatu gambar kita langsung bisa

    mendefinisikan sendiri mengenai gambar tersebut. Dan juga bisa memberikan banyak arti lainnya.

    Terkadang citra yang ada itu tidak sepenuhnya baik maksudnya tidak sepenuhnya sempurna, perlu

    dilakukan suatu proses untuk membuatnya menjadi lebih baik. Proses inilah yang dinamakan pengolahan

    citra.

    Teknik pengolahan citra-pun sudah semakin banyak digunakan. Contohnya saja dalam dunia

    perdagangan. Kita semua mungkin sudah tahu dengan yang namanya barcode. Penggunaan barcode di

    supermarket dibuat untuk mempermudah pembacaan harga. Bila tidak menggunakan barcode mungkin

    petugas bisa dibuat sulit, karena harus mengecek harga barang satu-satu. Selain itu masih ada lagi, sidik

    jari untuk kehadiran juga termasuk aplikasi pengolahan citra.

    Pengolahan citra merupakan suatu proses perbaikan kualitas citra agar mudah di interpretasi oleh manusia

    atau komputer. Proses-proses yang termasuk ke dalam pengolahan citra, yaitu :

    1. Perbaikan kualitas citra (Image Enhancement)

    2. Pemugaran citra (Image Restoration)

    3. Pemampatan citra (Image Compression)

    4. Segmentasi citra (Image Segmentation)

    5. Pengorakan citra (Image Analysis)

    6. Rekonstruksi citra (Image Recontruction)

    Di dalam ebook ini akan dijelaskan bagaimana membuat suatu aplikasi yang berkaitan dengan

    pengolahan citra. Aplikasinya yaitu :

    1. Histogram Citra

    2. Perbaikan Citra

    3. Deteksi Tepi Citra

    Sebelumnya, penulis akan memberitahukan bagaimana cara instalasi dan konfigurasi yang diperlukan

    dalam pembuatan aplikasi tersebut. Di halaman terakhir, penulis juga melampirkan source code yang

    digunakan dalam pembuatan aplikasi tersebut.

  • http://mahisaajy.blogspot.com/

    4

    BAB 2

    INSTALASI DAN KONFIGURASI

    Dalam pembuatan aplikasi pengolahan citra, penulis menggunakan perangkat lunak berikut :

    1. Microsoft Visual C++ 2010 Express

    Microsoft Visual C++ adalah software yang digunakan sebagai compiler. Compiler adalah

    perangkat lunak yang digunakan untuk mengubah source code dari suatu bahasa pemrograman

    (dalam kasus ini bahasa pemrogramannya yaitu C++) menjadi native code / bahasa mesin (file

    executable) agar dapat dieksekusi oleh komputer. Microsoft Visual C++ ini dibuat oleh

    perusahaan Microsoft.

    2. OpenCV 2.1

    OpenCV (Open Computer Vision) merupakan semacam library yang digunakan dalam membuat

    aplikasi yang berkaitan dengan computer vision. OpenCV juga menyediakan banyak

    fungsionalitas, yang tentunya dapat mempersingkat waktu dalam pembuatan aplikasi yang

    lumayan rumit.

    Spesifikasi minimum sistem yang harus Anda miliki yaitu :

    1,6 GHz or faster processor

    1024 MB RAM

    3 GB or available hard-disk space

    5400 RPM hard-disk drive

    Direct X 9 capable video car running at 1024 x 768 or higher display resolution

    DVD ROM drive

  • http://mahisaajy.blogspot.com/

    5

    2.1 INSTALASI

    2.1.1 INSTALASI MICROSOFT VISUAL C++ 2010 EXPRESS

    Instalasi Microsoft Visual C++ 2010 Express dimulai

    1. Langkah pertama download terlebih dahulu aplikasinya di alamat berikut ini

    http://www.microsoft.com/visualstudio/eng/downloads#d-2010-express , pastikan download

    language disesuaikan dengan bahasa yang kamu mengerti. Default : English. Jika sudah klik

    Install Now.

    2. Kemudian biarkan hingga proses download selesai. Setelah itu klik 2x pada file tersebut, untuk

    memulai instalasi.

    3. Setelah itu jendela instalasi akan terbuka. Klik next. Jangan lupa klik pada license agreement.

    Dan pastikan tidak merubah folder instalasi tujuan. Kemudian terakhir klik install.

  • http://mahisaajy.blogspot.com/

    6

    4. Selanjutnya tunggu sampai proses download dan install selesai. Kecepatan download tergantung

    dengan kecepatan internet yang Anda gunakan.

  • http://mahisaajy.blogspot.com/

    7

    5. Kemudian Anda diminta untuk merestart komputer. Klik tombol Restart Now.

    6. Kemudian instalasi akan dilanjutkan setelah komputer di restart.

  • http://mahisaajy.blogspot.com/

    8

    7. Instalasi selesai.

    2.1.2 INSTALASI OPENCV 2.1

    1. Silahkan Anda download terlebih dahulu pada situs berikut

    http://sourceforge.net/projects/opencvlibrary/files/opencv-win/2.1/OpenCV-2.1.0-win32-

    vs2008.exe/download , setelah itu klik 2x pada file hasil download tersebut.

    2. Kemudian akan muncul jendela instalasi, klik next.

    3. Kemudian pilih I agree

    4. Kemudian pilih Add OpenCV to the system PATH for all users

  • http://mahisaajy.blogspot.com/

    9

    5. Setelah itu next saja, terus sampai muncul jendela berikut. Klik install.

    7. Yap selesai

  • http://mahisaajy.blogspot.com/

    10

    2.2 KONFIGURASI Selanjutnya kita akan mengintegrasikan Open CV ke dalam Visual C++ 2010 Express.

    Langkahnya yaitu :

    1. Buat file project terlebih dahulu

    File -> New -> Project

    Name: imgproc...OK...Finish

    2. Langkah selanjutnya kita include OpenCV.

    Project -> imgproc Properties...Configuration Properties -> VC++ Directories

    Include Directories... add: 'C:\OpenCV2.1\include\opencv;'

    Library Directories... add: 'C:\OpenCV2.1\lib;'

    Source Directories... add: 'C:\OpenCV2.1\src\cv; C:\OpenCV2.1\src\cvaux;

    C:\OpenCV2.1\src\cxcore; C:\OpenCV2.1\src\highgui; C:\OpenCV2.1\src\ml;'

    Linker -> Input -> Additional Dependencies...

    add:'cv210.lib;cvaux210.lib;cxcore210.lib;highgui210.lib'

    3. Selesai.

    2.3 TESTING Dari langkah diatas berarti antara OpenCV dan Visual Studio sudah saling terintegrasi. Selanjutnya kita

    coba program sederhana berikut ini.

    // imgproc.cpp : Defines the entry point for the console application. // Created for build/install tutorial, Microsoft Visual C++ 2010 Express and OpenCV 2.1.0 #include "stdafx.h" #include #include

  • http://mahisaajy.blogspot.com/

    11

    #include int _tmain(int argc, _TCHAR* argv[]) { IplImage *img = cvLoadImage("funny-pictures-cat-goes-pew.jpg"); cvNamedWindow("Image:",1); cvShowImage("Image:",img); cvWaitKey(); cvDestroyWindow("Image:"); cvReleaseImage(&img); return 0; }

    Kemudian langkah selanjutnya.

    Debug -> Build Solution

    Pastikan gambar "funny-pictures-cat-goes-pew.jpg" ada di dalam folder berikut

    "C:\Users\mahisaajay\Documents\Visual Studio 2010\Projects\imgproc\imgproc"

    Debug -> Start Debugging

    Done.

  • http://mahisaajy.blogspot.com/

    12

    BAB 3

    PROGRAM 1: HISTOGRAM CITRA

    3.1 HISTOGRAM CITRA Untuk membuat histogram, penulis terlebih dahulu merubah gambar asli menjadi gambar grayscale (abu-

    abu), baru setelah itu membuat histogramnya.

    Citra asli (RGB).

    Citra asli merupakan citra yang memiliki warna alami dan belum mengalami perubahan. Dalam citra ini

    terdiri dari kombinasi warna merah (Red), hijau (Green), dan biru (Blue). Dengan demikian citra ini

    mempunyai 3 kanal, yang masing-masing kanal memiliki 8 bit per piksel, berarti total bit keseluruhan

    yang dimiliki citra ini yaitu 24 bit per piksel.

    Citra grayscale.

    Citra grayscale terdiri atas warna abu-abu, bervariasi pada warna hitam pada bagian intensitas terendah

    dan warna putih pada intensitas tertinggi. Pada citra grayscale, warna bervariasi antara hitam dan putih,

    tetapi variasi warna diantaranya sangatlah banyak. Citra grayscale disimpan dalam format 8 bit untuk

    setiap sample pixel, yang memungkinkan sebanyak 256 intensitas. Format ini sangatlah membantu dalam

    pemrograman karena manipulasi bit yang tidak terlalu banyak.

    Histogram.

    Dengan histogram kita bisa menentukan apakah citra yang akan dinilai tersebut baik atau malah

    sebaliknya. Kita juga bisa tahu bahwa citra tersebut cenderung gelap (under exposure) atau malah

    cenderung terang (over exposure).

    Grafik histogram yang dominan di bagian kiri menandakan gambar cenderung gelap. Puncak grafik di

    bagian kiri yang juga tampak sangat tinggi menandakan adanya clipping atau under exsposure.

    Grafik histogram yang dominan di bagian kanan menandakan gambar terlalu terang. Puncak grafik di

    bagian kanan yang juga tampak sangat tinggi menandakan over exposure.

    3.2 ALGORITMA Algoritma membuat histogram citra

    1. Konversi citra RGB menjadi citra grayscale

    - ambil nilai pixel merah, hijau, biru dari gambar berwarna

    - gunakan fungsi matematika dan masukkan nilainya dalam satu warna grayscale

    citra grayscale = 0,33 RED + 0,56 GREEN + 0,11 BLUE

    - ganti warna merah, hijau, biru dengan warna baru grayscale

    2. Membuat matriks dari citra

    3. Menentukan intensitas matriks

  • http://mahisaajy.blogspot.com/

    13

    4. Membuat histogram

    3.3 PEMROGRAMAN

    Penjelasan kode program

    #include "stdafx.h"

    #include

    #include

    #include

    #include

    #include

    #include

    #include

    #include "cv.h"

    Perintah include diatas merupakan prepocessor yang digunakan untuk melampirkan file header stafx.h,

    stdio.h, cv.h, iostream, conio.h, cxcore.h, highgui.h, stdlib.h

    using namespace cv;

    Baris ini memberitahukan kepada compiler bahwa program menggunakan standar opencv library.

    using namespace std;

    Baris ini memberitahukan kepada compiler bahwa program yang kita tulis menggunakan standar C++

    Library. Jika baris ini tidak ditulis, maka akan muncul error pada saat Anda meng-compile source code

    Anda yang menggunakan standar C++ Library, namun tidak memberi tahu compiler bahwa kode Anda

    menggunakan standar C++ Library.

    void histogram()

    Baris diatas merupakan fungsi histogram(), fungsi ini nanti dipanggil di dalam deklarasi fungsi main().

    Fungsi histogram ini berfungsi untuk untuk mengkonversi citra menjadi histogram. Fungsi histogram

    bertipe void, maksudnya fungsi tersebut tidak akan mengembalikan nilai apapun, yang berarti tidak perlu

    ada tipe data yang bersesuaian dengan nilai kembalian (tidak terdapat pernyataan return pada akhir kode

    fungsi).

    IplImage * img;

    IplImage * gray;

    IplImage * histogram;

    Merupakan perintah yang ada di dalam OpenCV yang digunakan untuk mendeskripsikan gambar. Berisi

    informasi tinggi, lebar, dan pixel dari gambar. Pendeklarasiannya yaitu dengan membuat pointer.

    int height, width, step, channels,k,i_max;

    Mendefinisikan variabel height, width, step, channels,k,i_max dengan tipe data int. Tipe data int

    merupakan tipe data yang memberitahukan kepada compiler bahwa variabel yang kita buat tersebut

  • http://mahisaajy.blogspot.com/

    14

    merupakan bilangan bulat dengan range (jangkauan) -2147483648 sampai 2147483647.

    int * hist;

    uchar * data;

    uchar * * gray_arr;

    uchar * * histo_arr;

    Untuk mendeklarasikan variabel diatas sebagai pointer

    img = cvLoadImage("me.jpg");

    Perintah cvLoadImage digunakan untuk membaca gambar.

    height = img->height; // height of image

    width = img->width; // width of image

    step = img->widthStep; // no. of array element for one row of image data

    channels = img->nChannels; // no. of channels.... R,G,B, alpga , gama......

    data = (uchar *)img->imageData;

    Potongan kode diatas yaitu untuk mendefinisikan gambar, seperti tinggi, lebar, dan lain sebagainya.

    hist = (int *)calloc(256,sizeof(int));

    Calloc digunakan untuk mengalokasikan ruang untuk array di dalam memori

    histo_arr =(uchar * * )malloc(sizeof(uchar * )*(height + 1));

    gray_arr = (uchar * * )malloc(sizeof(uchar * )*(height + 1));

    Malloc digunakan untuk mengalokasikan blok memori dan mengembalikan pointer ke awal blok

    // Convert the RGB image to a grayscale image

    for(int i=0; i

  • http://mahisaajy.blogspot.com/

    15

    //Construct the histogram array

    for(int i=0;i

  • http://mahisaajy.blogspot.com/

    16

    Perintah diatas untuk membuka program notepad.exe yang ada pada program files, kemudian

    menampilkan isi file bernama matriks-histogram.txt. Perintah system diatas mempunyai kekurangan,

    karena disaat program notepad muncul maka program akan berhenti sementara. Sampai program notepad

    tersebut ditutup, program baru akan melanjutkan eksekusinya.

    int find_max(int * hist,int n){

    int i_max=0;

    for( int i=0;ihist[i_max])

    i_max=i;

    printf("Nilai matriks yang paling sering muncul = %d\n",i_max);

    return (i_max);

    }

    //Find the maximum height of a bar to scale it according to the height of the image.

    i_max=find_max(hist,256);

    printf("MAX=%d\ni=%d",hist[i_max],i_max);

    Potongan kode diatas yaitu untuk mendapatkan tinggi maksimum dari bar yang menandakan intensitas

    matriks yang paling sering muncul. Disana juga terdapat fungsi find_max() yang telah dideklarasikan

    sebelumnya di atas fungsi histogram().

    // Construct the image displaying the histogram.

    for(int i=(height-1);i>0;i--) {

    for (int j=0;j

  • http://mahisaajy.blogspot.com/

    17

    for(int j=0; jimageData[i*gray->widthStep + j*gray->nChannels] =

    gray_arr[i][j];

    }

    }

    for(int i=0; iwidthStep + j*histogram-

    >nChannels] = histo_arr[i][j];

    }

    }

    Potongan kode diatas yaitu untuk membuat gambar gray dan histogram, masing-masing 8 bit per pixel.

    cvNamedWindow("Original Image", CV_WINDOW_NORMAL);

    cvMoveWindow("Original Image", 100, 100);

    cvShowImage("Original Image", img);

    cvNamedWindow("GrayScaled Image", CV_WINDOW_NORMAL);

    cvMoveWindow("GrayScaled Image", 500, 100);

    cvShowImage("GrayScaled Image", gray);

    cvNamedWindow("Histogram Image",CV_WINDOW_NORMAL);

    cvMoveWindow("Histogram Image",100,100);

    cvShowImage("Histogram Image",histogram);

    cvNamedWindow yaitu untuk membuat window dengan nama dan ukuran yang telah ditentukan.

    cvMoveWindow yaitu untuk menentukan posisi / letak window dihitung dari sudut kiri layar

    cvShowImage yaitu untuk memunculkan gambar

    cvWaitKey(0);

    waitkey digunakan memberhentikan sementara program sampai user menutup semua window img, gray,

    dan histogram yang terbuka.

    cvReleaseImage(&img);

    cvReleaseImage(&gray);

    cvReleaseImage(&histogram);

    Releaseimage digunakan untuk menghapus alamat dari pointer img, gray, dan histogram.

    free(gray_arr);

    free(histo_arr);

    Statement diatas untuk membersihkan memori yang telah terpakai oleh gray_arr dan histo_arr.

  • http://mahisaajy.blogspot.com/

    18

    3.4 DEMO PROGRAM Setelah program dijalankan maka akan mengeluarkan output berupa gambar asli, gambar abu-abu,

    gambar histogram, dan intentsitas matriks.

    Properti gambar yang digunakan yaitu :

    Name : me.jpg

    Item type : JPEG image

    Dimensions : 500 pixel x 375 pixel

    Size : 54.3 KB

    Bit depth : 24

    Camera maker : EASTMAN KODAK COMPANY

    Camera model : KODAK V550 ZOOM DIGITAL CAMERA

  • http://mahisaajy.blogspot.com/

    19

    Bila dilihat dari bentuk histogramnya yang cenderung ke arah kiri, kita dapat menentukan bahwa gambar

    tersebut berarti cenderung gelap.

    Gambar diatas merupakan intensitas matriks yang didapat dari gambar me.jpg tersebut. Karena ukuran

    gambar 500 (lebar) x 375 (tinggi), berarti intensitas matriks yang terbuat terdiri dari 375 baris dan 500

    kolom.

  • http://mahisaajy.blogspot.com/

    20

    BAB 4

    PROGRAM 2: PERBAIKAN CITRA

    4.1 PERBAIKAN KUALITAS CITRA (IMAGE ENHANCEMENT) Yang dimaksud dengan perbaikan kualitas citra adalah proses mendapatkan citra yang lebih mudah

    diinterpretasikan oleh mata manusia. Perbaikan kualitas citra diperlukan karena seringkali citra yang

    digunakan mempunyai kualitas yang kurang baik, sehingga sulit untuk di proses lebih lanjut.

    Untuk memperbaiki kualitas citra, penulis menggunakan pengubahan kecerahan gambar atau biasa

    disebut Image Brightness. Kecerahan/kecemerlangan gambar dapat diperbaiki dengan menambahkan

    (atau mengurangkan) sebuah konstanta kepada (atau dari) setiap pixel di dalam citra. Akibat dari operasi

    ini, histogram citra mengalami pergeseran.

    Secara matematis operasi ini ditulis sebagai

    f (x, y) = f (x, y) + b

    Jika b positif, kecerahan gambar bertambah, sebaliknya jika b negatif kecerahan gambar berkurang.

    Dalam digital coloring, ada yang dinamakan dengan HSV (Hue-Saturation-Value). Sebelum value

    brightness ditambah ke dalam tiap-tiap pixel, mode warna gambar di ubah dulu dari yang semula (RGB)

    menjadi HSV.

    Hue merupakan warna itu sendiri (merah, biru, kuning, dsb), Saturation adalah jumlah warna abu-abu

    dalam satu Hue, dan Value adalah brightness dari Hue tersebut. HSV terkadang juga disebut HSB (hue,

    saturation, brightness).

    4.2 ALGORITMA 1. Siapkan gambar yang akan diperbaiki kualitas citranya.

    2. Mengubah warna dari RGB menjadi HSV.

    3. Intensitas matriks ditambah value brightness yang telah ditentukan sendiri.

    f (x, y) = f (x, y) + b

    4. Merubah kembali mode warna dari HSV menjadi RBG.

    4.3 PEMROGRAMAN

    Berikut penjelasan mengenai kode program :

    void perbaikancitra()

    Baris diatas merupakan fungsi perbaikancitra(), fungsi ini nanti dipanggil di dalam deklarasi fungsi

    main(). Fungsi perbaikan citra ini digunakan untuk memperbaiki kualitas citra. Fungsi bertipe void,

    maksudnya fungsi tersebut tidak akan mengembalikan nilai apapun, yang berarti tidak perlu ada tipe data

    yang bersesuaian dengan nilai kembalian (tidak terdapat pernyataan return pada akhir kode fungsi).

  • http://mahisaajy.blogspot.com/

    21

    int i,j,k;

    int heightc,widthc,stepc,channelsc,height,width;

    int temp=0;

    int units=0;

    uchar *data,*datac;

    i=j=k=0;

    Baris diatas mendefinisikan variabel yang akan digunakan lebih lanjut di dalam program.

    IplImage *img=cvLoadImage("me.jpg",1);

    Perintah diatas untuk me-load gambar ke dalam program. Nama file gambarnya yaitu me.jpg.

    IplImage *convert=cvCreateImage( cvGetSize(img), 8, 3 );

    IplImage *result=cvCreateImage( cvGetSize(img), 8, 3 );

    Perintah diatas untuk membuat gambar yaitu variabel convert dan result, pendeklarasiannya

    menggunakan pointer. Kemudian cvGetSize untuk mendapatkan ukuran mengenai gambar yang telah

    disimpan ke dalam variabel img. Sedangkan angka 8 itu berarti 8 bit, dan 3 untuk channel yang digunakan

    dalam tiap pixel gambar.

    printf("Masukkan value brightness yang diinginkan = ");

    scanf("%d", &units);

    Perintah diatas untuk mendapatkan tingkat brightness yang nanti akan diinputkan oleh user. Dan tingkat

    brightness tersebut akan disimpan ke dalam variabel units, yang nanti akan diproses pada tahap

    selanjutnya.

    height = img->height;

    width = img->width;

    Untuk mendapatkan tinggi dan lebar dari gambar.

    if (units != 0){

    printf("\nTinggi gambar=%d\n",height);

    printf("\nLebar gambar=%d\n",width);

    }

    if(img==NULL ) {

    puts("unable to load the frame");exit(0);

    }

    cvNamedWindow("original",CV_WINDOW_AUTOSIZE);

    cvNamedWindow("Result",CV_WINDOW_AUTOSIZE);

    Perintah diatas untuk membuat window baru dengan nama dan ukuran

  • http://mahisaajy.blogspot.com/

    22

    heightc = convert->height;

    widthc = convert->width;

    stepc=convert->widthStep;

    channelsc=convert->nChannels;

    datac = (uchar *)convert->imageData;

    Potongan kode diatas yaitu untuk mendefinisikan gambar, seperti tinggi, lebar, dan lain sebagainya.

    cvCvtColor(img,convert,CV_BGR2HSV);

    Untuk merubah warna dari satu ruang warna ke yang lainnya. CV_BGR2HSV untuk transformasi dari

    warna RGB ke HSV, dalam kasus 8-bit dan 16-bit gambar R, G dan B akan dikonversi ke format floating-

    point dan diskala agar sesuai dengan kisaran 0 hingga 1.

    for(i=0;i< (heightc);i++) for(j=0;j255) datac[i*stepc+j*channelsc+1]=255;

    else datac[i*stepc+j*channelsc+1]=temp;/*you may

    please remove and see what is happening if the if else loop is not there*/}

    cvCvtColor(convert, result, CV_HSV2BGR);

    Untuk transformasi warna dari warna HSV ke RGB.

    cvShowImage("Result", result);

    cvShowImage("original", img);

    Untuk memunculkan gambar.

    cvSaveImage("meresult.jpg",result);

    Untuk menyimpan gambar dengan nama "meresult.jpg"

    cvWaitKey(0);

    waitkey digunakan memberhentikan sementara program sampai user menutup semua window img, gray,

  • http://mahisaajy.blogspot.com/

    23

    dan histogram yang terbuka.

    4.4 DEMO PROGRAM

    Saat program dijalankan. User diminta untuk memasukkan value brightness, yang nantinya value tersebut

    akan diproses terhadap citra yang kurang baik hinga menjadi lebih baik.

    Dalam contoh gambar diatas, penulis memasukkan nilai brightness sebesar 80.

    Catatan: jarak histogram horizontal dari 0 255 itu tidak full 1 window diatas, melainkan kurang lebih

    setengahnya.

    Setelah dilakukan proses penambahan brightness, bentuk histogram menjadi lebih ke tengah. Karena

    intensitas matriks yang tadinya x menjadi x+80, otomatis mempengaruhi bentuk histogramnya.

  • http://mahisaajy.blogspot.com/

    24

    BAB 5

    PROGRAM 3: DETEKSI TEPI CITRA

    5.1 DETEKSI TEPI CITRA (EDGE DETECTION) Deteksi tepi pada suatu citra adalah suatu proses yang menghasilkan garis-garis tepi dari obyek citra,

    tujuannya yaitu untuk :

    Meningkatkan penampakan garis batas suatu daerah atau objek di dalam citra

    Mmenandai bagian yang menjadi detail citra

    Mencirikan batas objek dan berguna untuk proses segmentasi dan identifikasi objek

    Memperbaiki detail citra yang kabur

    Garis tepi tersebut ditandai dengan jauhnya perbedaan selisih antar tiap pixel, sehingga kita dapat

    menentukan bahwa titik tersebut merupakan tepi.

    Terdapat 3 macam tepi dalam citra, yaitu :

    a) Tepi Curam

    Tepi curam adalah tepi dengan perubahan intensitas yang tajam. Arah tepi berkisar 90 derajat.

    b) Tepi Landai

    Tepi landai yaitu tepi dengan sudut arah yang kecil. Tepi landai dapat dianggap terdiri dari

    sejumlah tepi-tepi lokal yang lokasinya berdekatan.

    c) Tepi yang mengandung derau

    Umumnya tepi yang terdapat pada aplikasi visi komputer mengandung derau. Operasi

    peningkatan kualitas citra dapat dilakukan terlebih dahulu sebelum pendektesian tepi.

    5.2 ALGORITMA 1. Siapkan gambar.

    2. Terapkan Gaussianblur pada gambar, yang berguna untuk mengurangi noise.

    3. Konversi gambar yang sudah terfilter, menjadi grayscale.

  • http://mahisaajy.blogspot.com/

    25

    4. Menggunakan fungsi sobel.

    5.3 PEMROGRAMAN

    void deteksitepi()

    Baris diatas merupakan fungsi deteksitepi(), fungsi ini nanti dipanggil di dalam deklarasi fungsi main().

    Fungsi deteksitepi ini berfungsi untuk untuk mendeteksi tepi citra. Fungsi deteksitepi bertipe void,

    maksudnya fungsi tersebut tidak akan mengembalikan nilai apapun, yang berarti tidak perlu ada tipe data

    yang bersesuaian dengan nilai kembalian (tidak terdapat pernyataan return pada akhir kode fungsi).

    Mat src, src_gray;

    Mat grad;

    Mat opencv matrix class

    char* window_name = "Sobel Demo - Simple Edge Detector";

    Pertama kita mendeklarasikan variabel yang nantinya akan digunakan.

    int scale = 1;

    int delta = 0;

    int ddepth = CV_16S;

    int c;

    Untuk mendeklarasikan variabel dengan tipe integer.

    /// Load an image

    src = imread("me.jpg");

    Untuk me-load gambar "me.jpg" ke dalam variabel src.

    if( !src.data )

    {

    cout

  • http://mahisaajy.blogspot.com/

    26

    /// Create window

    namedWindow( window_name, CV_WINDOW_AUTOSIZE);

    NamedWindow yaitu untuk membuat window dengan nama dan ukuran yang telah ditentukan.

    /// Generate grad_x and grad_y

    Mat grad_x, grad_y;

    Mat abs_grad_x, abs_grad_y;

    /// Gradient X

    Sobel( src_gray, grad_x, ddepth, 1, 0, 3, scale, delta, BORDER_DEFAULT );

    /// Gradient Y

    Sobel( src_gray, grad_y, ddepth, 0, 1, 3, scale, delta, BORDER_DEFAULT );

    Selanjutnya menghitung derivatif dalam arah x dan y. Untuk itu kita menggunakan fungsi sobel.

    convertScaleAbs( grad_x, abs_grad_x );

    convertScaleAbs( grad_y, abs_grad_y );

    Perintah diatas untuk mengkonversi hasil parsial kembali ke dalam format CV_8U

    /// Total Gradient (approximate)

    addWeighted( abs_grad_x, 0.5, abs_grad_y, 0.5, 0, grad );

    Untuk memperkirakan gradien dengan menambahkan kedua gradien dari masing-masing arah.

    imshow( window_gray, src_gray );

    Dan terakhir, memunculkan gambar.

    waitKey(0);

    waitkey digunakan memberhentikan sementara program sampai user menutup semua window img, gray,

    dan histogram yang terbuka.

  • http://mahisaajy.blogspot.com/

    27

    5.4 DEMO PROGRAM

    Saat program dijalankan, program langsung mengeluarkan gambar hasil pendeteksian tepi. Berikut

    dibawah ini gambarnya.

  • http://mahisaajy.blogspot.com/

    28

    PENUTUP

    Penulis akui ebook ini masih banyak sekali kekurangan apabila dibandingkan dengan ebook lain yang

    bertebaran di luar sana. Penulis sengaja dokumentasikan tugas mata kuliah, agar bisa bermanfaat bagi

    yang lainnya.

    Semoga dengan berakhirnya halaman penutup ini, sudah bisa memberikan sedikit pengetahuan mengenai

    pembuatan aplikasi pengolahan citra. Bila kalian ingin mendalami mengenai pengolahan citra kalian bisa

    melihat referensi yang penulis gunakan dalam pembuatan ebook ini. Selain itu, apabila Anda ingin

    bertanya atau menyanggah isi dari ebook ini saya akan dengan senang hati menerimanya pula. Silahkan

    kirimkan melalui email saya di alamat [email protected] .

    Jangan cepat menyerah bila mengalami kesulitan, teruslah mencoba dan mencoba. Karena dengan

    kebiasaan, mudah-mudahan semua menjadi mudah. Oke sampai jumpa di lain kesempatan.

  • http://mahisaajy.blogspot.com/

    29

    DAFTAR PUSTAKA

    Buku dan Ebook

    Fatta, Hanif Al. 2007. Konversi Format Citra RGB Ke Format Grayscale Menggunakan Visual Basic.

    Nursyamsu, Ardi. 2011. Masuki Dunia Hacker Dengan C++. Jakarta: Jasakom.

    Wibowo, Esther dan Erick Kurniawan. 2008. Histogram.

    Hidayatno, Achmad dkk. 2010. Analisis Deteksi Tepi Pada Citra Berdasarkan Perbaikan Kualitas Citra

    Website

    http://opencv.willowgarage.com/documentation/cpp/

    http://docs.opencv.org/

    http://www.codeblues.in/programming.php

    https://sammypatikawa.wordpress.com/2012/05/11/greyscale/

    http://www.mathworks.com/support/solutions/en/data/1-ECUGQX/

    http://blog.aguskurniawan.net/post/opencv-210-with-visual-studio-2010.aspx

    http://myopencv.wordpress.com/2009/06/14/image-enhancement-using-hsv-color-space/

  • http://mahisaajy.blogspot.com/

    30

    LAMPIRAN imgproc.cpp

    // imgproc.cpp : Defines the entry point for the console application. // #include "stdafx.h" /* This code calculates the image histogram and displays it as a black and white image with the bars in white. The base of the image holds the intensity values with the 256 values distributed evenly across the width of the image. */ #include #include #include #include #include #include #include #include "cv.h" using namespace std; using namespace cv; //Returns the index of the maximum element in the array int find_max(int * hist,int n){ int i_max=0; for( int i=0;ihist[i_max]) i_max=i; printf("Nilai matriks yang paling sering muncul = %d\n",i_max); return (i_max); } //Returns the index of the maximum element in the array int find_max2(int * hist2,int n) { int i_max2=0; for(int i=0;ihist2[i_max2]) i_max2=i; printf("Nilai matriks yang paling sering muncul = %d\n",i_max2); return (i_max2); } void histogram(){ IplImage * img; IplImage * gray; IplImage * histogram; int height, width, step, channels,k,i_max; int * hist; uchar * data; uchar * * gray_arr; uchar * * histo_arr; img = cvLoadImage("me.jpg"); height = img->height; // height of image

  • http://mahisaajy.blogspot.com/

    31

    width = img->width; // width of image step = img->widthStep; // no. of array element for one row of image data channels = img->nChannels; // no. of channels.... R,G,B, alpga , gama...... data = (uchar *)img->imageData; hist = (int *)calloc(256,sizeof(int)); histo_arr =(uchar * * )malloc(sizeof(uchar * )*(height + 1)); gray_arr = (uchar * * )malloc(sizeof(uchar * )*(height + 1)); // Convert the RGB image to a grayscale image for(int i=0; i

  • http://mahisaajy.blogspot.com/

    32

    for(int i=(height-1);i>0;i--) { for (int j=0;jnChannels] = histo_arr[i][j]; } } cvNamedWindow("Original Image", CV_WINDOW_NORMAL); cvMoveWindow("Original Image", 100, 100); cvShowImage("Original Image", img); cvNamedWindow("GrayScaled Image", CV_WINDOW_NORMAL); cvMoveWindow("GrayScaled Image", 500, 100); cvShowImage("GrayScaled Image", gray); cvNamedWindow("Histogram Image",CV_WINDOW_NORMAL); cvMoveWindow("Histogram Image",100,100); cvShowImage("Histogram Image",histogram); cvWaitKey(0); cvReleaseImage(&img); cvReleaseImage(&gray); cvReleaseImage(&histogram); free(gray_arr); free(histo_arr); } void histbefore() { IplImage * img; IplImage * gray; IplImage * histogram; int height, width, step, channels,k,i_max; int * hist; uchar * data; uchar * * gray_arr; uchar * * histo_arr; img = cvLoadImage("me.jpg"); height = img->height; // height of image

  • http://mahisaajy.blogspot.com/

    33

    width = img->width; // width of image step = img->widthStep; // no. of array element for one row of image data channels = img->nChannels; // no. of channels.... R,G,B, alpga , gama...... data = (uchar *)img->imageData; hist = (int *)calloc(256,sizeof(int)); histo_arr =(uchar * * )malloc(sizeof(uchar * )*(height + 1)); gray_arr = (uchar * * )malloc(sizeof(uchar * )*(height + 1)); // Convert the RGB image to a grayscale image for(int i=0; i

  • http://mahisaajy.blogspot.com/

    34

    printf("\nPanjang Gambar (height) = %d pixel ",height); printf("\nLebar Gambar (width) = %d pixel \n",width); gray = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 1); histogram = cvCreateImage(cvSize(width,height),IPL_DEPTH_8U,1); for(int i=0; iwidthStep + j*gray->nChannels] = gray_arr[i][j]; } } for(int i=0; iwidthStep + j*histogram->nChannels] = histo_arr[i][j]; } } cvNamedWindow("Histogram Image Before",CV_WINDOW_NORMAL); cvMoveWindow("Histogram Image Before",100,100); cvShowImage("Histogram Image Before",histogram); free(gray_arr); free(histo_arr); /////////////////////////////////////////////////////////////////////////////// } void perbaikancitra() { int i,j,k; int heightc,widthc,stepc,channelsc,height,width; int temp=0; int units=0; uchar *data,*datac; i=j=k=0; IplImage *img=cvLoadImage("me.jpg",1); IplImage *convert=cvCreateImage( cvGetSize(img), 8, 3 ); IplImage *result=cvCreateImage( cvGetSize(img), 8, 3 ); printf("Masukkan value brightness yang diinginkan = "); scanf("%d", &units); height = img->height; width = img->width; if (units != 0){ printf("\nTinggi gambar=%d\n",height); printf("\nLebar gambar=%d\n",width); } if(img==NULL ) { puts("unable to load the frame");exit(0); } cvNamedWindow("original",CV_WINDOW_AUTOSIZE);

  • http://mahisaajy.blogspot.com/

    35

    cvNamedWindow("Result",CV_WINDOW_AUTOSIZE); heightc = convert->height; widthc = convert->width; stepc=convert->widthStep; channelsc=convert->nChannels; datac = (uchar *)convert->imageData; cvCvtColor(img,convert,CV_BGR2HSV); for(i=0;i< (heightc);i++) for(j=0;j255) datac[i*stepc+j*channelsc+1]=255; else datac[i*stepc+j*channelsc+1]=temp;/*you may please remove and see what is happening if the if else loop is not there*/} cvCvtColor(convert, result, CV_HSV2BGR); cvShowImage("Result", result); cvShowImage("original", img); cvSaveImage("meresult.jpg",result); histbefore(); // panggil fungsi histbefore ////////////////////////////////////////// // ini program untuk memunculkan histogram after //IplImage * result; IplImage * gray2; IplImage * histogram2; int height2, width2, step2, channels2; int l,i_max2; int * hist2; uchar * data2; uchar * * gray_arr2; uchar * * histo_arr2; result = cvLoadImage("meresult.jpg"); height2 = result->height; width2 = result->width; step2 = result->widthStep; channels2 = result->nChannels; data2 = (uchar *)result->imageData;

  • http://mahisaajy.blogspot.com/

    36

    hist2 = (int *)calloc(256,sizeof(int)); histo_arr2 =(uchar * * )malloc(sizeof(uchar * )*(height2 + 1)); gray_arr2 = (uchar * * )malloc(sizeof(uchar * )*(height2 + 1)); // Convert the RGB image to a grayscale image for(int i=0; i

  • http://mahisaajy.blogspot.com/

    37

    for(int j=0; jimageData[i*gray2->widthStep + j*gray2->nChannels] = gray_arr2[i][j]; } } for(int i=0; iwidthStep + j*histogram2->nChannels] = histo_arr2[i][j]; // *histogram2 } } cvNamedWindow("Histogram Image After",CV_WINDOW_NORMAL); cvMoveWindow("Histogram Image After",100,100); cvShowImage("Histogram Image After",histogram2); free(gray_arr2); free(histo_arr2); //////////////////////////////////////////////////////// cvWaitKey(0); cvDestroyWindow("original"); cvDestroyWindow("Result"); } void deteksitepi() { Mat src, src_gray; Mat grad; char* window_name = "Sobel Demo - Simple Edge Detector"; int scale = 1; int delta = 0; int ddepth = CV_16S; int c; /// Load an image src = imread("me.jpg"); if( !src.data ) { cout

  • http://mahisaajy.blogspot.com/

    38

    /// Generate grad_x and grad_y Mat grad_x, grad_y; Mat abs_grad_x, abs_grad_y; /// Gradient X //Scharr( src_gray, grad_x, ddepth, 1, 0, scale, delta, BORDER_DEFAULT ); Sobel( src_gray, grad_x, ddepth, 1, 0, 3, scale, delta, BORDER_DEFAULT ); convertScaleAbs( grad_x, abs_grad_x ); /// Gradient Y //Scharr( src_gray, grad_y, ddepth, 0, 1, scale, delta, BORDER_DEFAULT ); Sobel( src_gray, grad_y, ddepth, 0, 1, 3, scale, delta, BORDER_DEFAULT ); convertScaleAbs( grad_y, abs_grad_y ); /// Total Gradient (approximate) addWeighted( abs_grad_x, 0.5, abs_grad_y, 0.5, 0, grad ); imshow( window_name, grad ); waitKey(0); } void about() { printf("Selamat menikmati program ini hehe\nSpecial Thanks for our team : \nAjy, Alicia, Endru, Sita, Windy\n"); } void main() { int pil; printf("Aplikasi Pengolahan Citra v1.0\n"); printf("1. Konversi image ke histogram \n"); printf("2. Perbaikan Citra \n"); printf("3. Deteksi Tepi \n"); printf("4. Tentang program \n"); printf("5. Keluar \n"); printf("Masukkan pilihan [1-5] ? "); scanf_s("%d",&pil); switch (pil) { case 1: histogram(); break; case 2: perbaikancitra(); break; case 3: deteksitepi(); break; case 4: about(); break; case 5: exit(0); default: "Pilihan tidak ada"; } system("PAUSE"); }