Showing posts with label Digital Image Processing. Show all posts
Showing posts with label Digital Image Processing. Show all posts

Friday, June 13, 2014

Face Detection Using Haar Cascade Classifier Algorithm

Viola dan Jones memperkenalkan metode yang akurat untuk mendeteksi wajah melalui sebuah citra. teknik ini dapat diadaptasi untuk mendeteksi pula fitur dari wajah tersebut. Bagian atau daerah wajah yang telah terdeteksi dianalisis kemungkinan untuk ditemukan fitur sangat tinggi. Sebagai contoh dari fitur tersebut adalah fitur mata dan mulut. Hal ini menyebabkan pemrosesan akan berjalan dengan lebih cepat. Wajah manusia memiliki kompleksitas permasalahn pemrosesan karena wajah manusia merupakan objek dinamis yang memiliki banyak macam dan warna. Oleh karenanya facial detection memiliki banyak pengaruh. Walaupun terdapat banyak algoritma untuk pemrosesan citra digital dan facial detection, tetapi banyak diantaranya yang memiliki kekurangan dan kelebihan[1].

1.      Inisialisasi Kamera
Inisialisasi kamera dimulai dari menginisialisasi video masukan sampai dengan pemrosesan citra. pada proses ini citra wajah secara fisik ditangkap dari capture device berupa webcam dengan resolusi 320 x 240 piksel. Citra wajah diambil untuk citra training berdasarkan posisi wajah yaitu posisi tegak lurus, rotasi sejajar 15* ke kanan, rotasi sejajar 15* ke kiri, mengangkat dagu ke atas 15* ke atas dan menundukkan kepala 15* ke bawah serta berdasarkan tiga jarak objek wajah, yaitu 100 cm, 150 cm dan 200 cm.
2.      Tahap Scalling
Scalling merupakan proses mengubah ukuran digital, hal ini perlu dilakukan agar semua citra digital memiliki ukuran yang sama. Untuk melakukan scaling di sistem ini dapat memanfaatkan package displau object. Citra digital tersebut diperkecil dengan menggunakan metode interpolasi. Metode ini menggunakan rata-rata suatu daerah yang mewakili daerah yang lebih besar. Berikut ini merupakan citra hasil interpolasi:


Gambar asli 320x240 piksel
Gambar dengan ukuran tersebut discan dan dikonversi ke dalam bentuk matriks 320 x 240 yang berisi nilai piksel dari masing-masing komponen piksel.
Proses pengubahan resolusi dari gambar dengan ukuran m x n tersebut terlihat pada tabel berikut, yaitu:
k
Resolusi-k (m), diambil ukuran panjang (Rk/2k)
Nilai Rata-rata
0
320
12 10 | 4 6 |13 59 |12 12 | ... |14 15|
1
160
11 8|36 12|...|14 15|
2
...
...
3
...
...

3.      Tahap Grayscaling
citra digital yang telah melalui proses scaling kemudian diubah menjadi citra dua warna dengan proses grayscaling. Masing-masing chanel piksel dengan komponen R,G dan B diproses dengan rumus sebagai berikut:
W= 0.2989 R + 0.5870 G + 0.1140 B
Sehingga diperoleh citra hasil grayscaling sebagai berikut:


Gambar hasil grascaling 20 x 20 piksel
4.      Pendeteksian dengan Haar Cascade Classifier
metode ini menggunakan haar-like features dimana perlu dilakukan training terlebih dahulu untuk mendapatkan suatu pohon keputusan dengan nama cascade classifier sebagai penentu apakah ada obyek atau tidak dalam setiap frame yang di proses. Terdapat 3 jenis fitur berdasarkan jumlah persegi panjang yang terdapat di dalamnya (Krishna & Srinivasulu, 2012), seperti yang dapat dilihat pada gambar di bawah ini:

5.      Proses menghitung Integral Image
citra integral adalah sebuah citra yang nilai setiap pikselnya merupakan akumulasi dari nilai piksel atas dan kirinya. Sebagai contoh, piksel (a,b) memiliki nilai akumulatif untuk semua piksel (x,y) dimana x<=a dan y <= b. Salah satu contoh seperti perhitungan berikut:


Gambar sampel perhitungan citra integral
Maka hasil perhitungan citra integralnya adalah:



Nilai fitur        = |total piksel hitam- total piksel putih|
                        = |(6+0-(0+0))+(25+3-(15+0))-(15+1-(6+0))|
= |6+13-10|
= 9
            Nilai Haar feature yang didapatkan di atas yaitu 9 adalah nilai perbedaan antar kotak (fitur puih dan fitur hitam) yang biasa disebut threshold. Threshold ini digunakan sebagai parameter klasifikasi objek yang terdeteksi sebagai wajah atau tidak.

Kemudian dengan Eclipse dan bahasa pemrograman Java serta Library OpenCV, ketikkan program seperti di bawah ini:

package latihan;
import java.io.File;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfRect;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.highgui.Highgui;
import org.opencv.objdetect.CascadeClassifier;

public class FaceDetector {
    public static String filename = "IMG_4936.png";
    public static void main(String[] args) {
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        System.out.println("\nRunning FaceDetector");
        CascadeClassifier faceDetector = new CascadeClassifier("xml/haarcascade_frontalface_alt.xml");
        File file=new File("images/abc.JPG");
        Mat image=null;
        if(file.exists()){
                image = Highgui.imread(file.getAbsolutePath());
        }else{
                System.out.println("Image doesn't exists!");
        }
        MatOfRect faceDetections = new MatOfRect();
        faceDetector.detectMultiScale(image, faceDetections);

        System.out.println(String.format("Detected %d faces", faceDetections.toArray().length));

        for (Rect rect : faceDetections.toArray()) {
            Core.rectangle(image, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height),
                    new Scalar(0, 255, 0));
        }

        System.out.println(String.format("Writing %s", filename));
        Highgui.imwrite(filename, image);
    }
}






Kode di atas digunakan untuk mendeteksi lebih dari satu foto dengan ukuran yang beraneka ragam.      

dan hasilnya sebagai berikut:



                                                

[1]. Ian, Philip Wilson, Fernandez John, Dr. 2006. Facial Feature Detection Using Haar Classifier
[2]. Gunawan, Hendra. 1997. Matematika di balik Citra Digital. Bandung :
[3].Viola, P. & Jones, M., 2001. Robust Realtime Object Detection. Second International Workshop On Statistical And Computational Theories Of Vision – Modeling, Learning, Computing And Sampling Vancouver, Canada, July 13, 2001.

Posted By Unknown9:26 PM

Monday, April 14, 2014

Digital Image Processing Using Matlab - Menghitung jumlah gigi gir

Assalamualaikum warahmatullah.
Tahukah anda gambar dibawah ini?

Ya. Benar sekali! Ini adalah gambar sebuah gear, gir. Apakah anda terpikir untuk menghitung berapa jumlah gigi yang dimiliki gir tersebut dengan menggunakan software?
Sebelum membuat aplikasinya, mari sedikit memahami konsep matematika yang ada di dalam metode ini.
Metode ini dikenal dengan nama Mathmatical Morphology. Morphologi adalah teknik pengolahan citra digital dengan menggunakan bentuk (shape) sebagai pedoman dalam pengolahan(minkowski set operation). Nilai dari setiap pixel dalam citra digital hasil diperoleh melalui proses perbandingan antara pixel yang bersesuaian pada citra digital masukan dengan pixel tetangganya. Operasi morphologi bergantung pada urutan kemunculan dari pixel, tidak memperhatikan nilai numeric dari pixel sehingga teknik morphologi sesuai apabila digunakan untuk melakukan pengolahan binary image dan grayscale image.
      Dengan mengatur atau memilih ukuran dan bentuk dari matrik kernel (structuring element) yang digunakan maka kita dapat mengatur sensitivitas operasi morphologi terhadap bentuk tertentu (spesifik) pada citra digital masukan. Operasi morphologi standar yang dilakukan adalah proses erosi dan dilatasi. Dilatasi adalah proses penambahan pixel pada batas dari suatu objek pada citra digital masukan, sedangkan erosi adalah proses pemindahan/pengurangan pixel pada batas dari suatu objek. Jumlah pixel yang ditambahkan atau yang dihilangkan dari batas objek pada citra digital masukan tergantung pada ukuran dan bentuk dari structuring element yang digunakan.
Beberapa operasi pada Morfologi:
Original Image
Structuring Element:
1. Dilasi
     Dilasi adalah operasi morphologi yang akan menambahkan pixel pada batas antar objek dalam suatu citra digital. Atau secara rinci Dilasi merupakan suatu proses menambahkan piksel pada batasan dari objek dalam suatu image sehingga nantinya apabila dilakukan operasi ini maka image hasilnya lebih besar ukurannya dibandingkan dengan image aslinya.
Contoh:
     Di bawah ini merupakan hasil image setelah dilakukan proses Dilasi dari Original Image dengan Stucturing Element yang telah ditentukan di atas. Warna hijau merupakan pixel tambahan setelah dilakukan Dilasi
2. Erosi
     Erosi merupakan kebalikkan dari Dilasi. Proses ini akan membuat ukuran sebuah citra menjadi lebih kecil. Berbeda dengan dilatasi, apabila erosi dilakukan maka yang dikerjakan adalah memindahkan piksel pada batasan-batasan objek yang akan di erosi. Jumlah dari pikselyang ditambah atau dihilangkan bergantung pada ukuran dan bentuk dari structuring element yang digunakan untuk memproses image tersebut.
Contoh :
     Di bawah ini merupakan hasil image setelah dilakukan proses Erosi dari Original Image dengan Stucturing Element yang telah ditentukan di atas. Warna hijau merupakan pixel dihilangkan setelah dilakukan proses Erosi, sehingga pixel hasilnya hanya yang berwarna hitam.
3. Opening
   Opening merupakan kombinasi proses dimana suatu citra digital dikenai operasi erosi dilanjutkan dengan dilasi. Operasi opening pada citra mempunyai efek memperhalus batas-batas objek, memisahkan objek-objek yang sebelumnya bergandengan, dan menghilangkan objek-objek yang lebih kecil daripada ukuran structuring.
Contoh:
     Di bawah ini merupakan hasil image setelah dilakukan proses Opening dari Original Image dengan Stucturing Element yang telah ditentukan di atas.  Proses yang dilakukan untuk mendapatkan opening adalah dengan cara melakukan operasi erosi, lalu hasil erosi tersebut di dilasi lagi.

4. Closing
    Closing merupakan kombinasi dimana suatu citra dikenai operasi dilasi dilanjutkan dengan erosi. Operasi closing juga cenderung akan memperhalus objek pada citra, namun dengan cara menyambung pecahan-pecahan (fuses narrow breaks and thin gulf) dan menghilangkan lubang-lubang kecil pada objek.
Contoh :
   Di bawah ini merupakan hasil image setelah dilakukan proses Closing dari Original Image dengan Stucturing Element yang telah ditentukan di atas.  Proses yang dilakukan untuk mendapatkan Closing adalah dengan cara melakukan operasi dilasi, lalu hasil dilasi tersebut dilakukan proses erosi lagi.
Mari membuat aplikasi penghitung gigi gir dengan menggunakan Matlab!

Tulislah kode berikut di Matlab anda:

clc;
clear;

%properties of Morphology se
seHorizontal = [0 0 0; 1 1 1; 0 0 0];
seVertical = [0 1 0; 0 1 0; 0 1 0];
seFull = [1 1 1; 1 1 1; 1 1 1];
seCros = [1 0 1; 0 1 0; 1 0 1];
seSlash = [0 0 1; 0 1 0; 1 0 0];
seBakslash = [1 0 0; 0 1 0; 0 0 1];
sePlush = [0 1 0; 1 1 1; 0 1 0];

gearImage = imread('roue.bmp'); %open the image
gearGray = rgb2gray(gearImage); %convert image to grayscale
gearBW = gearGray > 70;
gearBW = imerode(gearBW,seFull); %Erode the image with  seFull kernel
for a = 1 : 2
    gearBW = imdilate(gearBW,seFull); %Opening--> dilate the image using seFull kernal
end
gearBW = imdilate(gearBW,seFull); %Opening --> dilate the image using seFull kernel.
[r,c] = size(gearBW); %fill the array with object that are detected
rp = regionprops(double(gearBW), 'all');
xy = rp.ConvexHull;
mask = poly2mask(xy(:,1),xy(:,2),r,c);
maskEroded = imerode(mask,ones(16));
teeth = gearBW;
teeth(maskEroded) = 0;
imshow(teeth)  %The value is showing a teeth of the gear
[l,numObj] = bwlabel(teeth,8); %labeling every object that are detected
numObj %showing the number of teeth

Hasil dari program di atas adalah:



numbObj adalah variabel yang menyimpan jumlah gigi gir yang sudah dihitung. Jika anda kurang yakin, hitunglah secara manual kemudian bandingkan dengan hasil di atas!
Selamat Bereksperimen!

Posted By Unknown10:15 PM

Digital Image Processing Using Matlab - Latihan Matlab dan Image Processing Dasar

Assalamualaikum warahmatullah.
Punya Matlab yang terinstall tidak jelas di laptop? Daripada dianggurin, mending sejenak kita belajar tentang Pengolahan Citra Digital atau lebih kerennya disebut dengan Digital Image Processing. Apakah anda pernah menggunakan aplikasi pengolah foto seperti Adobe Photoshop, Photoscape dan Instagram? Wah, banyak sekali bukan fitur-fitur yang dimiliki aplikasi-aplikasi tersebut untuk memoles foto kita agar semakin indah dipandang? Kira-kira bagaimana sih cara kerjanya? Kok bisa foto yang kita capture dari device kita bisa berubah dan menjadi lebih indah? Ini nih gunanya Image Processing. Sebenarnya banyak sekali metode, teori, cara untuk mengolah gambar. Semua metode tersebut merupakan bagian dari pelajaran yang akan di dapat dari image processing ini. Tahukah anda, para pengembang teknologi mengolah gambar itu dengan memanfaatkan matematika yang sudah di dapat waktu SD, SMP, SMA, Kalkulus, Aljabar Linier, Statistika dan Komputasi Numerik untuk mengolah nilai piksel yang terkandung di dalam sebuah gambar.
Pernah melihat sebuah gambar yang di dalam komputer kita biasanya memiliki size tertentu? Itu dia merupakan hasil penjumlahan semua nilai piksel di dalam gambar tersebut.
Gambar itu secara umum terdiri dari 3 jenis, yaitu RGB, Grayscale dan Black&White. Sebenarnya Televisi jaman dulu menampilkan gambar dengan jenis Grayscale, hanya saja orang-orang salah kaprah mengartikan jenis gambar tersebut menjadi Black&White alias Hitam Putih.

  1. Disebut RGB karena memiliki 3 chanel warna, yaitu Red (tingkat kemerahan), Green (tingkat kehijauan) dan Blue (tingkat kebiruan) dengan nilai maksimal 255 dan nilai minimal 0. Itu alasannya mengapa warna putih dikodekan dengan #FFF dan hitam #000. 
  2. disebut Grayscale karena hanya memiliki 1 chanel warna yaitu tingkat keabuan dengan nilai minimal 0 dan nilai maksimal adalah 255
  3. disebut Grayscale karena hanya memiliki 2 kemungkinan warna yaitu 1 atau 0. Gambar dengan jenis ini juga sering disebut sebagai gambar biner.
Berikut adalah latihan dasar menggunakan Matlab sebelum nantinya menginjak materi Matlab lebih dalam, yaitu sebagai berikut:
  1. 1.      Perintah B=[1 2 3;4 5 6;7 8 9];
    Kode tersebut akan menunjukkan matriks dengan ordo 3x3 sebagai berikut:
    1 2 3
    4 5 6
    7 8 9
    2.      Tampilkan nilai B posisi(2,3) dan Ganti B(1,3) dengan 0.
    Untuk menampilkan B posisi(2,3), maka pada matlab harus diketikkan kode sbb:
    B(2,3)
    Untuk mengganti nilai pada posisi(1,3), maka:
    B(1,3)=0;
    3.      C=zeros(3);
    Kode tersebut menghasilkan matriks 0 berordo 3x3 sbb:
    0 0 0
    0 0 0
    0 0 0
    4.      D=ones(3);
    Kode tersebut menghasilkan matriks 1 berordo 3x3 sbb:
    1 1 1
    1 1 1
    1 1 1
    5.      E=B’;
    Kode tersebut akan mengisi E dengan matriks transpose dari B, yaitu:
    1     4     7
    2     5     8
    0     6     9
    6.      F=inv(B);
    Kode tersebut untuk menghitung nilai invers dari matriks B, yaitu:
       -0.3333   -2.0000    1.3333
        0.6667    1.0000   -0.6667
       -0.3333    0.6667   -0.3333

    7.      G=[2 4 6;2 4 6;2 4 6]
    Kode tersebut menghasilkan berikut:
    G =

         2     4     6
         2     4     6
         2     4     6
    8.      H=BXG
    X merupakan simbol perkalian cross dua buah matriks, maka perintah yang digunakan adalah :
    H=cross(B,G);
    dan menghasilkan sebagai berikut:
    H =

        -6   -12   -18
        12    24    54
        -6   -12   -36
    9.      I= B.G
    . merupakan simbol perkalian dot untuk 2 buah matriks, maka perintah yang digunakan adalah:
    I=dot(B,G);
    dan menghasilkan berikut:
    I =

        24    60    90

    10.  J = hasil pertambahan B dan G yang bersesuai posisinya(1 baris perintah)à J=B.+G; 
    Perintah yang digunakan adalah:
    J=plus(B,G);
    Hasilnya sebagai berikut:
    J =

      3   6     6
    6     9    12
    9   12    15
    11.   Perintah:
    If Nilai>= 80 && <=100àA
    Nilai>=65 &&<80àB
    Else Tidak lulus(harus pake editor)
    Dapat dilakukan dengan sintaks sebagai berikut:

    Nilai=input('Masukkan Nilai= ');
    if (Nilai>=80 && Nilai<=100)
        fprintf('A');
    elseif(Nilai>=65 && Nilai<80)
        fprintf('B');
        else fprintf('Tidak Lulus!soal');
    end

    12.  Perintah:
    K= baris pertama Bà 1 baris perintah
    K2= kolom pertama B à 1 baris perintah
    K3 = baris kedua dan ketiga B à 1 baris perintah
    Dapat dilakukan dengan sintaks:

    K=B(1,:);
    K2=B(:,1);
    K3=[B(2,:); B(3,:)];

    13.  L=2 x Bàtanpa loop
    Perintahnya:
                L = B * 2;

    14.  M=2 x B àdengan loop
    Perintahnya:
    for a = 1 : length(B)
        for b = 1 : length(B)
            M(a,b) = B(a,b) * 2;
        end
    end

    15.  Kernel = [1/9 1/9 1/9;1/9 1/9 1/9;1/9 1/9 1/9]
    Hasilnya:
    kernel =

        0.1111    0.1111    0.1111
        0.1111    0.1111    0.1111
        0.1111    0.1111    0.1111
    16.  N =[0 0 0 0 0;0 100 100 100 0;0 100 100 100 0;0 0 0 0 0]
    Hasilnya:
    N =

         0     0     0     0     0
         0   100   100   100     0
         0   100   100   100     0
         0     0     0     0     0

    17.  O=conv2(N,kernel)
    Hasilnya:
    O =

             0         0         0         0         0         0         0
             0   11.1111   22.2222   33.3333   22.2222   11.1111         0
             0   22.2222   44.4444   66.6667   44.4444   22.2222         0
             0   22.2222   44.4444   66.6667   44.4444   22.2222         0
             0   11.1111   22.2222   33.3333   22.2222   11.1111         0
             0         0         0         0         0         0         0
    18.  img=imgread(‘Tulips.jpg’);imshow(img);

    19.  imgR=img(1,:,1); imshow(imgR)

    imgR= img(:,:,1); imshow(imgR)


    20.  imgG=img(1,:,2); imshow(imgG)
    21.  imgB=img(1,:,3); imshow(imgB)

    Notasi tersebut mengambil gambar sebesar (a,b,c). a adalah besar pixel yang digambil secara vertikal, b adalah besar pixel yang diambil secara horizontal, dan c adalah channel gambar.
    22.  perintah untuk menggabungkan semua channel gambar adalah:
    imgGab=cat(3,imgR,imgG,imgB); imshow(imgGab);
    hasilnya:




    23.  P= hasil konvolusi kernel masingmasing channel IMG kemudiandigabungkan


    24.  Simpankedalam imgBlur.jpg
    25.  imgGS=im2gray(img);imshow(imgGS);

    26.  IMGbw=im2bw(img);

    27.  Tampilkandengan subplot
    Img
    imgGS
    imgBW
    imgR
    imgG
    imgB
    Perintah:
    subplot(3, 3, 1), subimage(img)
    title('Img asli')
    subplot(3, 3, 2), subimage(imgR)
    title('Img R')
    subplot(3, 3, 3), subimage(imgG)
    title('Img G')
    subplot(3, 3, 4), subimage(imgB)
    title('Img B')
    subplot(3, 3, 5), subimage(imgGab)
    title('Img Gab')
    subplot(3, 3, 6), subimage(gray)
    title('Img GS')
    subplot(3, 3, 7), subimage(imbw)
    title('Img BW')
    subplot(3, 3, 8), subimage(hasil)


    28.  Buat Title
    title('Img konvolusi')

    29.  Save gambar di plot
    saveas(gcf, 'Plot of Image', 'jpg');




Posted By Unknown9:33 PM