Rabu, 07 Agustus 2013

Deteksi Warna dari File Citra

MEMBUAT FUNGSI DETEKSI WARNA RGB SEMPURNA

Hal yang harus dipahami terlebih dahulu sebelum membahas hal ini adalah tentang apa itu fungsi? Fungsi seperti yang diketahui, dibuat untuk mengorganisasi kode program agar efisien dan membuat proses debugging menjadi lebih mudah. Sekumpulan statement didalam fungsi bisa dieksekusi dan ketika diperlukan dapat dipanggil tanpa menulis ulang koding didalam fungsi tersebut. Data yang diperlukan didalam fungsi bisa dilalui sebagai argumen dan kemudian nilai hasilnya akan dikembalikan. Fungsi disimpan sebagai m-file dengan nama yang sama dengan nama fungsi tersebut.

Pengujian Program Deteksi Warna RGB

Misalkan kita akan menguji file gambar 2.jpg berikut:

Gambar 1. File gambar 2.jpg sebagai file yang di uji

Fungsi Deteksi Warna Merah

Pada contoh berikut kita akan membuat fungsi yang mengambil masukan citra color dan mengembalikan hasilnya menjadi citra biner dimana pixel – pixel merah akan diganti dengan warna putih dan sisanya (yang tidak berpixel merah) akan diganti dengan warna hitam.

Proyek 17. Deteksi Warna Merah

function [binmerah, num]=merah(im)
[m,n,t]=size(im);
binmerah=zeros(m,n); num=0;
for i=1:m
for j=1:n
if(im(i,j,1)==255 && im(i,j,2)==0 && im(i,j,3)==0)
% Komponen hijau dan biru bernilai nol dan merah bernilai 255
binmerah(i,j)=1;
num=num+1;
end
end
end

Program Pengujian Deteksi Merah
%membaca file citra
I=imread('gambar 2.jpg');
[img, n]=merah(I); % memanggil fungsi merah
n

%menampilkan bagian warna yang merah
imshow(I), title('GAMBAR BERWARNA RGB');
figure, imshow(img), title('DETEKSI WARNA MERAH');

Output Pengujian Deteksi Merah

(a)
(b)
Gambar 2. Output deteksi warna merah

Fungsi Deteksi Warna Hijau

Dengan logika yang sama seperti fungsi merah, pada fungsi hijau dimana pixel – pixel hijau akan diganti dengan warna putih dan sisanya (yang tidak berpixel hijau) akan diganti dengan warna hitam.

Proyek 18. Deteksi Warna Hijau

function [binhijau, num]=hijau(im)
[m,n,t]=size(im);
binhijau=zeros(m,n); num=0;
for i=1:m
for j=1:n
if(im(i,j,1)==0 && im(i,j,2)==255 && im(i,j,3)==0)
% Komponen merah dan biru bernilai nol dan hijau bernilai 255
binhijau(i,j)=1;
num=num+1;
end
end
end

Program Pengujian Deteksi Hijau
%membaca file citra
I=imread('gambar 2.jpg');
[img, n]=hijau(I); % memanggil fungsi hijau
n
%menampilkan bagian warna yang hijau
imshow(I), title('GAMBAR BERWARNA RGB');
figure, imshow(img), title('DETEKSI WARNA HIJAU');

Output Pengujian Deteksi Hijau
(a)
(b)
Gambar 3. Output deteksi warna hijau

Fungsi Deteksi Warna Biru

Dengan logika yang sama seperti fungsi merah, pada fungsi biru dimana pixel – pixel biru akan diganti dengan warna putih dan sisanya (yang tidak berpixel biru) akan diganti dengan warna hitam.

Proyek 19. Deteksi Warna Biru

function [binbiru, num]=biru(im)
[m,n,t]=size(im);
binbiru=zeros(m,n); num=0;
for i=1:m
for j=1:n
if(im(i,j,1)==0 && im(i,j,2)==0 && im(i,j,3)==255)
% Komponen merah dan hijau bernilai nol dan biru bernilai 255
binbiru(i,j)=1;
num=num+1;
end
end
end

Program Pengujian Deteksi Biru
%membaca file citra
I=imread('gambar 2.jpg');
[img, n]=biru(I); % memanggil fungsi biru
n
%menampilkan bagian warna yang biru
imshow(I), title('GAMBAR BERWARNA RGB');
figure, imshow(img), title('DETEKSI WARNA BIRU');

Output Pengujian Deteksi Biru

(a)
(b)
Gambar 4. Output deteksi warna biru

Fungsi Deteksi Warna Kuning

Warna kuning merupakan warna yang tidak berdiri sendiri, warna kuning dibentuk dari warna dasar merah dan hijau. Kemudian warna kuning akan diganti dengan warna putih dan sisanya (yang tidak kuning) akan diganti dengan warna hitam.

Proyek 20. Deteksi Warna Kuning

function [binkuning, num]=kuning(im)
[m,n,t]=size(im);
binkuning=zeros(m,n); num=0;
for i=1:m
for j=1:n
if(im(i,j,1)==255 && im(i,j,2)==255 && im(i,j,3)==0)
% Komponen biru bernilai nol dan merah dan hijau bernilai 255
binkuning(i,j)=1;
num=num+1;
end
end
end

Program Pengujian Deteksi Kuning
%membaca file citra
I=imread('gambar 2.jpg');
[img, n]=kuning(I); % memanggil fungsi kuning
n

%menampilkan bagian warna yang kuning
imshow(I), title('GAMBAR BERWARNA RGB');
figure, imshow(img), title('DETEKSI WARNA KUNING');

Output Pengujian Deteksi Kuning

(a)
(b)
Gambar 5. Output deteksi warna kuning

Fungsi Deteksi Warna Magenta

Warna magenta merupakan warna yang tidak berdiri sendiri, warna magenta dibentuk dari warna dasar merah dan biru. Kemudian warna magenta akan diganti dengan warna putih dan sisanya (yang tidak magenta) akan diganti dengan warna hitam.
Proyek 21. Deteksi Warna Magenta

function [binmagenta, num]=magenta(im)
[m,n,t]=size(im);
binmagenta=zeros(m,n); num=0;
for i=1:m
for j=1:n
if(im(i,j,1)==255 && im(i,j,2)==0 && im(i,j,3)==255)
% Komponen hijau bernilai nol dan biru dan merah bernilai 255
binmagenta(i,j)=1;
num=num+1;
end
end
end

Program Pengujian Deteksi Magenta
%membaca file citra
I=imread('gambar 2.jpg');
[img, n]=magenta(I); % memanggil fungsi magenta
n
%menampilkan bagian warna yang magenta
imshow(I), title('GAMBAR BERWARNA RGB');
figure, imshow(img), title('DETEKSI WARNA MAGENTA');

Output Pengujian Deteksi Magenta

(a)
(b)
Gambar 6. Output deteksi warna magenta

Fungsi Deteksi Warna Cyan

Seperti kuning dan magenta, warna cyan merupakan warna yang tidak berdiri sendiri, warna cyan dibentuk dari warna dasar hijau dan biru. Kemudian warna cyan akan diganti dengan warna putih dan sisanya (yang tidak cyan) akan diganti dengan warna hitam.

Proyek 22. Deteksi Warna Cyan

function [bincyan, num]=cyan(im)
[m,n,t]=size(im);
bincyan=zeros(m,n); num=0;
for i=1:m
for j=1:n
if(im(i,j,1)==0 && im(i,j,2)==255 && im(i,j,3)==255)
% Komponen merah bernilai nol dan hijau dan biru bernilai 255
bincyan(i,j)=1;
num=num+1;
end
end
end

Program Pengujian Deteksi Cyan
%membaca file citra
I=imread('gambar 2.jpg');
[img, n]=cyan(I); % memanggil fungsi cyan
n
%menampilkan bagian warna yang cyan
imshow(I), title('GAMBAR BERWARNA RGB');
figure, imshow(img), title('DETEKSI WARNA CYAN');

Output Pengujian Deteksi Cyan

(a)
(b)
Gambar 7. Output deteksi warna cyan

Fungsi Deteksi Warna Putih

Warna putih merupakan warna kombinasi dari merah, hijau, dan biru. Kemudian warna tidak putih akan diganti dengan warna hitam.

Proyek 23. Deteksi Warna Putih

function [binputih, num]=putih(im)
[m,n,t]=size(im);
binputih=zeros(m,n); num=0;
for i=1:m
for j=1:n
if(im(i,j,1)==255 && im(i,j,2)==255 && im(i,j,3)==255)
% Komponen komponen bernilai 255
binputih(i,j)=1;
num=num+1;
end
end
end

Program Pengujian Deteksi Putih
%membaca file citra
I=imread('gambar 2.jpg');
[img, n]=putih(I); % memanggil fungsi putih
n
%menampilkan bagian warna yang putih
imshow(I), title('GAMBAR BERWARNA RGB');
figure, imshow(img), title('DETEKSI WARNA PUTIH');

Output Pengujian Deteksi Putih
                   
(a)
(b)
             Gambar 8. Output deteksi warna putih

Fungsi Deteksi Warna Hitam

Warna hitam merupakan warna ketika semua pixel warna merah, hijau, dan biru bernilai nol. Kemudian warna yang terdeteksi hitam akan diubah menjadi pputih, sebaliknya warna tidak hitam akan diganti dengan warna hitam.

Proyek 24. Deteksi Warna Hitam

function [binhitam, num]=hitam(im)
[m,n,t]=size(im);
binhitam=zeros(m,n); num=0;
for i=1:m
for j=1:n
if(im(i,j,1)==0 && im(i,j,2)==0 && im(i,j,3)==0)
% Komponen komponen bernilai 0
binhitam(i,j)=1;
num=num+1;
end
end
end

Program Pengujian Deteksi Hitam
%membaca file citra
I=imread('gambar 2.jpg');
[img, n]=hitam(I); % memanggil fungsi hitam
n
%menampilkan bagian warna yang putih
imshow(I), title('GAMBAR BERWARNA RGB');
figure, imshow(img), title('DETEKSI WARNA HITAM');

Output Pengujian Deteksi Hitam

(a)
(b)
Gambar 9. Output deteksi warna hitam


Copyright 2013@ Mada Sanjaya WS, Ph.D

Robot Penghindar Halangan Avoider Bolabot Berbasis Sensor Ultrasonic PING


Kelelawar hewan nocturnal, yang berkeliaran di malam hari...meski berada dikegelapan, kelelawar dapat terbang bebas tanpa menabrak penghalang didepannya,, kelelawar dapat menghindari penghalang didepannya karena kelelawar dapat mengeluarkan gelombang ultrasonic, yang jika ada penghalang maka gelombang tersebut akan dipantulkan kembali dan diterima oleh telinga kelelawar yang lebar, sehingga kelelawar dapat menghindar secara spontan ketika didepannya ada penghalang.



Gambar 1. Prinsip kerja pengukuran jarak benda



Karakteristik Sensor Ultrasonic PING Paralax

Ultrasonik, sebutan untuk jenis suara diatas batas suara yang bisa didengar manusia. Seperti diketahui, telinga manusia hanya bisa mendengar suara dengan frekuensi 20 Hz sampai 20KHz. Lebih dari itu hanya beberapa jenis binatang yang mampu mendengarnya, seperti kelelawar dan lumba-lumba. Lumba-lumba bahkan memanfaatkan ultrasonik untuk mengindera benda-benda di laut. Dengan cara mengirimkan sebuah suara dan mengitung lamanya pantulan suara tersebut maka dapat diketahui jarak kapal selam dengan benda tersebut. Mula-mula suara dibunyikan, kemudian dihitung lama waktu sampai terdengar suara pantulan. Jarak dapat dihitung dengan mengalikan kecepatan suara dengan waktu pantulan. Kemudian hasilnya dibagi 2. Misalnya lama waktu pantulan adalah 1 detik, maka jaraknya adalah (344,424m/detik x 1 detik)/2 = 172m.

Ping))) Ultrasonic Range Finder, adalah modul pengukur jarak dengan ultrasonic buatan Paralax Inc. yang didesain khusus untuk teknologi robotika. Dengan ukurannya yang cukup kecil (2,1cm x 4,5cm), sensor seharga 350 ribu rupiah ini dapat mengukur jarak antara 3 cm sampai 300 cm. Keluaran dari Ping))) berupa pulsa yang lebarnya merepresentasikan jarak. Lebar pulsanya bervariasi dari 115 uS sampai 18,5 mS.


Gambar 2. Sensor ultrasonic PING))) Paralax

Pada dasanya, Ping))) terdiri dari sebuah chip pembangkit sinyal 40KHz, sebuah speaker ultrasonik dan sebuah mikropon ultrasonik. Speaker ultrasonik mengubah sinyal 40 KHz menjadi suara sementara mikropon ultrasonik berfungsi untuk mendeteksi pantulan suaranya. Pada modul Ping))) terdapat 3 pin yang digunakan untuk jalur power supply (+5V), ground dan signal. Pin signal dapat langsung dihubungkan dengan mikrokontroler tanpa tambahan komponen apapun.

Ping))) mendeteksi objek dengan cara mengirimkan suara ultrasonik dan kemudian “mendengarkan” pantulan suara tersebut. Ping))) hanya akan mengirimkan suara ultrasonik ketika ada pulsa trigger dari mikrokontroler (Pulsa high selama 5uS). Suara ultrasonik dengan frekuensi sebesar 40KHz akan dipancarkan selama 200uS. Suara ini akan merambat di udara dengan kecepatan 344.424m/detik (atau 1cm setiap 29.034uS), mengenai objek untuk kemudian terpantul kembali ke Ping))). Selama menunggu pantulan, Ping))) akan menghasilkan sebuah pulsa. Pulsa ini akan berhenti (low) ketika suara pantulan terdeteksi oleh Ping))). Oleh karena itulah lebar pulsa tersebut dapat merepresentasikan jarak antara Ping))) dengan objek.

Berdasarkan Datasheet

Jarak = (Lebar Pulsa/29.034uS)/2 (dalam cm)
Jarak = (Lebar Pulsa x 0.034442)/2 (dalam cm)
Karena 1/29.034 = 0.34442

Berdasarkan Perhitungan Kalibrasi Bolabot Institute

Jarak = Lebar Pulsa * 0.021(dalam cm)

Nilai tersebut berbeda dengan nilai datasheet, sehingga penulis menyarankan untuk melakukan kalibrasi ulang jika akan menggunakan sensor ultrasonik PING))) agar lebih teliti.


Desain Robot Penghindar Halangan Sensor ultrasonik


Berikut adalah desain robot BOLABOT TECHNO ROBOTIC INSTITUTE (www.bolabot.com)menggunakan Proteus:

Gambar 3. Desain robot avoider ultrasonic



Program CV AVR Robot Avoider Ultrasonic



/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.0 Professional
Automatic Program Generator
© Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project : Robot Avoider Ultrasonic
Version : I
Date    : 2/18/2013
Author  : Mada Sanjaya WS, Ph.D
Company : Bolabot Techno Robotic Institute
Comments: -


Chip type               : ATmega8
Program type            : Application
AVR Core Clock frequency: 12.000000 MHz
Memory model            : Small
External RAM size       : 0
Data Stack size         : 256
*****************************************************/

#include <mega8.h>

#include <delay.h>
#include <stdio.h>
#include <stdlib.h>

unsigned int hitung;
float dutu;

void RF1(void)
{
    unsigned int i=0;
    hitung=0;
    DDRC.5=1;
    PORTC.5=1;
    delay_us(5);
    PORTC.5=0; 
    DDRC.5=0;
    PORTC.5=1;
    while(PINC.5==0){i++; if(i>=10000) break;}
    while(PINC.5==1){hitung++; if(hitung>=10000) break;}
    PORTC.5=0;
    delay_ms(10);
}

interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
    

}

// Declare your global variables here

void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=Out Func1=Out Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=0 State1=0 State0=T
PORTB=0x00;
DDRB=0x06;

// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 11.719 kHz
// Mode: Fast PWM top=0x00FF
// OC1A output: Non-Inv.
// OC1B output: Non-Inv.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0xA1;
TCCR1B=0x0D;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// USART initialization
// USART disabled
UCSRB=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// ADC initialization
// ADC disabled
ADCSRA=0x00;

// SPI initialization
// SPI disabled
SPCR=0x00;

// TWI initialization
// TWI disabled
TWCR=0x00;

DDRD.5=1; // definisi output ke motor kiri
DDRD.6=1; // definisi output ke motor kiri
DDRD.7=1; // definisi output ke motor kanan
DDRB.0=1; // definisi output ke motor kanan
PORTD.5=1;
PORTD.6=1;
PORTD.7=1;
PORTB.0=1;

while (1)
{
RF1();
dutu = hitung*0.021; // rumus jarak berdasarkan kalibrasi sensor

if (dutu<=20) //jika jarak terhadap penghalang kurang dari sama dengan 20 cm
{
OCR1A=100;
OCR1B=100;
PORTD.5=0;
PORTD.6=1;
PORTD.7=0;
PORTB.0=0;
delay_ms(1000);
OCR1A=100;
OCR1B=100;
PORTD.5=1;
PORTD.6=0;
PORTD.7=1;
PORTB.0=0;}
else{
OCR1A=100;
OCR1B=100;
PORTD.5=1;
PORTD.6=0;
PORTD.7=1;
PORTB.0=0;}
      }
}

Realisasi Hardware Robot Avoider Ultrasonik PING)))




Berikut adalah video yang telah diunggah di youtube




Copyright 2013© Profesor Bolabot