SlideShare a Scribd company logo
1 of 39
Download to read offline
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.1includeopencv;'
Library Directories... add: 'C:OpenCV2.1lib;'
Source Directories... add: 'C:OpenCV2.1srccv; C:OpenCV2.1srccvaux;
C:OpenCV2.1srccxcore; C:OpenCV2.1srchighgui; C:OpenCV2.1srcml;'
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 <cv.h>
#include <cxcore.h>
http://mahisaajy.blogspot.com/ 11
#include <highgui.h>
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:UsersmahisaajayDocumentsVisual Studio 2010Projectsimgprocimgproc"
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 <stdio.h>
#include <cv.h>
#include <iostream>
#include <conio.h>
#include <cxcore.h>
#include <highgui.h>
#include <stdlib.h>
#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<height; i++) {
histo_arr[i]=(uchar *)malloc(sizeof(uchar)*(width + 1));
gray_arr[i] = (uchar * )malloc(sizeof(uchar)*(width + 1));
for(int j=0; j<width; j++) {
// we know that ISO grayscale image is 11%BLUE + 56% GREEN + 33%
RED..... so converitng 1d array into 2d array
gray_arr[i][j] = (0.11*data[i*step + j*channels] + 0.56*data[i*step +
j*channels + 1] + 0.33*data[i*step + j*channels + 2]);
histo_arr[i][j] = 0;
}
}
Dalam blok kode 2 perulangan for diatas yaitu untuk mengkonversi gambar RGB menjadi gambar abu-
abu
FILE * pFile;
pFile = fopen("matriks-histogram.txt","w");
http://mahisaajy.blogspot.com/ 15
//Construct the histogram array
for(int i=0;i<height;i++) {
fprintf(pFile,"baris %d --> ",(i+1));
for (int j=0;j<width;j++) {
//gray_arr[i][j]+=80;
k=gray_arr[i][j];
fprintf (pFile, "| %d | ", gray_arr[i][j]);
hist[k]++;
}
fprintf(pFile,"n");
}
fclose (pFile);
system("notepad.exe matriks-histogram.txt" );
Potongan kode diatas yaitu untuk mendapatkan intensitas matriks dari tiap-tiap pixel, kemudian output
dari intensitas matriks tersebut disimpan dalam file teks bernama "matriks-histogram.txt".
FILE * pFile;
pFile = fopen("matriks-histogram.txt","w");
Fungsi fopen() adalah fungsi yang digunakan untuk membuka suatu file (jika file tersebut ada) atau
membuat suatu file baru jika file tersebut tidak ada. Untuk menggunakan fungsi ini, Anda harus
melampirkan file header stdio.h. Dalam contoh diatas, file yang digunakan bernama "matriks-
histogram.txt". Sebenarnya tidak hanya nama, parameter tersebut juga bisa menunjukkan lokasi file yang
akan dibuka atau dibuat. Selanjutnya ada parameter "w", yang digunakan sebagai penentu fungsi dalam
bekerja dengan suatu file. Penjelasan mengenai parameter "w" yaitu membuat sebuah file untuk ditulisi,
apabila file sudah ada, maka file tersebut akan ditimpa ulang (overwritten).
Apabila fungsi ini sukses dipanggil, maka akan memberikan nilai return berupa pointer ke file yang
dibuka. Maka agar dapat melakukan operasi dengan file tersebut, kita harus menyediakan sebuah pointer
dari class FILE untuk menampung nilai return fungsi fopen() tersebut. Dalam contoh diatas, pointer yang
digunakan yaitu pFile.
fprintf(pFile,"baris %d --> ",(i+1));
Fprintf digunakan untuk menuliskan suatu string ke dalam file teks. File teks yang digunakan adalah file
teks yang telah ditunjuk oleh pointer dari class FILE, yaitu pFile. Kemudian string "baris %d --> ",(i+1)
adalah kalimat yang akan dituliskan ke dalam file teks.
fclose (pFile);
Digunakan untuk menutup file teks, dimana pFile merupakan pointer yang menunjuk file teks yang
dibuka dengan fungsi fopen().
system("notepad.exe matriks-histogram.txt" );
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;i<n;i++)
if(hist[i]>hist[i_max])
i_max=i;
printf("Nilai matriks yang paling sering muncul = %dn",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=%dni=%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<256;j++) {
if(i<=((hist[j]*height)/hist[i_max])) {
histo_arr[height-i][j*(width/256)]=255;
}
}
}
Potongan kode diatas yaitu untuk membangun atau menyusun gambar yang akan ditampilkan dalam
bentuk histogram.
printf("nUkuran gambar = %d x %d",width,height);
printf("nPanjang Gambar (height) = %d pixel ",height);
printf("nLebar Gambar (width) = %d pixel n",width);
Perintah diatas untuk mencetak deskripsi mengenai gambar, seperti ukuran gambar, panjang gambar, dan
lebar gambar.
gray = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 1);
histogram = cvCreateImage(cvSize(width,height),IPL_DEPTH_8U,1);
for(int i=0; i<height; i++) {
http://mahisaajy.blogspot.com/ 17
for(int j=0; j<width; j++) {
gray->imageData[i*gray->widthStep + j*gray->nChannels] =
gray_arr[i][j];
}
}
for(int i=0; i<height; i++) {
for(int j=0; j<width; j++) {
histogram->imageData[i*histogram->widthStep + 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=%dn",height);
printf("nLebar gambar=%dn",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;j<(widthc);j++)
{
/*Here datac means data of the HSV Image*/
/*Here i want to Increase the saturation or the strength of the Colors in the Image
and then I would be able to perform a good color detection*/
temp=datac[i*stepc+j*channelsc+1]+units;/*increas the saturaion component is
the second arrray.*/
/*Here there is a small problem...when you add a value to the data and if it exceeds
255
it starts all over again from zero and hence some of the pixels might go to zero.
So to stop this we need to include this loop i would not try to explain the loop but
please try and follow it is easy to do so..*/
if(temp>255) 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 << "Gak ada source gan!";
getch();
system("exit");
//return -1;
}
Jika variabel src untuk me-load gambar tadi tidak ada, maka akan mengeluarkan output "Gak ada source
gan!". Dan program akan keluar sendiri.
GaussianBlur( src, src, Size(3,3), 0, 0, BORDER_DEFAULT );
Kemudian kita terapkan GaussianBlur ke gambar untuk mengurangi noise (kernel size = 3)
Fungsi diatas yaitu untuk mem-blur-kan image
/// Convert it to gray
cvtColor( src, src_gray, CV_RGB2GRAY );
Perintah diatas untuk mengkonversi gambar yang sudah terfilter tadi, menjadi grayscale.
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 kusumaajymahisa@yahoo.co.id .
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 <stdio.h>
#include <cv.h>
#include <iostream>
#include <conio.h>
#include <cxcore.h>
#include <highgui.h>
#include <stdlib.h>
#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;i<n;i++)
if(hist[i]>hist[i_max])
i_max=i;
printf("Nilai matriks yang paling sering muncul = %dn",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;i<n;i++)
if(hist2[i]>hist2[i_max2])
i_max2=i;
printf("Nilai matriks yang paling sering muncul = %dn",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<height; i++) {
histo_arr[i]=(uchar *)malloc(sizeof(uchar)*(width + 1));
gray_arr[i] = (uchar * )malloc(sizeof(uchar)*(width + 1));
for(int j=0; j<width; j++) {
// we know that ISO grayscale image is 11%BLUE + 56% GREEN + 33%
RED..... so converitng 1d array into 2d array
gray_arr[i][j] = (0.11*data[i*step + j*channels] + 0.56*data[i*step
+ j*channels + 1] + 0.33*data[i*step + j*channels + 2]);
histo_arr[i][j] = 0;
}
}
printf("nUntuk dapat mengetahui intensitas matriks,n
Anda dapat melihat program notepad yang terbuka atau n
bisa juga dengan melihat file matriks-histogram.txt");
printf("nnUntuk melihat bentuk histogramnya,n
Anda harus menutup (close) program notepad yang terbuka,n
Baru setelah itu window histogram akan muncul");
FILE * pFile;
pFile = fopen("matriks-histogram.txt","w");
//Construct the histogram array
for(int i=0;i<height;i++) {
fprintf(pFile,"baris %d --> ",(i+1));
for (int j=0;j<width;j++) {
//gray_arr[i][j]+=80;
k=gray_arr[i][j];
fprintf (pFile, "| %d | ", gray_arr[i][j]);
//printf("| %d | ", gray_arr[i][j]); // tambahan
hist[k]++;
}
fprintf(pFile,"n");
//printf("n"); // tambahan
}
fclose (pFile);
printf("n"); // tambahan
system("notepad.exe matriks-histogram.txt" );
printf("n+---Info seputar gambar---+n");
//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=%dni=%d",hist[i_max],i_max);
// Construct the image displaying the histogram.
http://mahisaajy.blogspot.com/ 32
for(int i=(height-1);i>0;i--) {
for (int j=0;j<256;j++) {
if(i<=((hist[j]*height)/hist[i_max])) {
histo_arr[height-i][j*(width/256)]=255;
}
}
}
printf("nUkuran gambar = %d x %d",width,height);
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; i<height; i++) {
for(int j=0; j<width; j++) {
gray->imageData[i*gray->widthStep + j*gray->nChannels] =
gray_arr[i][j];
}
}
for(int i=0; i<height; i++) {
for(int j=0; j<width; j++) {
histogram->imageData[i*histogram->widthStep + j*histogram-
>nChannels] = 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<height; i++) {
histo_arr[i]=(uchar *)malloc(sizeof(uchar)*(width + 1));
gray_arr[i] = (uchar * )malloc(sizeof(uchar)*(width + 1));
for(int j=0; j<width; j++) {
// we know that ISO grayscale image is 11%BLUE + 56% GREEN + 33%
RED..... so converitng 1d array into 2d array
gray_arr[i][j] = (0.11*data[i*step + j*channels] + 0.56*data[i*step
+ j*channels + 1] + 0.33*data[i*step + j*channels + 2]);
histo_arr[i][j] = 0;
}
}
printf("nUntuk dapat mengetahui intensitas matriks,n
Anda dapat membuka file matriks-histogram-before.txtn");
FILE * pFile;
pFile = fopen("matriks-histogram-before.txt","w");
//Construct the histogram array
for(int i=0;i<height;i++) {
fprintf(pFile,"baris %d --> ",(i+1));
for (int j=0;j<width;j++) {
k=gray_arr[i][j];
fprintf (pFile, "| %d | ", gray_arr[i][j]);
hist[k]++;
}
fprintf(pFile,"n");
}
fclose (pFile);
printf("n+---Info seputar gambar (sebelum perbaikan)---+n");
//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=%dni=%d",hist[i_max],i_max);
// Construct the image displaying the histogram.
for(int i=(height-1);i>0;i--) {
for (int j=0;j<256;j++) {
if(i<=((hist[j]*height)/hist[i_max])) {
histo_arr[height-i][j*(width/256)]=255;
}
}
}
printf("nUkuran gambar = %d x %d",width,height);
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; i<height; i++) {
for(int j=0; j<width; j++) {
gray->imageData[i*gray->widthStep + j*gray->nChannels] =
gray_arr[i][j];
}
}
for(int i=0; i<height; i++) {
for(int j=0; j<width; j++) {
histogram->imageData[i*histogram->widthStep + 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=%dn",height);
printf("nLebar gambar=%dn",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;j<(widthc);j++)
{/*Here datac means data of the HSV Image*/
/*Here i want to Increase the saturation or the strength of the Colors in the
Image and
then I would be able to perform a good color detection*/
temp=datac[i*stepc+j*channelsc+1]+units;/*increas the saturaion component is the
second arrray.*/
/*Here there is a small problem...when you add a value to the data and if it
exceeds 255
it starts all over again from zero and hence some of the pixels might go to zero.
So to stop this we need to include this loop i would not try to explain the loop
but
please try and follow it is easy to do so..*/
if(temp>255) 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<height2; i++) {
histo_arr2[i]=(uchar *)malloc(sizeof(uchar)*(width2 + 1));
gray_arr2[i] = (uchar * )malloc(sizeof(uchar)*(width2 + 1));
for(int j=0; j<width2; j++) {
// we know that ISO grayscale image is 11%BLUE + 56% GREEN + 33%
RED..... so converitng 1d array into 2d array
gray_arr2[i][j] = (0.11*data2[i*step2 + j*channels2] +
0.56*data2[i*step2 + j*channels2 + 1] + 0.33*data2[i*step2 + j*channels2 + 2]);
histo_arr2[i][j] = 0;
}
}
FILE * pFile;
pFile = fopen("matriks-histogram-after.txt","w");
//Construct the histogram array
for(int i=0;i<height2;i++) {
fprintf(pFile,"baris %d --> ",(i+1));
for (int j=0;j<width2;j++) {
gray_arr2[i][j]+=units;
l=gray_arr2[i][j];
fprintf (pFile, "| %d | ", gray_arr2[i][j]);
hist2[l]++;
}
fprintf(pFile,"n");
}
fclose (pFile);
printf("n+---Info seputar gambar (setelah perbaikan)---+n");
i_max2=find_max2(hist2,256);
printf("MAX=%dni=%d",hist2[i_max2],i_max2);
// Construct the image displaying the histogram.
for(int i=(height2-1);i>0;i--) {
for (int j=0;j<256;j++) {
if(i<=((hist2[j]*height2)/hist2[i_max2])) {
histo_arr2[height2-i][j*(width2/256)]=255;
}
}
}
printf("nUkuran gambar = %d x %d",width,height);
printf("nPanjang Gambar (height) = %d pixel ",height);
printf("nLebar Gambar (width) = %d pixel n",width);
gray2 = cvCreateImage(cvSize(width2, height2), IPL_DEPTH_8U, 1);
histogram2 = cvCreateImage(cvSize(width2,height2),IPL_DEPTH_8U,1);
for(int i=0; i<height2; i++) {
http://mahisaajy.blogspot.com/ 37
for(int j=0; j<width2; j++) {
gray2->imageData[i*gray2->widthStep + j*gray2->nChannels] =
gray_arr2[i][j];
}
}
for(int i=0; i<height2; i++) {
for(int j=0; j<width2; j++) {
histogram2->imageData[i*histogram2->widthStep + 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 << "Gak ada source gan!";
getch();
system("exit");
//return -1;
}
GaussianBlur( src, src, Size(3,3), 0, 0, BORDER_DEFAULT );
/// Convert it to gray
cvtColor( src, src_gray, CV_RGB2GRAY );
/// Create window
namedWindow( window_name, CV_WINDOW_AUTOSIZE);
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 hehenSpecial Thanks for our team : nAjy,
Alicia, Endru, Sita, Windyn");
}
void main() {
int pil;
printf("Aplikasi Pengolahan Citra v1.0n");
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");
}

More Related Content

What's hot

Struktur direktori
Struktur direktoriStruktur direktori
Struktur direktoriAnggi DHARMA
 
Proposal Penawaran Pembangunan Aplikasi Tracking Barang
Proposal Penawaran Pembangunan Aplikasi Tracking BarangProposal Penawaran Pembangunan Aplikasi Tracking Barang
Proposal Penawaran Pembangunan Aplikasi Tracking BarangGhifaroza Rahmadiana
 
Perancangan (diagram softekz, dfd level 0,1,2)
Perancangan (diagram softekz, dfd level 0,1,2)Perancangan (diagram softekz, dfd level 0,1,2)
Perancangan (diagram softekz, dfd level 0,1,2)Joel Marobo
 
LAPORAN TUGAS AKHIR PERANCANGAN APLIKASI KNOWLEDGE BASE SYSTEM UNTUK INSTRUKS...
LAPORAN TUGAS AKHIR PERANCANGAN APLIKASI KNOWLEDGE BASE SYSTEM UNTUK INSTRUKS...LAPORAN TUGAS AKHIR PERANCANGAN APLIKASI KNOWLEDGE BASE SYSTEM UNTUK INSTRUKS...
LAPORAN TUGAS AKHIR PERANCANGAN APLIKASI KNOWLEDGE BASE SYSTEM UNTUK INSTRUKS...Uofa_Unsada
 
Makalah Aplikasi Data Penjualan Menggunakan Visual Basic 6.0
Makalah Aplikasi Data Penjualan Menggunakan Visual Basic 6.0Makalah Aplikasi Data Penjualan Menggunakan Visual Basic 6.0
Makalah Aplikasi Data Penjualan Menggunakan Visual Basic 6.0Marlinda
 
Laporan pemrograman berbasis web (CSS)
Laporan pemrograman berbasis web (CSS)Laporan pemrograman berbasis web (CSS)
Laporan pemrograman berbasis web (CSS)gufron_ar
 
Sistem informasi penggajian karyawan tugas senin
Sistem informasi penggajian karyawan tugas seninSistem informasi penggajian karyawan tugas senin
Sistem informasi penggajian karyawan tugas seninnaufals11
 
Kumpulan soal-latihan-praktik-word-kls-x
Kumpulan soal-latihan-praktik-word-kls-xKumpulan soal-latihan-praktik-word-kls-x
Kumpulan soal-latihan-praktik-word-kls-xBudi Santoso
 
Uji Validitas dan Reliabilitas
Uji Validitas dan Reliabilitas Uji Validitas dan Reliabilitas
Uji Validitas dan Reliabilitas siska sri asali
 
Teknik pengolahan citra visual c++ dengan mfc
Teknik pengolahan citra visual c++ dengan mfcTeknik pengolahan citra visual c++ dengan mfc
Teknik pengolahan citra visual c++ dengan mfcDnD Sandy Ra
 
Contoh proposal teknik_informatika
Contoh proposal teknik_informatikaContoh proposal teknik_informatika
Contoh proposal teknik_informatikaAdiex Endy
 
Basis data 5
Basis data 5Basis data 5
Basis data 5Febrienda
 
Software Engineering 1 (Software Development Process Model)
Software Engineering 1 (Software Development Process Model)Software Engineering 1 (Software Development Process Model)
Software Engineering 1 (Software Development Process Model)Adam Mukharil Bachtiar
 
Kelompok 8 - Implementasi Role & Privilege pada database Oracle & my SQL
Kelompok 8 - Implementasi Role & Privilege pada database Oracle & my SQLKelompok 8 - Implementasi Role & Privilege pada database Oracle & my SQL
Kelompok 8 - Implementasi Role & Privilege pada database Oracle & my SQLDejiko Chaem
 
Penerapan Weighted Sum Model (WSM) Dalam Penentuan Peserta Jaminan Kesehatan ...
Penerapan Weighted Sum Model (WSM) Dalam Penentuan Peserta Jaminan Kesehatan ...Penerapan Weighted Sum Model (WSM) Dalam Penentuan Peserta Jaminan Kesehatan ...
Penerapan Weighted Sum Model (WSM) Dalam Penentuan Peserta Jaminan Kesehatan ...Universitas Pembangunan Panca Budi
 

What's hot (20)

Use skenario
Use skenarioUse skenario
Use skenario
 
Struktur direktori
Struktur direktoriStruktur direktori
Struktur direktori
 
6 sinkronisasi aplod
6 sinkronisasi aplod6 sinkronisasi aplod
6 sinkronisasi aplod
 
Proposal Penawaran Pembangunan Aplikasi Tracking Barang
Proposal Penawaran Pembangunan Aplikasi Tracking BarangProposal Penawaran Pembangunan Aplikasi Tracking Barang
Proposal Penawaran Pembangunan Aplikasi Tracking Barang
 
Perancangan (diagram softekz, dfd level 0,1,2)
Perancangan (diagram softekz, dfd level 0,1,2)Perancangan (diagram softekz, dfd level 0,1,2)
Perancangan (diagram softekz, dfd level 0,1,2)
 
LAPORAN TUGAS AKHIR PERANCANGAN APLIKASI KNOWLEDGE BASE SYSTEM UNTUK INSTRUKS...
LAPORAN TUGAS AKHIR PERANCANGAN APLIKASI KNOWLEDGE BASE SYSTEM UNTUK INSTRUKS...LAPORAN TUGAS AKHIR PERANCANGAN APLIKASI KNOWLEDGE BASE SYSTEM UNTUK INSTRUKS...
LAPORAN TUGAS AKHIR PERANCANGAN APLIKASI KNOWLEDGE BASE SYSTEM UNTUK INSTRUKS...
 
Makalah Aplikasi Data Penjualan Menggunakan Visual Basic 6.0
Makalah Aplikasi Data Penjualan Menggunakan Visual Basic 6.0Makalah Aplikasi Data Penjualan Menggunakan Visual Basic 6.0
Makalah Aplikasi Data Penjualan Menggunakan Visual Basic 6.0
 
Laporan pemrograman berbasis web (CSS)
Laporan pemrograman berbasis web (CSS)Laporan pemrograman berbasis web (CSS)
Laporan pemrograman berbasis web (CSS)
 
Sistem informasi penggajian karyawan tugas senin
Sistem informasi penggajian karyawan tugas seninSistem informasi penggajian karyawan tugas senin
Sistem informasi penggajian karyawan tugas senin
 
Kumpulan soal-latihan-praktik-word-kls-x
Kumpulan soal-latihan-praktik-word-kls-xKumpulan soal-latihan-praktik-word-kls-x
Kumpulan soal-latihan-praktik-word-kls-x
 
Pembahasan
Pembahasan Pembahasan
Pembahasan
 
Uji Validitas dan Reliabilitas
Uji Validitas dan Reliabilitas Uji Validitas dan Reliabilitas
Uji Validitas dan Reliabilitas
 
Teknik pengolahan citra visual c++ dengan mfc
Teknik pengolahan citra visual c++ dengan mfcTeknik pengolahan citra visual c++ dengan mfc
Teknik pengolahan citra visual c++ dengan mfc
 
Contoh proposal teknik_informatika
Contoh proposal teknik_informatikaContoh proposal teknik_informatika
Contoh proposal teknik_informatika
 
Basis data 5
Basis data 5Basis data 5
Basis data 5
 
Software Engineering 1 (Software Development Process Model)
Software Engineering 1 (Software Development Process Model)Software Engineering 1 (Software Development Process Model)
Software Engineering 1 (Software Development Process Model)
 
Proposal penawaran proyek
Proposal penawaran proyekProposal penawaran proyek
Proposal penawaran proyek
 
Kelompok 8 - Implementasi Role & Privilege pada database Oracle & my SQL
Kelompok 8 - Implementasi Role & Privilege pada database Oracle & my SQLKelompok 8 - Implementasi Role & Privilege pada database Oracle & my SQL
Kelompok 8 - Implementasi Role & Privilege pada database Oracle & my SQL
 
Penerapan Weighted Sum Model (WSM) Dalam Penentuan Peserta Jaminan Kesehatan ...
Penerapan Weighted Sum Model (WSM) Dalam Penentuan Peserta Jaminan Kesehatan ...Penerapan Weighted Sum Model (WSM) Dalam Penentuan Peserta Jaminan Kesehatan ...
Penerapan Weighted Sum Model (WSM) Dalam Penentuan Peserta Jaminan Kesehatan ...
 
Modul-AUTOCAD.pdf
Modul-AUTOCAD.pdfModul-AUTOCAD.pdf
Modul-AUTOCAD.pdf
 

Similar to Membuat Aplikasi Citra

Laporan praktikum pti modul 2
Laporan praktikum pti modul 2Laporan praktikum pti modul 2
Laporan praktikum pti modul 2Faisal Zamar
 
Ukk 2016 membuat game dengan aplikasi construct - bagas wiranto
Ukk 2016   membuat game dengan aplikasi construct - bagas wirantoUkk 2016   membuat game dengan aplikasi construct - bagas wiranto
Ukk 2016 membuat game dengan aplikasi construct - bagas wirantoSyiroy Uddin
 
Menginstalasi Sistem Operasi Jaringan
Menginstalasi Sistem Operasi JaringanMenginstalasi Sistem Operasi Jaringan
Menginstalasi Sistem Operasi JaringanAnca Septiawan
 
Mengoperasikan Periperal Pemindai Gambar
Mengoperasikan Periperal Pemindai GambarMengoperasikan Periperal Pemindai Gambar
Mengoperasikan Periperal Pemindai GambarCarwoto Sa'an
 
Animasi dengan swih 2
Animasi dengan swih 2Animasi dengan swih 2
Animasi dengan swih 2age46
 
5. modul mengubah video menjadi animasi dan cyko by pak sukani
5. modul mengubah video menjadi animasi dan cyko by pak sukani5. modul mengubah video menjadi animasi dan cyko by pak sukani
5. modul mengubah video menjadi animasi dan cyko by pak sukanisukani
 
5. use snipping tool, image tuner dan cyko by pak sukani
5. use snipping tool, image tuner dan cyko by pak sukani5. use snipping tool, image tuner dan cyko by pak sukani
5. use snipping tool, image tuner dan cyko by pak sukanisukani
 
Live coding #2 maps
Live coding #2   mapsLive coding #2   maps
Live coding #2 mapsMdeno Akbar
 
training module "web application development with cms and bootstrap"
training module "web application development with cms and bootstrap"training module "web application development with cms and bootstrap"
training module "web application development with cms and bootstrap"Dewi Rahmawati
 
Laporan prakerin TKJ kontrol Tiemviewer
Laporan prakerin TKJ kontrol TiemviewerLaporan prakerin TKJ kontrol Tiemviewer
Laporan prakerin TKJ kontrol Tiemvieweramenk mezzo
 
Article Pengenalan Konsep Xml Web Services
Article Pengenalan Konsep Xml Web ServicesArticle Pengenalan Konsep Xml Web Services
Article Pengenalan Konsep Xml Web ServicesFredy Budimansyah
 
Modul Pelatihan Internet (Google) untuk Pemula
Modul Pelatihan Internet (Google) untuk PemulaModul Pelatihan Internet (Google) untuk Pemula
Modul Pelatihan Internet (Google) untuk PemulaIndriyatno Banyumurti
 
Buku tutorial visual basic 6
Buku tutorial visual basic 6Buku tutorial visual basic 6
Buku tutorial visual basic 6Nie Andini
 
Memasang aplikasi phpindonesia_di_windows_7
Memasang aplikasi phpindonesia_di_windows_7Memasang aplikasi phpindonesia_di_windows_7
Memasang aplikasi phpindonesia_di_windows_7Cahya Dwiana SN
 
Isman Subarkah Windows Communication Foundation
Isman Subarkah Windows Communication FoundationIsman Subarkah Windows Communication Foundation
Isman Subarkah Windows Communication FoundationIsman Subarkah
 

Similar to Membuat Aplikasi Citra (20)

Laporan praktikum pti modul 2
Laporan praktikum pti modul 2Laporan praktikum pti modul 2
Laporan praktikum pti modul 2
 
Ukk 2016 membuat game dengan aplikasi construct - bagas wiranto
Ukk 2016   membuat game dengan aplikasi construct - bagas wirantoUkk 2016   membuat game dengan aplikasi construct - bagas wiranto
Ukk 2016 membuat game dengan aplikasi construct - bagas wiranto
 
Menginstalasi Sistem Operasi Jaringan
Menginstalasi Sistem Operasi JaringanMenginstalasi Sistem Operasi Jaringan
Menginstalasi Sistem Operasi Jaringan
 
Mengoperasikan Periperal Pemindai Gambar
Mengoperasikan Periperal Pemindai GambarMengoperasikan Periperal Pemindai Gambar
Mengoperasikan Periperal Pemindai Gambar
 
Animasi dengan swih 2
Animasi dengan swih 2Animasi dengan swih 2
Animasi dengan swih 2
 
5. modul mengubah video menjadi animasi dan cyko by pak sukani
5. modul mengubah video menjadi animasi dan cyko by pak sukani5. modul mengubah video menjadi animasi dan cyko by pak sukani
5. modul mengubah video menjadi animasi dan cyko by pak sukani
 
5. use snipping tool, image tuner dan cyko by pak sukani
5. use snipping tool, image tuner dan cyko by pak sukani5. use snipping tool, image tuner dan cyko by pak sukani
5. use snipping tool, image tuner dan cyko by pak sukani
 
Live coding #2 maps
Live coding #2   mapsLive coding #2   maps
Live coding #2 maps
 
D0215610(muh ikram s)
D0215610(muh ikram s)D0215610(muh ikram s)
D0215610(muh ikram s)
 
training module "web application development with cms and bootstrap"
training module "web application development with cms and bootstrap"training module "web application development with cms and bootstrap"
training module "web application development with cms and bootstrap"
 
Laporan prakerin TKJ kontrol Tiemviewer
Laporan prakerin TKJ kontrol TiemviewerLaporan prakerin TKJ kontrol Tiemviewer
Laporan prakerin TKJ kontrol Tiemviewer
 
Pengenalan vb
Pengenalan vbPengenalan vb
Pengenalan vb
 
Trik Seputar Komputer
Trik Seputar KomputerTrik Seputar Komputer
Trik Seputar Komputer
 
Trik Seputar Komputer
Trik Seputar KomputerTrik Seputar Komputer
Trik Seputar Komputer
 
Article Pengenalan Konsep Xml Web Services
Article Pengenalan Konsep Xml Web ServicesArticle Pengenalan Konsep Xml Web Services
Article Pengenalan Konsep Xml Web Services
 
Live coding #1
Live coding #1Live coding #1
Live coding #1
 
Modul Pelatihan Internet (Google) untuk Pemula
Modul Pelatihan Internet (Google) untuk PemulaModul Pelatihan Internet (Google) untuk Pemula
Modul Pelatihan Internet (Google) untuk Pemula
 
Buku tutorial visual basic 6
Buku tutorial visual basic 6Buku tutorial visual basic 6
Buku tutorial visual basic 6
 
Memasang aplikasi phpindonesia_di_windows_7
Memasang aplikasi phpindonesia_di_windows_7Memasang aplikasi phpindonesia_di_windows_7
Memasang aplikasi phpindonesia_di_windows_7
 
Isman Subarkah Windows Communication Foundation
Isman Subarkah Windows Communication FoundationIsman Subarkah Windows Communication Foundation
Isman Subarkah Windows Communication Foundation
 

Recently uploaded

KONSEP KEBUTUHAN AKTIVITAS DAN LATIHAN.pptx
KONSEP KEBUTUHAN AKTIVITAS DAN LATIHAN.pptxKONSEP KEBUTUHAN AKTIVITAS DAN LATIHAN.pptx
KONSEP KEBUTUHAN AKTIVITAS DAN LATIHAN.pptxawaldarmawan3
 
Jurnal Dwi mingguan modul 1.2-gurupenggerak.pptx
Jurnal Dwi mingguan modul 1.2-gurupenggerak.pptxJurnal Dwi mingguan modul 1.2-gurupenggerak.pptx
Jurnal Dwi mingguan modul 1.2-gurupenggerak.pptxBambang440423
 
Karakteristik Negara Mesir (Geografi Regional Dunia)
Karakteristik Negara Mesir (Geografi Regional Dunia)Karakteristik Negara Mesir (Geografi Regional Dunia)
Karakteristik Negara Mesir (Geografi Regional Dunia)3HerisaSintia
 
Modul Ajar Biologi Kelas 11 Fase F Kurikulum Merdeka [abdiera.com]
Modul Ajar Biologi Kelas 11 Fase F Kurikulum Merdeka [abdiera.com]Modul Ajar Biologi Kelas 11 Fase F Kurikulum Merdeka [abdiera.com]
Modul Ajar Biologi Kelas 11 Fase F Kurikulum Merdeka [abdiera.com]Abdiera
 
Materi Pertemuan Materi Pertemuan 7.pptx
Materi Pertemuan Materi Pertemuan 7.pptxMateri Pertemuan Materi Pertemuan 7.pptx
Materi Pertemuan Materi Pertemuan 7.pptxRezaWahyuni6
 
Aksi Nyata Modul 1.1 Calon Guru Penggerak
Aksi Nyata Modul 1.1 Calon Guru PenggerakAksi Nyata Modul 1.1 Calon Guru Penggerak
Aksi Nyata Modul 1.1 Calon Guru Penggeraksupriadi611
 
Laporan Guru Piket untuk Pengisian RHK Guru Pengelolaan KInerja Guru di PMM
Laporan Guru Piket untuk Pengisian RHK Guru Pengelolaan KInerja Guru di PMMLaporan Guru Piket untuk Pengisian RHK Guru Pengelolaan KInerja Guru di PMM
Laporan Guru Piket untuk Pengisian RHK Guru Pengelolaan KInerja Guru di PMMmulyadia43
 
Materi Pertemuan 6 Materi Pertemuan 6.pptx
Materi Pertemuan 6 Materi Pertemuan 6.pptxMateri Pertemuan 6 Materi Pertemuan 6.pptx
Materi Pertemuan 6 Materi Pertemuan 6.pptxRezaWahyuni6
 
Tugas 1 pembaruan dlm pembelajaran jawaban tugas tuton 1.docx
Tugas 1 pembaruan dlm pembelajaran jawaban tugas tuton 1.docxTugas 1 pembaruan dlm pembelajaran jawaban tugas tuton 1.docx
Tugas 1 pembaruan dlm pembelajaran jawaban tugas tuton 1.docxmawan5982
 
PELAKSANAAN + Link2 Materi TRAINING "Effective SUPERVISORY & LEADERSHIP Sk...
PELAKSANAAN  + Link2 Materi TRAINING "Effective  SUPERVISORY &  LEADERSHIP Sk...PELAKSANAAN  + Link2 Materi TRAINING "Effective  SUPERVISORY &  LEADERSHIP Sk...
PELAKSANAAN + Link2 Materi TRAINING "Effective SUPERVISORY & LEADERSHIP Sk...Kanaidi ken
 
adap penggunaan media sosial dalam kehidupan sehari-hari.pptx
adap penggunaan media sosial dalam kehidupan sehari-hari.pptxadap penggunaan media sosial dalam kehidupan sehari-hari.pptx
adap penggunaan media sosial dalam kehidupan sehari-hari.pptxmtsmampunbarub4
 
Model Manajemen Strategi Public Relations
Model Manajemen Strategi Public RelationsModel Manajemen Strategi Public Relations
Model Manajemen Strategi Public RelationsAdePutraTunggali
 
ppt-modul-6-pend-seni-di sd kelompok 2 ppt
ppt-modul-6-pend-seni-di sd kelompok 2 pptppt-modul-6-pend-seni-di sd kelompok 2 ppt
ppt-modul-6-pend-seni-di sd kelompok 2 pptArkhaRega1
 
PPT Materi Jenis - Jenis Alat Pembayaran Tunai dan Non-tunai.pptx
PPT Materi Jenis - Jenis Alat Pembayaran Tunai dan Non-tunai.pptxPPT Materi Jenis - Jenis Alat Pembayaran Tunai dan Non-tunai.pptx
PPT Materi Jenis - Jenis Alat Pembayaran Tunai dan Non-tunai.pptxHeruFebrianto3
 
Ppt tentang perkembangan Moral Pada Anak
Ppt tentang perkembangan Moral Pada AnakPpt tentang perkembangan Moral Pada Anak
Ppt tentang perkembangan Moral Pada Anakbekamalayniasinta
 
Demonstrasi Kontekstual Modul 1.2. pdf
Demonstrasi Kontekstual  Modul 1.2.  pdfDemonstrasi Kontekstual  Modul 1.2.  pdf
Demonstrasi Kontekstual Modul 1.2. pdfvebronialite32
 
tugas 1 anak berkebutihan khusus pelajaran semester 6 jawaban tuton 1.docx
tugas 1 anak berkebutihan khusus pelajaran semester 6 jawaban tuton 1.docxtugas 1 anak berkebutihan khusus pelajaran semester 6 jawaban tuton 1.docx
tugas 1 anak berkebutihan khusus pelajaran semester 6 jawaban tuton 1.docxmawan5982
 
AKSI NYATA Strategi Penerapan Kurikulum Merdeka di Kelas (1).pdf
AKSI NYATA Strategi Penerapan Kurikulum Merdeka di Kelas (1).pdfAKSI NYATA Strategi Penerapan Kurikulum Merdeka di Kelas (1).pdf
AKSI NYATA Strategi Penerapan Kurikulum Merdeka di Kelas (1).pdfTaqdirAlfiandi1
 
Karakteristik Negara Brazil, Geografi Regional Dunia
Karakteristik Negara Brazil, Geografi Regional DuniaKarakteristik Negara Brazil, Geografi Regional Dunia
Karakteristik Negara Brazil, Geografi Regional DuniaNadia Putri Ayu
 
DESAIN MEDIA PEMBELAJARAN BAHASA INDONESIA BERBASIS DIGITAL.pptx
DESAIN MEDIA PEMBELAJARAN BAHASA INDONESIA BERBASIS DIGITAL.pptxDESAIN MEDIA PEMBELAJARAN BAHASA INDONESIA BERBASIS DIGITAL.pptx
DESAIN MEDIA PEMBELAJARAN BAHASA INDONESIA BERBASIS DIGITAL.pptxFuzaAnggriana
 

Recently uploaded (20)

KONSEP KEBUTUHAN AKTIVITAS DAN LATIHAN.pptx
KONSEP KEBUTUHAN AKTIVITAS DAN LATIHAN.pptxKONSEP KEBUTUHAN AKTIVITAS DAN LATIHAN.pptx
KONSEP KEBUTUHAN AKTIVITAS DAN LATIHAN.pptx
 
Jurnal Dwi mingguan modul 1.2-gurupenggerak.pptx
Jurnal Dwi mingguan modul 1.2-gurupenggerak.pptxJurnal Dwi mingguan modul 1.2-gurupenggerak.pptx
Jurnal Dwi mingguan modul 1.2-gurupenggerak.pptx
 
Karakteristik Negara Mesir (Geografi Regional Dunia)
Karakteristik Negara Mesir (Geografi Regional Dunia)Karakteristik Negara Mesir (Geografi Regional Dunia)
Karakteristik Negara Mesir (Geografi Regional Dunia)
 
Modul Ajar Biologi Kelas 11 Fase F Kurikulum Merdeka [abdiera.com]
Modul Ajar Biologi Kelas 11 Fase F Kurikulum Merdeka [abdiera.com]Modul Ajar Biologi Kelas 11 Fase F Kurikulum Merdeka [abdiera.com]
Modul Ajar Biologi Kelas 11 Fase F Kurikulum Merdeka [abdiera.com]
 
Materi Pertemuan Materi Pertemuan 7.pptx
Materi Pertemuan Materi Pertemuan 7.pptxMateri Pertemuan Materi Pertemuan 7.pptx
Materi Pertemuan Materi Pertemuan 7.pptx
 
Aksi Nyata Modul 1.1 Calon Guru Penggerak
Aksi Nyata Modul 1.1 Calon Guru PenggerakAksi Nyata Modul 1.1 Calon Guru Penggerak
Aksi Nyata Modul 1.1 Calon Guru Penggerak
 
Laporan Guru Piket untuk Pengisian RHK Guru Pengelolaan KInerja Guru di PMM
Laporan Guru Piket untuk Pengisian RHK Guru Pengelolaan KInerja Guru di PMMLaporan Guru Piket untuk Pengisian RHK Guru Pengelolaan KInerja Guru di PMM
Laporan Guru Piket untuk Pengisian RHK Guru Pengelolaan KInerja Guru di PMM
 
Materi Pertemuan 6 Materi Pertemuan 6.pptx
Materi Pertemuan 6 Materi Pertemuan 6.pptxMateri Pertemuan 6 Materi Pertemuan 6.pptx
Materi Pertemuan 6 Materi Pertemuan 6.pptx
 
Tugas 1 pembaruan dlm pembelajaran jawaban tugas tuton 1.docx
Tugas 1 pembaruan dlm pembelajaran jawaban tugas tuton 1.docxTugas 1 pembaruan dlm pembelajaran jawaban tugas tuton 1.docx
Tugas 1 pembaruan dlm pembelajaran jawaban tugas tuton 1.docx
 
PELAKSANAAN + Link2 Materi TRAINING "Effective SUPERVISORY & LEADERSHIP Sk...
PELAKSANAAN  + Link2 Materi TRAINING "Effective  SUPERVISORY &  LEADERSHIP Sk...PELAKSANAAN  + Link2 Materi TRAINING "Effective  SUPERVISORY &  LEADERSHIP Sk...
PELAKSANAAN + Link2 Materi TRAINING "Effective SUPERVISORY & LEADERSHIP Sk...
 
adap penggunaan media sosial dalam kehidupan sehari-hari.pptx
adap penggunaan media sosial dalam kehidupan sehari-hari.pptxadap penggunaan media sosial dalam kehidupan sehari-hari.pptx
adap penggunaan media sosial dalam kehidupan sehari-hari.pptx
 
Model Manajemen Strategi Public Relations
Model Manajemen Strategi Public RelationsModel Manajemen Strategi Public Relations
Model Manajemen Strategi Public Relations
 
ppt-modul-6-pend-seni-di sd kelompok 2 ppt
ppt-modul-6-pend-seni-di sd kelompok 2 pptppt-modul-6-pend-seni-di sd kelompok 2 ppt
ppt-modul-6-pend-seni-di sd kelompok 2 ppt
 
PPT Materi Jenis - Jenis Alat Pembayaran Tunai dan Non-tunai.pptx
PPT Materi Jenis - Jenis Alat Pembayaran Tunai dan Non-tunai.pptxPPT Materi Jenis - Jenis Alat Pembayaran Tunai dan Non-tunai.pptx
PPT Materi Jenis - Jenis Alat Pembayaran Tunai dan Non-tunai.pptx
 
Ppt tentang perkembangan Moral Pada Anak
Ppt tentang perkembangan Moral Pada AnakPpt tentang perkembangan Moral Pada Anak
Ppt tentang perkembangan Moral Pada Anak
 
Demonstrasi Kontekstual Modul 1.2. pdf
Demonstrasi Kontekstual  Modul 1.2.  pdfDemonstrasi Kontekstual  Modul 1.2.  pdf
Demonstrasi Kontekstual Modul 1.2. pdf
 
tugas 1 anak berkebutihan khusus pelajaran semester 6 jawaban tuton 1.docx
tugas 1 anak berkebutihan khusus pelajaran semester 6 jawaban tuton 1.docxtugas 1 anak berkebutihan khusus pelajaran semester 6 jawaban tuton 1.docx
tugas 1 anak berkebutihan khusus pelajaran semester 6 jawaban tuton 1.docx
 
AKSI NYATA Strategi Penerapan Kurikulum Merdeka di Kelas (1).pdf
AKSI NYATA Strategi Penerapan Kurikulum Merdeka di Kelas (1).pdfAKSI NYATA Strategi Penerapan Kurikulum Merdeka di Kelas (1).pdf
AKSI NYATA Strategi Penerapan Kurikulum Merdeka di Kelas (1).pdf
 
Karakteristik Negara Brazil, Geografi Regional Dunia
Karakteristik Negara Brazil, Geografi Regional DuniaKarakteristik Negara Brazil, Geografi Regional Dunia
Karakteristik Negara Brazil, Geografi Regional Dunia
 
DESAIN MEDIA PEMBELAJARAN BAHASA INDONESIA BERBASIS DIGITAL.pptx
DESAIN MEDIA PEMBELAJARAN BAHASA INDONESIA BERBASIS DIGITAL.pptxDESAIN MEDIA PEMBELAJARAN BAHASA INDONESIA BERBASIS DIGITAL.pptx
DESAIN MEDIA PEMBELAJARAN BAHASA INDONESIA BERBASIS DIGITAL.pptx
 

Membuat Aplikasi Citra

  • 1. Membuat Aplikasi Pengolahan Citra dengan OpenCV Mahisa Ajy Kusuma | http://mahisaajy.blogspot.com | @mahisaajay
  • 2. 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
  • 3. 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
  • 4. 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.
  • 5. 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
  • 6. 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.
  • 7. http://mahisaajy.blogspot.com/ 6 4. Selanjutnya tunggu sampai proses download dan install selesai. Kecepatan download tergantung dengan kecepatan internet yang Anda gunakan.
  • 8. 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.
  • 9. 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
  • 10. http://mahisaajy.blogspot.com/ 9 5. Setelah itu next saja, terus sampai muncul jendela berikut. Klik install. 7. Yap selesai
  • 11. 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.1includeopencv;' Library Directories... add: 'C:OpenCV2.1lib;' Source Directories... add: 'C:OpenCV2.1srccv; C:OpenCV2.1srccvaux; C:OpenCV2.1srccxcore; C:OpenCV2.1srchighgui; C:OpenCV2.1srcml;' 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 <cv.h> #include <cxcore.h>
  • 12. http://mahisaajy.blogspot.com/ 11 #include <highgui.h> 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:UsersmahisaajayDocumentsVisual Studio 2010Projectsimgprocimgproc" Debug -> Start Debugging Done.
  • 13. 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
  • 14. http://mahisaajy.blogspot.com/ 13 4. Membuat histogram 3.3 PEMROGRAMAN Penjelasan kode program #include "stdafx.h" #include <stdio.h> #include <cv.h> #include <iostream> #include <conio.h> #include <cxcore.h> #include <highgui.h> #include <stdlib.h> #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
  • 15. 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<height; i++) { histo_arr[i]=(uchar *)malloc(sizeof(uchar)*(width + 1)); gray_arr[i] = (uchar * )malloc(sizeof(uchar)*(width + 1)); for(int j=0; j<width; j++) { // we know that ISO grayscale image is 11%BLUE + 56% GREEN + 33% RED..... so converitng 1d array into 2d array gray_arr[i][j] = (0.11*data[i*step + j*channels] + 0.56*data[i*step + j*channels + 1] + 0.33*data[i*step + j*channels + 2]); histo_arr[i][j] = 0; } } Dalam blok kode 2 perulangan for diatas yaitu untuk mengkonversi gambar RGB menjadi gambar abu- abu FILE * pFile; pFile = fopen("matriks-histogram.txt","w");
  • 16. http://mahisaajy.blogspot.com/ 15 //Construct the histogram array for(int i=0;i<height;i++) { fprintf(pFile,"baris %d --> ",(i+1)); for (int j=0;j<width;j++) { //gray_arr[i][j]+=80; k=gray_arr[i][j]; fprintf (pFile, "| %d | ", gray_arr[i][j]); hist[k]++; } fprintf(pFile,"n"); } fclose (pFile); system("notepad.exe matriks-histogram.txt" ); Potongan kode diatas yaitu untuk mendapatkan intensitas matriks dari tiap-tiap pixel, kemudian output dari intensitas matriks tersebut disimpan dalam file teks bernama "matriks-histogram.txt". FILE * pFile; pFile = fopen("matriks-histogram.txt","w"); Fungsi fopen() adalah fungsi yang digunakan untuk membuka suatu file (jika file tersebut ada) atau membuat suatu file baru jika file tersebut tidak ada. Untuk menggunakan fungsi ini, Anda harus melampirkan file header stdio.h. Dalam contoh diatas, file yang digunakan bernama "matriks- histogram.txt". Sebenarnya tidak hanya nama, parameter tersebut juga bisa menunjukkan lokasi file yang akan dibuka atau dibuat. Selanjutnya ada parameter "w", yang digunakan sebagai penentu fungsi dalam bekerja dengan suatu file. Penjelasan mengenai parameter "w" yaitu membuat sebuah file untuk ditulisi, apabila file sudah ada, maka file tersebut akan ditimpa ulang (overwritten). Apabila fungsi ini sukses dipanggil, maka akan memberikan nilai return berupa pointer ke file yang dibuka. Maka agar dapat melakukan operasi dengan file tersebut, kita harus menyediakan sebuah pointer dari class FILE untuk menampung nilai return fungsi fopen() tersebut. Dalam contoh diatas, pointer yang digunakan yaitu pFile. fprintf(pFile,"baris %d --> ",(i+1)); Fprintf digunakan untuk menuliskan suatu string ke dalam file teks. File teks yang digunakan adalah file teks yang telah ditunjuk oleh pointer dari class FILE, yaitu pFile. Kemudian string "baris %d --> ",(i+1) adalah kalimat yang akan dituliskan ke dalam file teks. fclose (pFile); Digunakan untuk menutup file teks, dimana pFile merupakan pointer yang menunjuk file teks yang dibuka dengan fungsi fopen(). system("notepad.exe matriks-histogram.txt" );
  • 17. 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;i<n;i++) if(hist[i]>hist[i_max]) i_max=i; printf("Nilai matriks yang paling sering muncul = %dn",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=%dni=%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<256;j++) { if(i<=((hist[j]*height)/hist[i_max])) { histo_arr[height-i][j*(width/256)]=255; } } } Potongan kode diatas yaitu untuk membangun atau menyusun gambar yang akan ditampilkan dalam bentuk histogram. printf("nUkuran gambar = %d x %d",width,height); printf("nPanjang Gambar (height) = %d pixel ",height); printf("nLebar Gambar (width) = %d pixel n",width); Perintah diatas untuk mencetak deskripsi mengenai gambar, seperti ukuran gambar, panjang gambar, dan lebar gambar. gray = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 1); histogram = cvCreateImage(cvSize(width,height),IPL_DEPTH_8U,1); for(int i=0; i<height; i++) {
  • 18. http://mahisaajy.blogspot.com/ 17 for(int j=0; j<width; j++) { gray->imageData[i*gray->widthStep + j*gray->nChannels] = gray_arr[i][j]; } } for(int i=0; i<height; i++) { for(int j=0; j<width; j++) { histogram->imageData[i*histogram->widthStep + 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.
  • 19. 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
  • 20. 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.
  • 21. 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).
  • 22. 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=%dn",height); printf("nLebar gambar=%dn",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
  • 23. 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;j<(widthc);j++) { /*Here datac means data of the HSV Image*/ /*Here i want to Increase the saturation or the strength of the Colors in the Image and then I would be able to perform a good color detection*/ temp=datac[i*stepc+j*channelsc+1]+units;/*increas the saturaion component is the second arrray.*/ /*Here there is a small problem...when you add a value to the data and if it exceeds 255 it starts all over again from zero and hence some of the pixels might go to zero. So to stop this we need to include this loop i would not try to explain the loop but please try and follow it is easy to do so..*/ if(temp>255) 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,
  • 24. 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.
  • 25. 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.
  • 26. 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 << "Gak ada source gan!"; getch(); system("exit"); //return -1; } Jika variabel src untuk me-load gambar tadi tidak ada, maka akan mengeluarkan output "Gak ada source gan!". Dan program akan keluar sendiri. GaussianBlur( src, src, Size(3,3), 0, 0, BORDER_DEFAULT ); Kemudian kita terapkan GaussianBlur ke gambar untuk mengurangi noise (kernel size = 3) Fungsi diatas yaitu untuk mem-blur-kan image /// Convert it to gray cvtColor( src, src_gray, CV_RGB2GRAY ); Perintah diatas untuk mengkonversi gambar yang sudah terfilter tadi, menjadi grayscale.
  • 27. 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.
  • 28. http://mahisaajy.blogspot.com/ 27 5.4 DEMO PROGRAM Saat program dijalankan, program langsung mengeluarkan gambar hasil pendeteksian tepi. Berikut dibawah ini gambarnya.
  • 29. 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 kusumaajymahisa@yahoo.co.id . Jangan cepat menyerah bila mengalami kesulitan, teruslah mencoba dan mencoba. Karena dengan kebiasaan, mudah-mudahan semua menjadi mudah. Oke sampai jumpa di lain kesempatan.
  • 30. 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/
  • 31. 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 <stdio.h> #include <cv.h> #include <iostream> #include <conio.h> #include <cxcore.h> #include <highgui.h> #include <stdlib.h> #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;i<n;i++) if(hist[i]>hist[i_max]) i_max=i; printf("Nilai matriks yang paling sering muncul = %dn",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;i<n;i++) if(hist2[i]>hist2[i_max2]) i_max2=i; printf("Nilai matriks yang paling sering muncul = %dn",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
  • 32. 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<height; i++) { histo_arr[i]=(uchar *)malloc(sizeof(uchar)*(width + 1)); gray_arr[i] = (uchar * )malloc(sizeof(uchar)*(width + 1)); for(int j=0; j<width; j++) { // we know that ISO grayscale image is 11%BLUE + 56% GREEN + 33% RED..... so converitng 1d array into 2d array gray_arr[i][j] = (0.11*data[i*step + j*channels] + 0.56*data[i*step + j*channels + 1] + 0.33*data[i*step + j*channels + 2]); histo_arr[i][j] = 0; } } printf("nUntuk dapat mengetahui intensitas matriks,n Anda dapat melihat program notepad yang terbuka atau n bisa juga dengan melihat file matriks-histogram.txt"); printf("nnUntuk melihat bentuk histogramnya,n Anda harus menutup (close) program notepad yang terbuka,n Baru setelah itu window histogram akan muncul"); FILE * pFile; pFile = fopen("matriks-histogram.txt","w"); //Construct the histogram array for(int i=0;i<height;i++) { fprintf(pFile,"baris %d --> ",(i+1)); for (int j=0;j<width;j++) { //gray_arr[i][j]+=80; k=gray_arr[i][j]; fprintf (pFile, "| %d | ", gray_arr[i][j]); //printf("| %d | ", gray_arr[i][j]); // tambahan hist[k]++; } fprintf(pFile,"n"); //printf("n"); // tambahan } fclose (pFile); printf("n"); // tambahan system("notepad.exe matriks-histogram.txt" ); printf("n+---Info seputar gambar---+n"); //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=%dni=%d",hist[i_max],i_max); // Construct the image displaying the histogram.
  • 33. http://mahisaajy.blogspot.com/ 32 for(int i=(height-1);i>0;i--) { for (int j=0;j<256;j++) { if(i<=((hist[j]*height)/hist[i_max])) { histo_arr[height-i][j*(width/256)]=255; } } } printf("nUkuran gambar = %d x %d",width,height); 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; i<height; i++) { for(int j=0; j<width; j++) { gray->imageData[i*gray->widthStep + j*gray->nChannels] = gray_arr[i][j]; } } for(int i=0; i<height; i++) { for(int j=0; j<width; j++) { histogram->imageData[i*histogram->widthStep + j*histogram- >nChannels] = 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
  • 34. 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<height; i++) { histo_arr[i]=(uchar *)malloc(sizeof(uchar)*(width + 1)); gray_arr[i] = (uchar * )malloc(sizeof(uchar)*(width + 1)); for(int j=0; j<width; j++) { // we know that ISO grayscale image is 11%BLUE + 56% GREEN + 33% RED..... so converitng 1d array into 2d array gray_arr[i][j] = (0.11*data[i*step + j*channels] + 0.56*data[i*step + j*channels + 1] + 0.33*data[i*step + j*channels + 2]); histo_arr[i][j] = 0; } } printf("nUntuk dapat mengetahui intensitas matriks,n Anda dapat membuka file matriks-histogram-before.txtn"); FILE * pFile; pFile = fopen("matriks-histogram-before.txt","w"); //Construct the histogram array for(int i=0;i<height;i++) { fprintf(pFile,"baris %d --> ",(i+1)); for (int j=0;j<width;j++) { k=gray_arr[i][j]; fprintf (pFile, "| %d | ", gray_arr[i][j]); hist[k]++; } fprintf(pFile,"n"); } fclose (pFile); printf("n+---Info seputar gambar (sebelum perbaikan)---+n"); //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=%dni=%d",hist[i_max],i_max); // Construct the image displaying the histogram. for(int i=(height-1);i>0;i--) { for (int j=0;j<256;j++) { if(i<=((hist[j]*height)/hist[i_max])) { histo_arr[height-i][j*(width/256)]=255; } } } printf("nUkuran gambar = %d x %d",width,height);
  • 35. 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; i<height; i++) { for(int j=0; j<width; j++) { gray->imageData[i*gray->widthStep + j*gray->nChannels] = gray_arr[i][j]; } } for(int i=0; i<height; i++) { for(int j=0; j<width; j++) { histogram->imageData[i*histogram->widthStep + 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=%dn",height); printf("nLebar gambar=%dn",width); } if(img==NULL ) { puts("unable to load the frame");exit(0); } cvNamedWindow("original",CV_WINDOW_AUTOSIZE);
  • 36. 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;j<(widthc);j++) {/*Here datac means data of the HSV Image*/ /*Here i want to Increase the saturation or the strength of the Colors in the Image and then I would be able to perform a good color detection*/ temp=datac[i*stepc+j*channelsc+1]+units;/*increas the saturaion component is the second arrray.*/ /*Here there is a small problem...when you add a value to the data and if it exceeds 255 it starts all over again from zero and hence some of the pixels might go to zero. So to stop this we need to include this loop i would not try to explain the loop but please try and follow it is easy to do so..*/ if(temp>255) 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;
  • 37. 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<height2; i++) { histo_arr2[i]=(uchar *)malloc(sizeof(uchar)*(width2 + 1)); gray_arr2[i] = (uchar * )malloc(sizeof(uchar)*(width2 + 1)); for(int j=0; j<width2; j++) { // we know that ISO grayscale image is 11%BLUE + 56% GREEN + 33% RED..... so converitng 1d array into 2d array gray_arr2[i][j] = (0.11*data2[i*step2 + j*channels2] + 0.56*data2[i*step2 + j*channels2 + 1] + 0.33*data2[i*step2 + j*channels2 + 2]); histo_arr2[i][j] = 0; } } FILE * pFile; pFile = fopen("matriks-histogram-after.txt","w"); //Construct the histogram array for(int i=0;i<height2;i++) { fprintf(pFile,"baris %d --> ",(i+1)); for (int j=0;j<width2;j++) { gray_arr2[i][j]+=units; l=gray_arr2[i][j]; fprintf (pFile, "| %d | ", gray_arr2[i][j]); hist2[l]++; } fprintf(pFile,"n"); } fclose (pFile); printf("n+---Info seputar gambar (setelah perbaikan)---+n"); i_max2=find_max2(hist2,256); printf("MAX=%dni=%d",hist2[i_max2],i_max2); // Construct the image displaying the histogram. for(int i=(height2-1);i>0;i--) { for (int j=0;j<256;j++) { if(i<=((hist2[j]*height2)/hist2[i_max2])) { histo_arr2[height2-i][j*(width2/256)]=255; } } } printf("nUkuran gambar = %d x %d",width,height); printf("nPanjang Gambar (height) = %d pixel ",height); printf("nLebar Gambar (width) = %d pixel n",width); gray2 = cvCreateImage(cvSize(width2, height2), IPL_DEPTH_8U, 1); histogram2 = cvCreateImage(cvSize(width2,height2),IPL_DEPTH_8U,1); for(int i=0; i<height2; i++) {
  • 38. http://mahisaajy.blogspot.com/ 37 for(int j=0; j<width2; j++) { gray2->imageData[i*gray2->widthStep + j*gray2->nChannels] = gray_arr2[i][j]; } } for(int i=0; i<height2; i++) { for(int j=0; j<width2; j++) { histogram2->imageData[i*histogram2->widthStep + 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 << "Gak ada source gan!"; getch(); system("exit"); //return -1; } GaussianBlur( src, src, Size(3,3), 0, 0, BORDER_DEFAULT ); /// Convert it to gray cvtColor( src, src_gray, CV_RGB2GRAY ); /// Create window namedWindow( window_name, CV_WINDOW_AUTOSIZE);
  • 39. 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 hehenSpecial Thanks for our team : nAjy, Alicia, Endru, Sita, Windyn"); } void main() { int pil; printf("Aplikasi Pengolahan Citra v1.0n"); 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"); }