Selasa, 10 Desember 2013

Smoothing Pengolahan Citra


Pada kesempatan kali ini kami akan membahas tentang Smoothing pada sebuah citra yang diajukan guna melengkapi tugas pengolahan citra. Disini kami melakukan smoothing menggunakan Opencv dan Ms Visual studio untuk memperoleh pelembutan citra yang baik. Pengertian Smoothing itu sendiri adalah  Penyamaan pixel (guna penghalusan) dengan sebelah-sebelahnya, untuk mengurangi kontras dan mensimulasikan citra yang tidak fokus. sedangkan tujian dari Pelembutan Citra (smoothing) yaitu mengurangi noise pada suatu image. Noise-noise tersebut muncul sebagai akibat dari hasil pensamplingan yang tidak bagus. Pixel komponen yang mempunyai noise pada umumnya memiliki frekuensi yang tinggi. Kompoen citra yang berfrekuensi rendah akan diloloskan dan komponen yang mempunyai frekuensi tinggi akan ditahan.


Smoothing, juga disebut kabur, adalah operasi pengolahan citra sederhana dan sering digunakan. Pada proses pelembutan citra (Smoothing) disini, kami menggunakan Opencv dan juga microsoft visual studio untuk membuat sebuah program aplikasinya. Microsoft visual studio digunakan untuk menuliskan sebuah code smoothing, dimana pada program aplikasi ini kami menggunakan beberapa filter teknik smoothing atau pengkaburan, diantaranya yaitu teknik Homogenous Blur, Gaussian Blur, Median Blur serta Bilateral Blur. berikut adalah code yang digunakan untuk pembuatan aplikasi smoothing :


#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"

using namespace std;
using namespace cv;

/// Global Variables
int DELAY_CAPTION = 1500;
int DELAY_BLUR = 100;
int MAX_KERNEL_LENGTH = 31;

Mat src; Mat dst;
char window_name[] = "Filter Demo 1";

/// Function headers
int display_caption( char* caption );
int display_dst( int delay );

/**
 * function main
 */
 int main( int argc, char** argv )
 {
   namedWindow( window_name, CV_WINDOW_AUTOSIZE );

   /// Load the source image
   src = imread( "../images/lena.jpg", 1 );

   if( display_caption( "Original Image" ) != 0 ) { return 0; }

   dst = src.clone();
   if( display_dst( DELAY_CAPTION ) != 0 ) { return 0; }

   /// Applying Homogeneous blur
   if( display_caption( "Homogeneous Blur" ) != 0 ) { return 0; }

   for ( int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2 )
       { blur( src, dst, Size( i, i ), Point(-1,-1) );
         if( display_dst( DELAY_BLUR ) != 0 ) { return 0; } }

    /// Applying Gaussian blur
    if( display_caption( "Gaussian Blur" ) != 0 ) { return 0; }

    for ( int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2 )
        { GaussianBlur( src, dst, Size( i, i ), 0, 0 );
          if( display_dst( DELAY_BLUR ) != 0 ) { return 0; } }

     /// Applying Median blur
     if( display_caption( "Median Blur" ) != 0 ) { return 0; }

     for ( int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2 )
         { medianBlur ( src, dst, i );
           if( display_dst( DELAY_BLUR ) != 0 ) { return 0; } }

     /// Applying Bilateral Filter
     if( display_caption( "Bilateral Blur" ) != 0 ) { return 0; }

     for ( int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2 )
         { bilateralFilter ( src, dst, i, i*2, i/2 );
           if( display_dst( DELAY_BLUR ) != 0 ) { return 0; } }

     /// Wait until user press a key
     display_caption( "End: Press a key!" );

     waitKey(0);
     return 0;
 }

 int display_caption( char* caption )
 {
   dst = Mat::zeros( src.size(), src.type() );
   putText( dst, caption,
            Point( src.cols/4, src.rows/2),
            CV_FONT_HERSHEY_COMPLEX, 1, Scalar(255, 255, 255) );

   imshow( window_name, dst );
   int c = waitKey( DELAY_CAPTION );
   if( c >= 0 ) { return -1; }
   return 0;
  }

  int display_dst( int delay )
  {
    imshow( window_name, dst );
    int c = waitKey ( delay );
    if( c >= 0 ) { return -1; }
    return 0;
  }


Pada code diatas terdapat empat jenis pengkaburan, yaitu Homogenous blur, Gaussian Blur, Median Blur dan Bilateral Blur. berikut adalah cuplikan code masing masing teknik pengkaburan.

Homogeneous blur
   if( display_caption( "Homogeneous Blur" ) != 0 ) { return 0; }

   for ( int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2 )
       { blur( src, dst, Size( i, i ), Point(-1,-1) );
         if( display_dst( DELAY_BLUR ) != 0 ) { return 0; } } 
Pada Homogenous blur disini kita menggunakan 4 argumen :
  • src : Sumber gambar 
  • dst : image Destination 
  • Ukuran ( w , h) : Mendefinisikan ukuran kernel yang akan digunakan ( piksel w lebar dan tinggi h piksel ) 
  • Titik ( -1 , -1 ) : Menunjukkan di mana titik jangkar ( pixel dievaluasi ) terletak terhadap lingkungan . Jika ada nilai negatif , maka pusat kernel dianggap sebagai titik anchor .
Gaussian blur
    if( display_caption( "Gaussian Blur" ) != 0 ) { return 0; }

    for ( int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2 )
        { GaussianBlur( src, dst, Size( i, i ), 0, 0 );
          if( display_dst( DELAY_BLUR ) != 0 ) { return 0; } }
Pada Gaussian blur disini kita menggunakan 4 argumen :

  • src : Sumber gambar 
  • dst : image Destination 
  • Ukuran ( w , h) : Ukuran kernel yang akan digunakan ( tetangga dipertimbangkan ) . w dan h harus angka ganjil dan positif jika ukuran thi akan dihitung dengan menggunakan \ sigma_ { x } dan \ sigma_ { y } argumen.
  • \ sigma_ { x } : Standar deviasi dari x . Menulis 0 menyiratkan bahwa \ sigma_ { x } dihitung dengan menggunakan ukuran kernel .
    \ sigma_ { y } : Standar deviasi dalam y . Menulis 0 menyiratkan bahwa \ sigma_ { y } dihitung dengan menggunakan ukuran kernel .
Median blur
     if( display_caption( "Median Blur" ) != 0 ) { return 0; }

     for ( int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2 )
         { medianBlur ( src, dst, i );
           if( display_dst( DELAY_BLUR ) != 0 ) { return 0; } } 
Pada Median blur disini kita menggunakan 3 argumen :

  • src : Sumber gambar 
  • dst : image Destination 
  •  i: Ukuran dari kernel ( hanya satu karena kami menggunakan jendela persegi ) . bilangan i harus ganjil

Bilateral blur
     if( display_caption( "Bilateral Blur" ) != 0 ) { return 0; }

     for ( int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2 )
         { bilateralFilter ( src, dst, i, i*2, i/2 );
           if( display_dst( DELAY_BLUR ) != 0 ) { return 0; } }
 Pada Bilateral blur disini kita menggunakan 5 argumen :
  • src : Sumber gambar 
  • dst : image Destination 
  • d : Diameter lingkungan masing-masing pixel.
  • \sigma_ {warna} : Standar deviasi dalam ruang warna .
  • \sigma_ {ruang} : Standar deviasi dalam koordinat ruang ( dalam hal piksel )
cukup sekian penjelasan dari kami mengenai smoothing pengolahan citra, untuk hasil gambar tiap tiap teknik pengkaburan atau smoothing akan menyusul (berupa gambar). terima kasih...

tim penyusun :
Muhamad Asep Saputra (54410563)
Robby Johari (NPM)

Refferensi :