BAB 3
Tahapan Pembuatan Aplikasi Histogram Citra
Pengertian histogram dalam pengolahan citra adalah .representasi grafis untuk distribusi warna dari citra digital atau menggambarkan penyebaran nilai-nilai intensitas pixel dari suatu citra atau bagian tertentu di dalam citra. Dari sebuah histogram dapat diketahui frekuensi kemunculan relatif dari intensitas pada citra, kecerahan, dan kontas dari sebuah gambar.
Histogram citra adalah suatu grafik yang menyatakan hubungan antara BV (brightness value) dengan frekuensi. Dari histogram pada suatu citra yang ada kita dapat menentukan berapa buah objek yang terdapat pada citra tersebut. Satu kurva sempurna mencerminkan satu buah objek. Jadi semakin banyak kurva yang terdapat pada suatu histogram maka semakin bervariasi pula objek pada citra tersebut. Untuk tiap band yang berbeda pada satu citra, memiliki histogram dengan bentuk kurva yang berbeda-beda pula.
Histogram citra merupakan salah satu bentuk representasi grafis karakteristik spektral citra yang bersangkutan. Dengan histogram, analis citra dapat memahami citra yang dipelajari misalnya aspek kecerahan dan ketajamannya. Dari histogram juga kadang-kadang dapat diduga jenis saluran spektral citra yang digunakan. Perubahan atas distribusi nilai pada citra secara langsung berakibat pada perubahan tampilan histogram. Sebaliknya, dengan memainkan bentuk histogramnya banyak program pengolah citra secara interaktif mampu mengubah tampilan citranya. Dengan kata lain, perangkat lunak pengolah citra kadang-kadang menggunakan histogram sebagai jembatan komunikasi antara pengguna dengan data citra.
Histogram citra dipresentasikan dengan dua bentuk: pertama tabel yang memuat kolom-kolom nilai piksel jumlah absolut setiap nilai piksel, jumlah komulatif piksel, presentase absolut setiap nilai, dan presentase komulatifnya; kedua, gambaran grafis yang menunjukkan nilai piksel pada sumbu x dan frekuensi kemunculan pada sumbu y. Melalui gambaran grafis histogram ini, secara umum dapat diketahui sifat-sifat citra yang diwakilinya. Misalnya citra yang direkam dengan spectrum gelombang relatif pendek akan menghasilkan “ bukit tunggal “ histogram yang sempit (unimodal) wilayah yang memuat tubuh air agak luas akan menghasilkan kenampakan histogram dengan dua puncak, apabila direkam pada spektrum inframerah dekat (bi-modal). Histogram unimodal yang sempit biasanya kurang mampu menyajikan kenampakan obyek secara tajam, sedangkan histogram yang gemuk (lebar) relatif lebih tajam dibandingkan yang sempit.
Penajaman kontras citra melalui histogram dapat dilakukan dengan dua macam cara yaitu perentangan kontras dan ekualisasi histogram. Perentangan kontras merupakan upaya mempertajam kenampakan citra dengan merentang nilai maksimmum dan nilai minimum citra. Kompresi citra justru sebaliknya dilakukan dengan memampatkan histogram yaitu menggeser nilai minimum ke nilai minimum baru yang lebih tinggi dan menggeser nilai maksimum ke nilai maksimum baru yang lebih rendah sehingga histogramnya menjadi lebih “langsing”. Berbeda halnya dengan perentangan kontras yang bersifat linier, ekualisasi histogram merupakan upaya penajaman secara non- linier yang menata kembali distribusi nilai piksel citra dalam bentuk histogram ke bentuk histogram yang baru, dimana dapat terjadi penggabungan beberapa nilai menjadi nilai baru dengan frekuensi kemunculan yang baru pula. Untuk penajaman citra sendiri meliputi semua operasi yang menghasilkan citra baru dengan kenampakan visual dan karakteristik visual yang berbeda. Citra baru disini maksudnya aadalah citra dengan kenampakan yang lebih bagus dibanding dengan citra aslinya.
Penajaman citra (enhancement) dalam pengertiannya adalah proses mengubah nilai piksel secara sistematis sehingga menghasilkan efek kenampakan citra yang lebih ekspresif sesuai dengan kebutuhan pengguna. Meliputi semua operasi yang menghasilkan citra baru dengan kenampakan visual dan karakteristik spektral yang berbeda. Penajaman Kontras ini bertujuan untuk memperoleh kesan kontras yang lebih tinggi. Dengan mentransformasi seluruh nilai kecerahan maka hasilnya adalah berupa citra baru dengan nilai maksimum awal, dan nilai minimum baru lebih rendah dari nilai minimum awal dan jika dilihat secara visual hasilnya berupa citra baru yang variasi hitam putihnya lebih menonjol sehingga tampak lebih tajam dan memudahkan proses interpretasi. Kontras citra dapat dilakukan dengan merentangkan nilai kecerahan pikselnya. Citra asli biasanya memiliki panjang gelombang yang lebih sempit dari 0-255. Sehingga hasil citra baru memiliki histogram yang memiliki kurva lebih besar. Pemfilteran adalah cara untuk ekstraksi bagian data tertentu dari suatu himpunan data dengan menghilangkan bagian-bagian data yang tidak diinginkan.
Filter dirancang untuk menyaring informasi spectral sehingga menghasilkan citra baru yang mempunyai variasi nilai spektral yang berbeda dengan citra asli. Terdapat dua jenis filtering, yaitu filter high pass dan filter low pass.
- Filter high pass menghasilkan citra dengan variasi nilai kecerahan yang besar dari piksel ke piksel, sedangkan filter low pass justru sebaliknya, memiliki fungsi untuk menaikkan frekwensi sehingga batas satu bentuk dengan bentuk lainnya menjadi jelas. Tujuannya untuk menonjolkan perbedaan antara objek ataupun perbedaan nilai, kondisi ataupun sifat antar objek yang diwakili oleh nilai piksel.
- Filter low pass adalah batas antara satu bentuk dengan bentuk lainnya menjadi kabur sehingga terkesan memiliki gradasi yang halus. Tujuannya untuk memperhalus kenampakan citra.
Dalam pembuatan aplikasi pengolahan
citra menggunakan OpenCV kita menggunakan microsoft visual studio 2008 untuk
penulisan sintak dan untuk melakukan proses eksekusi.
1. Langkah pertama
adalah buka software Microsoft Visual Studio 2008. Untuk membuat project baru
pilih New Project >> Visual C++ >> Win 32 >> (kemudian isi Name dengan coba) >>
OK . Karena nama project yang kita gunakan adalah coba.
2. Setelah
itu kita buka folder OpenCv untuk mengambil kodingan project yang akan kita
buat. Alamat yang digunakan adalah opencv >> samples >> cpp.
Kodingan yang kami gunakan adalah image. Kodingan tersebut kami copy kemudian
paste pada Visual Studio.
Kodingan yang digunakan
// coba.cpp : Defines the entry point for the
console application.
//
#include "stdafx.h"
#include <stdio.h>
#include <iostream>
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/flann/miniflann.hpp"
using namespace
cv; // all the new API is put into "cv"
namespace. Export its content
using namespace
std;
using namespace
cv::flann;
static void
help()
{
cout <<
"\nThis program shows how to use cv::Mat and
IplImages converting back and forth.\n"
"It shows reading of images, converting to planes
and merging back, color conversion\n"
"and also iterating through pixels.\n"
"Call:\n"
"./image [image-name Default: lena.jpg]\n"
<< endl;
}
// enable/disable use of mixed API in the code
below.
#define DEMO_MIXED_API_USE 1
int main( int
argc, char** argv )
{
help();
const char* imagename
= argc > 1 ? argv[1] : "lena.jpg";
#if DEMO_MIXED_API_USE
Ptr<IplImage>
iplimg = cvLoadImage(imagename); // Ptr<T> is
safe ref-conting pointer class
if(iplimg.empty())
{
fprintf(stderr,
"Can not load image %s\n",
imagename);
return -1;
}
Mat img(iplimg); // cv::Mat replaces the CvMat and IplImage, but it's easy
to convert
// between the old and the new data structures (by default,
only the header
// is converted, while the data is shared)
#else
Mat img =
imread(imagename); // the newer cvLoadImage alternative, MATLAB-style function
if(img.empty())
{
fprintf(stderr, "Can not load
image %s\n", imagename);
return -1;
}
#endif
if( !img.data ) // check if
the image has been loaded properly
return -1;
Mat img_yuv;
cvtColor(img,
img_yuv, CV_BGR2YCrCb); // convert image to YUV color
space. The output image will be created automatically
vector<Mat>
planes; // Vector is template vector class, similar
to STL's vector. It can store matrices too.
split(img_yuv,
planes); // split the image into separate color
planes
#if 1
// method 1. process Y plane using an iterator
MatIterator_<uchar> it = planes[0].begin<uchar>(), it_end =
planes[0].end<uchar>();
for(; it != it_end; ++it)
{
double v = *it*1.7 + rand()%21-10;
*it =
saturate_cast<uchar>(v*v/255.);
}
// method 2. process the first chroma plane using
pre-stored row pointer.
// method 3. process the second chroma plane using
individual element access
for( int y = 0; y
< img_yuv.rows; y++ )
{
uchar* Uptr =
planes[1].ptr<uchar>(y);
for( int x = 0; x
< img_yuv.cols; x++ )
{
Uptr[x] =
saturate_cast<uchar>((Uptr[x]-128)/2 + 128);
uchar&
Vxy = planes[2].at<uchar>(y, x);
Vxy =
saturate_cast<uchar>((Vxy-128)/2 + 128);
}
}
#else
Mat noise(img.size(), CV_8U); // another
Mat constructor; allocates a matrix of the specified size and type
randn(noise, Scalar::all(128),
Scalar::all(20)); // fills the matrix with normally distributed random values;
// there is also randu() for uniformly distributed random number
generation
GaussianBlur(noise, noise, Size(3, 3), 0.5,
0.5); // blur the noise a bit, kernel size is 3x3 and both sigma's are set to
0.5
const double brightness_gain = 0;
const double contrast_gain = 1.7;
#if DEMO_MIXED_API_USE
// it's easy to pass the new matrices to
the functions that only work with IplImage or CvMat:
// step 1) - convert the headers, data will
not be copied
IplImage cv_planes_0 = planes[0], cv_noise
= noise;
// step 2) call the function; do not forget
unary "&" to form pointers
cvAddWeighted(&cv_planes_0,
contrast_gain, &cv_noise, 1, -128 + brightness_gain, &cv_planes_0);
#else
addWeighted(planes[0], contrast_gain,
noise, 1, -128 + brightness_gain, planes[0]);
#endif
const double color_scale = 0.5;
// Mat::convertTo() replaces
cvConvertScale. One must explicitly specify the output matrix type (we keep it
intact - planes[1].type())
planes[1].convertTo(planes[1],
planes[1].type(), color_scale, 128*(1-color_scale));
// alternative form of cv::convertScale if
we know the datatype at compile time ("uchar" here).
// This expression will not create any
temporary arrays and should be almost as fast as the above variant
planes[2] =
Mat_<uchar>(planes[2]*color_scale + 128*(1-color_scale));
// Mat::mul replaces cvMul(). Again, no
temporary arrays are created in case of simple expressions.
planes[0] = planes[0].mul(planes[0],
1./255);
#endif
// now merge the results back
merge(planes,
img_yuv);
// and produce the
output RGB image
cvtColor(img_yuv,
img, CV_YCrCb2BGR);
// this is counterpart for cvNamedWindow
namedWindow("image with grain", CV_WINDOW_AUTOSIZE);
#if DEMO_MIXED_API_USE
// this is to demonstrate that img and iplimg really share
the data - the result of the above
// processing is stored in img and thus in iplimg too.
cvShowImage("image with grain", iplimg);
#else
imshow("image with grain", img);
#endif
waitKey();
return 0;
// all the memory will automatically be released by
Vector<>, Mat and Ptr<> destructors.
}
Tampilan kodingan
image pada folder opencv setelah kita copy paste pada visual studio
3. Kemudian kita setting relese dan debug. Untuk mengaturnya kita masuk ke Project
>> Coba Properties
4. Ketika sudah tampil coba property page nya kemudian klik Linker
>> Input. Pertama kita atur
relese. Untuk mengatur relese kita ubah pada bagian Configuration >>
Relese >> Additional Include Directories. Kita kita input kodingan.
Kodingan yang kita input adalah:
opencv_features2d246.lib
opencv_highgui246.lib
opencv_core246.lib
opencv_imgproc246.lib
opencv_ml246.lib
opencv_objdetect246.lib
opencv_video246.lib
opencv_contrib246.lib
opencv_calib3d246.lib
Setelah itu klik OK
5. Setelah
itu kita atur Debug. Caranya sama hanya saja pada Configuration kita ubah
menjadi Debug. Yang berbeda hanya kodingannya. Kodingan yang digunakan pada
debug adalah:
opencv_features2d246.lib
opencv_features2d246.lib
opencv_highgui246d.lib
opencv_core246d.lib
opencv_imgproc246d.lib
opencv_ml246d.lib
opencv_objdetect246d.lib
opencv_video246d.lib
opencv_contrib246d.lib
Jika Relese dan Debug sudah kita atur
kemudian pilih Apply >> OK
6. Langkah
selanjutnya adalah mengatur alamat folder pada Tools. Kita pilih Tools >>
Properties Project >> Project and Solution >> VC++ Directories.
Pertama kita atur Library File. Maka yang kita atur pada show directories >>
Library files. Selanjutnya kita pilih new line (kita masukan alamat folder
penyimpanan) >> OK.
7. Setelah
itu kita atur library pada Include files. Kita ubah Show directories foe
menjadi Include files.ada 2 alamat yag akan kita input yaitu:
Kemudian pilih OK
8. Setelah
itu kita copy paste image yang ada pada folder opencv ke dalam folder visual
studio. Pertama kita buka folder opencv >> samples >> cpp >>
pilih gambar(kita gunakan gambar dengan namafile adalah lena). Image yang ada
pada opencv lalu kita copy paste ke dalam folder visual studio.
9. Setelah
itu kita paste image tersebut ke dalam folder Visual Studio 2008 >>
Projects >> coba >> coba. Tampilan folder saat image berhasil kita
paste pada folder visual studio.
10. Setelah
semua settingan selesai kita atur lalu pilih save project. Kemudian kita jalankan
program dengan menngunakan tombol F5 pada keyboard atau kita pilih Debug
>> start Debugging.
Daftar
Pustaka
0 komentar:
Posting Komentar