Penipisan Pola Citra (Thinning)

Definisi Citra:

Citra adalah gambar dua dimensi yang dihasilkan dari gambar analog dua dimensi yang kontinu menjadi gambar diskrit melalui proses sampling.

Gambar analog dibagi menjadi N baris dan M kolom sehingga menjadi gambar diskrit. Persilangan antara baris dan kolom tertentu disebut dengan piksel. Contohnya adalah gambar/titik diskrit pada baris n dan kolom m disebut dengan piksel [n,m].

Definisi Pengolahan Citra:

Pengolahan citra adalah pemrosesan citra, dengan maksud untuk mendapatkan kualitas citra yang diinginkan (lebih baik yang bersifat relatif ).

Definisi Sampling :

Sampling adalah proses untuk menentukan warna pada piksel tertentu pada citra dari sebuah gambar yang kontinu.

Pada proses sampling biasanya dicari warna rata-rata dari gambar analog yang kemudian dibulatkan.

Proses sampling sering juga disebut proses digitisasi.

Definisi Kuantisasi :

Ada kalanya, dalam proses sampling, warna rata-rata yang didapat di relasikan ke level warna tertentu. Contohnya apabila dalam citra hanya terdapat 16 tingkatan warna abu-abu, maka nilai rata-rata yang didapat dari proses sampling harus diasosiasikan ke 16 tingkatan tersebut. Proses mengasosiasikan warna rata-rata dengan tingkatan warna tertentu disebut dengan kuantisasi.

Definisi Algoritma :

Algoritma kategori ini menggunakan histogram dari citra awal untuk menghasilkan citra baru.

  • Peregangan Kontras
  • Ekualisasi histogram
  • Filter Minimum
  • Filter Median
  • Filter Maksimum

Definisi Penipisan Pola Citra (Thinning) :

Penipisan (thinning) adalah operasi pemrosesan citra biner yang dalam hal ini  objek (region) direduksi menjadi rangka yang menghampiri garis sumbu objek. Tujuan penipisan adalah mengurangi bagian yang tidak perlu (redundant)
sehingga hanya dihasilkan informasi yang esensial saja

Penipisan pola merupakan proses yang iteratif yang menghilangkan pixel-pixel hitam (mengubahnya menjadi pixel putih) pada tepi-tepi pola. Jadi, algoritma penipisan mengelupas pixel-pixel pinggir objek, yaitu pixel-pixel yang terdapat pada peralihan 0®1. Algoritma penipisan pola harus memenuhi persyaratan sebagai berikut [PIT93]:

  1. Mempertahankan keterhubungan pixel-pixel objek pada setiap lelaran. Dengan kata lain, tidak menyebabkan bentuk objek menjadi terputus
  2. Tidak memperpendek ujung lengan dari bentuk yang ditipiskan

Algoritma penipisan yang umum adalah memeriksa pixel-pixel di dalam jendela yang berukuran 3 ´ 3 pixel dan mengelupas satu pixel pada pinggiran (batas) objek pada setiap lelaran, sampai objek berkurang menjadi garis tipis. Notasi pixel di dalam jendela 3 ´ 3 diperlihatkan pada Gambar 11.12(c). Algoritma bekerja secara iteratif, pada setiap lelaran dilakukan premrosesan pada jendela yang berukuran 3 ´ 3 pixel.

Algoritmanya adalah sebagai berikut [PIT93]:

  1. Mula-mula diperiksa jumlah pixel objek (yang bernilai 1), N, di dalam jendela 3 ´ 3 pixel.
  2. Jika N kurang atau sama dengan 2, tidak ada aksi yang dilakukan karena di dalam jendela terdapat ujung lengan objek.
  3. Jika N lebih besar dari 7, tidak ada aksi yang dilakukan karena dapat menyebabkan pengikisan (erosion) objek.
  4. Jika N lebih besar dari 2, periksa apakah penghilangan pixel tengah menyebabkan objek tidak terhubung. Ini dilakukan dengan membentuk barisan p1p2p3…p8p1. Jika jumlah peralihan 0 ® 1 di dalam barisan tersebut sama dengan 1, berarti hanya terdapat satu komponen terhubung di dalam jendela 3 ´ 3. Pada kasus ini, dibolehkan menghapus pixel tengah yang bernilai 1 karena penghapusan tersebut tidak mempengaruhi keterhubungan.

Algoritma penipisan pola dalam bahasa C diperlihatkan pada Algoritma :

void penipisan(citra f, int N1, int M1, int N2, int M2)

/* Prosedur yang mengimplementasikan penipisan pola

Masukan :

f      : citra biner

N1, M1 : koordinat awal (sudut kiri atas)

N2, M2 : koordinat akhir (sudut kanan bawah)

Keluaran: citra bienrf

*/

{

int k, l, i, j, count=0, y[9], trans=0, m, OK=1

do

{

OK=1;

for(k=N1+1;k<N2-1;k++)

for(l=M1+1;l<M2-1;l++)

if (f[k][l]==1)

{/* hitung jumlah 1 di dalam jendela 3 ´ 3 */count=0;

for(i=-1;i<=1;i++)

for(j=-1;j<=1;j++)

if(f[k+i][j+l]==1) count++;

if((count>2)&&(count<8))

{ /* hitung jumlah peralihan 0->1 */

y[0]=f[k-1][l-11]; y[1]=f[k-1][l];y[2]=f[k-1][l+1]; y[3]=f[k][l+1];    y[4]=f[k+1]l+1];y[5]=f[k+1][l]; y[6]=f[k+1][l-1];  y[7]=f[k][l-1];y[8]=f[k-1][l-1]; trans=0;

for(m=0;m<=7;m++)

if (y[m]==0 && y[m+1]==1) trans++;

/* jika jumlah peralihan sama dengan 1, hapus pixel

yang sedang diacu (current) */

if (trans==1) {f[k][l]=0; OK=0;}

}

}

} while (OK=0);

}

Program menggunakan open cv & Microsoft Visual Studio untuk penipisan pola citra :

/**
* @file Threshold.cpp
* @brief Sample code that shows how to use the diverse threshold options offered by OpenCV
* @author OpenCV team
*/

#include “opencv2/imgproc/imgproc.hpp”
#include “opencv2/highgui/highgui.hpp”
#include <stdlib.h>
#include <stdio.h>

using namespace cv;

/// Global variables

int threshold_value = 0;
int threshold_type = 3;
int const max_value = 255;
int const max_type = 4;
int const max_BINARY_value = 255;

Mat src, src_gray, dst;
const char* window_name = “Threshold Demo”;

const char* trackbar_type = “Type: \n 0: Binary \n 1: Binary Inverted \n 2: Truncate \n 3: To Zero \n 4: To Zero Inverted”;
const char* trackbar_value = “Value”;

/// Function headers
void Threshold_Demo( int, void* );

/**
* @function main
*/
int main( int, char** argv )
{
/// Load an image
src = imread( “mountain.jpg”, 1 );

/// Convert the image to Gray
cvtColor( src, src_gray, CV_RGB2GRAY );

/// Create a window to display results
namedWindow( window_name, CV_WINDOW_AUTOSIZE );

/// Create Trackbar to choose type of Threshold
createTrackbar( trackbar_type,
window_name, &threshold_type,
max_type, Threshold_Demo );

createTrackbar( trackbar_value,
window_name, &threshold_value,
max_value, Threshold_Demo );

/// Call the function to initialize
Threshold_Demo( 0, 0 );

/// Wait until user finishes program
for(;;)
{
int c;
c = waitKey( 20 );
if( (char)c == 27 )
{ break; }
}

}

/**
* @function Threshold_Demo
*/
void Threshold_Demo( int, void* )
{
/* 0: Binary
1: Binary Inverted
2: Threshold Truncated
3: Threshold to Zero
4: Threshold to Zero Inverted
*/

threshold( src_gray, dst, threshold_value, max_BINARY_value,threshold_type );

imshow( window_name, dst );
}

Dengan Hasil :

Setelah dilakukan penipisan citra

Image

Sebelum dilakukan penipisan citra

mountain

Angga Maulana (50410799)

Gandha Ryanto (52410948)