Pages

Jumat, 06 Desember 2013

Pengolahan Citra - Perataan Histogram


Dalam pengolahan citra, histogram dapat dianggap sebagai representasi grafis dari nilai pixel vs jumlah pixel. Sebagai contoh sebuah histogram dari gambar grayscale channel tunggal (single channel) 8bit dapat merupakan graf 2D dari X-axis dengan nilai pixel dan Y-axis dengan jumlah pixel. Perataan histogram adalah pengaturan kontras menggunakan histogram dari sebuah gambar. Metode ini berguna ketika informasi dari sebuah gambar tersebut kurang baik dimana baik foreground dan backgroundnya terlalu gelap atau terlalu terang. Gambar di bawah menunjukkan apa yang kita sebenarnya lakukan dengan perataan histogram.

Perataan histogram memperbaiki kontras dari sebuah gambar dengan merenggangkan (stretching) jangkauan intensitas dari gambar tersebut. Pada gambar di bawah, gambar sebelah kiri merepresentasikan histogram dari gambar sumber dengan kontras rendah, dan gambar sebelah kanan merepresentasikan histogram setelah dilakukan perataan. Jadi jelas bahwa perataan histogram hanya merenggangkan (stretching) jangkauan intensitas.

                  Representasi grafis dari perataan histogram (Gambar dari Wikipedia)
Caranya ialah :
  1.  Me-load gambar sebagai channel tunggal (single channel).
  2. Membuat histogram dari gambar sumber.
  3. Melakukan perataam histogram dari gambar sumber.
  4. Membuat histogram dari gambar yang sudah dilakukan perataan.
  5. Menampilkan hasilnya.

Untuk Source Codenya :
      
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc_c.h"
#include <iostream>
#include <stdio.h>

using namespace std;
using namespace std;
void create_histogram_image(IplImage*, IplImage*);

int main()
{
// Set up images
IplImage *img = cvLoadImage("raisa.jpg", 0);
IplImage* out = cvCreateImage( cvGetSize(img), IPL_DEPTH_8U, 1 );
// create new image structure to hold histogram image
IplImage *hist1 = cvCreateImage(cvSize(640,480), 8, 1);
cvSet( hist1, cvScalarAll(255), 0 );
IplImage *hist2 = cvCreateImage(cvSize(640,480), 8, 1);
cvSet( hist2, cvScalarAll(255), 0 );

create_histogram_image(img, hist1);
cvEqualizeHist( img, out );// Perform histogram equalization
create_histogram_image(out, hist2);

cvNamedWindow( "Original", 1) ;// Show original
cvShowImage( "Original", img );
cvNamedWindow( "Histogram before equalization", 1) ;//Show Histograms
cvShowImage( "Histogram before equalization", hist1 );
cvNamedWindow( "Histogram after equalization", 1) ;
cvShowImage( "Histogram after equalization", hist2 );
cvNamedWindow("Result", 1) ; // Show histogram equalized
cvShowImage("Result", out );
cvWaitKey(0);

cvReleaseImage( &img );
cvReleaseImage( &out );
return 0;
}


/*******This function create histogram of the source image*******/


void create_histogram_image(IplImage* gray_img, IplImage* hist_img) {
CvHistogram *hist;
int hist_size = 256;
float range[]={0,256};
float* ranges[] = { range };
float max_value = 0.0;
float w_scale = 0.0000000;


hist = cvCreateHist(1, &hist_size, CV_HIST_ARRAY, ranges, 1);// create array to hold histogram values

cvCalcHist( &gray_img, hist, 0, NULL );// calculate histogram values

cvGetMinMaxHistValue( hist, 0, &max_value, 0, 0 ); // Get the minimum and maximum values of the histogram

cvScale( hist->bins, hist->bins, ((float)hist_img->height)/max_value, 0 );// set height by using maximim value

w_scale = ((float)hist_img->width)/hist_size;// calculate width


// plot the histogram
for( int i = 0; i < hist_size; i++ ) {
cvRectangle( hist_img, cvPoint((int)i*w_scale , hist_img->height),
cvPoint((int)(i+1)*w_scale, hist_img->height -

cvRound(cvGetReal1D(hist->bins,i))),
cvScalar(0), -1, 8, 0 );
}
}

Tampilan Gambar Awal 


Setelah dimasukkan ke dalam opencv, maka secara otomatis tampilan gambar akan menjadi grayscale :



Tampilan Hasil