Menyamakan Ukuran Citra

[peng.citra|t.komputer|lab.hardware|pert.10]

Untuk membandingkan dua citra baik dengan JST atau metode yang lain, hal mutlak yang harus dilakukan adalah menyamakan ukuran dari citra. Menyamakan ukuran berarti menyamakan dimensi matriks antara satu gambar dengan gambar yang akan diuji kemiripannya. Gambar GUI di bawah ini adalah contoh ilustrasi proses pembandingan.

Perhatikan gambar di atas dimana gambar 1 yang merupakan master akan diuji dengan gambar 2 yang memiliki ukuran berbeda (kolom atau tinggi segiempatnya) dimana angka tiga 371, sementara angka 2 742. Proses callback “Resize Gbr 2” berisi kode berikut:

  • image=handles.image;
  • b=handles.b;
  • c=handles.c;
  • % ukuran gbr2
  • [b2,c2]=size(image)
  • save testing
  • image=imresize(image,[b c])
  • axes(handles.axes2)
  • imshow(image)
  • set(handles.edit5,’String’,b)
  • set(handles.edit6,’String’,c)

Perhatikan gambar di atas. Ukuran baru gambar dua sudah sama dengan tiga (kolom = 371). Dengan samanya ukuran gambar 1 dan gambar 2 maka proses selanjutnya (Uji Kecocokan) dapat dilakukan. Ada hal-hal tertentu yang didapat pada praktik hari ini:

  • Tidak boleh memberi nama GUI dengan nama yang dimiliki suatu fungsi pada Matlab, misalnya dengan nama “imresize”, karana ketika ada instruksi “imshow” akan menampilkan GUI tersebut bukannya gambar/citra.
  • Ketika GUI dengan Matlab 2013 dijalankan di 2008 ada pesan error dan tidak dapat dijalankan. Tetapi jika GUI dengan Matlab 2008 dapat dijalankan dengan 2013 ke atas. Semoga bermanfaat.

Menyiapkan Data Citra Untuk Pelatihan JST

[peng.citra|t.komputer|lab.hardware|pert.9]

Berikut ini contoh menyiapkan data training dan target sebagai masukan proses pelatihan pada Jaringan Syaraf Tiruan (JST). Kasusnya mirip dengan postingan yang lalu, hanya saja di sini kita coba dengan gambar/citra sesungguhnya. Bagaimana membuat data training dengan GUI agar lebih mudah menyiapkan datanya? Selain itu tentu saja terhindar dari kesalahan manusiawi (human error) ketika meramu data-nya.

Membuat GUI Pemrosesan Citra

Secara sederhana dan praktis data dibuat dengan paint bawaan Windows. Misalnya sistem yang dibuat mampu menebak angka 0, 1, hingga 5 saja. Tiap angka digambar sebanyak lima kali, beri nama misalnya 1a, 1b, .. dan seterusnya.

JST memisahkan data dengan target. Jadi data latih dari 0 hingga 5 dengan masing-masing angka lima gambar harus disediakan. Totalnya adalah 6×5 atau 30 data latih, begitu juga targetnya. Misal kita buat GUI sebagai berikut.

Algoritma

Prinsip kerja sederhana dari data yang akan dilatih adalah dengan membuat hubungan satu-satu antara data latih dengan targetnya. Jadi satu record citra yang sudah diolah dikonversi menjadi vektor baris (satu baris terdiri dari beberapa kolom) dibuatkan targetnya dengan indeks baris yang sama.

Pem-Vektor-an

Input: Citra

Output: Vector Citra

  • Ambil citra
  • Jadikan hitam putih
  • Jadikan biner
  • Perkecil, misal 20%
  • Jadikan vektor

Kode di bawah ini salah satu contoh menyimpan hasil pemvektoran data citra.

  • [img,file]=uigetfile(‘*.jpg’)
  • image=imread(img)
  • % pemrosesan citra
  • % jadi hitam putih
  • image=rgb2gray(image)
  • % jadi biner
  • image=im2bw(image)
  • % perkecil 20%
  • [baris,kolom]=size(image) %cari ukuran
  • image=imresize(image,[round(baris*0.2) round(kolom*0.2)]);
  • imshow(image)
  • % cek ukuran yg baru
  • [baris,kolom]=size(image)
  • % jadi vektor
  • image=reshape(image,1,(baris*kolom),[])
  • handles.image=image;
  • guidata(hObject,handles)
  • [baris,kolom]=size(image)
  • simpan=img(1:2)
  • save(simpan,’image’)

Simpan Vektor Hasil Pemrosesan

Salah satu hal sepele tetapi merepotkan adalah menyimpan vektor hasilnya. Di sini fungsi simpan=img(1:2) akan menyimpan vektor dengan nama yang sama dengan gambar yang diambil, tetapi hanya depannya saja (satu sampai dua karakter) karena ekstensinya beda (*.mat).

Setelah citra diambil dan diolah menjadi vektor, selain ditampilkan hasil prosesnya (biner dan diperkecil 20%) pastikan di folder tersimpan file matlab dengan nama yang sama dengan nama citra awalnya (hanya ekstensinya yang berbeda). Tinggal nanti seluruh file hasil pemvektoran digabung menjadi satu data latih beserta satu buah data label/targetnya. Sekian, semoga bermanfaat.

Deteksi Warna Komposit dengan Matlab

[peng.citra|t.kom|lab.hardware|pert.7]

Warna dasar RGB adalah Red, Green, dan Blue yang masing-masing menyatakan nilai maksimal komposisinya yaitu 255. Misalnya warna merah, maka matriks-nya sebesar [255 0 0], begitu juga untuk warna hijau dan biru, masing-masing [0 255 0] dan [0 0 255]. Bagaimana cara mendeteksi warna-warna komposit yang bukan merupakan warna dasar seperti kuning, jingga, dan lain-lain? Postingan kali ini sedikit menjelaskan cara mendeteksinya dengan menggunakan jarak Euclidean.

Standar Warna RGB

Standar warna RGB banyak diterapkan pada image processing. Standar ini menggunakan warna merah, hijau dan biru sebagai patokan warna-warna lainnya. Warna lainnya dapat dibuat dengan menggabungkan proporsi warna merah, hijau, dan biru tersebut. Berikut standar warna selain merah, hijau, dan biru.

Tabel di atas juga menyertakan paduan standar Cyan, Magenta, Yelow, dan Black (CMYK) dan HSV. Sebagai kelanjutan Pert 6 yang lalu, di sini kita menerapkan deteksi warna dengan jarak Euclidean.

Praktek dengan GUI

Tambahkan kode tambahan di tombol deteksi warna (Euclidean) karena bukan hanya R, G, dan B, melainkan beberapa warna lain misalnya kuning, oranye, dan hitam.

Tambahkan tiga jarak baru yaitu dY, dO, dan dK untuk jarak terhadap kuning, oranye dan hitam. Untuk memudahkan penentuan jarak terdekat gunakan fungsi min disertai dengan indeksnya. Indeks dapat diketahui dengan membuat sebuah vektor berisi warna-warna dari merah hingga hitam. Sehingga ketika nilai minimum diketahui, diketahui pula indeksnya. Warna dapat diketahui berdasarkan indeks-nya dari vektor warna.


  • dR=norm(warna-[255 0 0])
  • dH=norm(warna-[0 255 0])
  • dB=norm(warna-[0 0 255])
  • dY=norm(warna-[255 255 0])
  • dO=norm(warna-[255 127 0])
  • dK=norm(warna-[0 0 0])
  • hasil=[dR dH dB dY dO dK]
  • % mencari jarak terkecil
  • strwarna={‘merah’
    ‘hijau’
    ‘biru’
    ‘kuning’
    ‘jingga’
    ‘hitam’}

  • [minimum,indeks]=min(hasil)
  • outwarna=strwarna(indeks)
  • set(handles.edit4,‘String’,outwarna)

Coba uji dengan memasukan data sesuai warnanya, misalnya kuning, oranye dan hitam. Coba uji pula dengan warna yang tidak terlalu hitam (abu-abu), atau tidak terlalu kuning. Sistem akan mencoba mendekati dengan warna-warna standar yang ada (R,G,B, plus kuning, orange dan hitam). Semoga bermanfaat.

Deteksi Warna dengan Jarak Euclidean

[peng.citra|t.kom|lab.hardware|pert.6]

Sistem cerdas membutuhkan teknik agar peralatan dapat membedakan satu warna dengan warna lainnya. Teknik termurah dan termudah adalah dengan jarak Euclidean. Perhitungannya menggunakan rumus jarak dua titik koordinat (dua, tiga, dan dimensi-n) yang mirip garis miring Phytagoras. Sebagai kelanjutan dari pertemuan 5 yang lalu, tambahkan tombol pushbutton disertai edit text untuk melihat komposisi RGB sebuah citra.

Agar ukuran dan format sama dengan tombol-tombol yang lain, kita boleh meng-copy paste tombol dan isian lainnya. Jika sudah simpan dan tambahkan tiga buah warna yang akan diuji. Buat saja dengan menggunakan paint pada Windows. Simpan dalam format JPG agar lebih mudah karena kebanyakan citra dibuat dalam format ini.

Mencari Nilai Terbesar RGB

Salah satu teknik termudah menebah warna sebuah citra adalah dengan mencari nilai terbesar. Cara ini tentu banyak kelemahannya, khususnya untuk warna komposit (gabungan) seperti kuning, ungu, orange, dan lain-lain. Namun, teknik ini tetap digunakan ketika menggunakan jarak Euclidean, tetapi menggunakan fungsi mencari nilai terkecil (kebalikannya). Kode berikut diletakan di Callback deteksi warna.

  • fR=handles.y(:,:,1);
  • fG=handles.y(:,:,2);
  • fB=handles.y(:,:,3);
  • fr=mean(mean(fR));
  • fg=mean(mean(fG));
  • fb=mean(mean(fB));
  • % mencari terbesar
  • warna=[fr fg fb]
  • strwarna={‘merah’ ‘hijau’ ‘biru’}
  • [maks,indeks]=max(warna)
  • outwarna=strwarna(indeks)
  • set(handles.edit4,’String’,outwarna)
  • set(handles.edit5,’String’,fr)
  • set(handles.edit6,’String’,fg)
  • set(handles.edit7,’String’,fb)

fR, fG dan fB adalah berturut-turut matriks citra merah, hijau dan biru. Sementara fr, fg, dan fb nilai rata-rata ekstrak warna dari citra. Perhatikan bagian % mencari nilai terbesar b di atas. Di sini digunakan fungsi max. Fungsi set di akhir fungsi mengirim jawaban yang merupakan warna yang ditebak oleh sistem ke edit text4 dalam contoh ini.

Menggunakan Jarak Euclidean

Jarak Euclidean lebih “ampuh” karena mampu mendeteksi warna komposit dengan menghitung jaraknya dari warna-warna yang jadi patokan/kelas. Sebagai latihan, patokannya misal dianggap sama yaitu merah, hijau dan biru. Pada prakteknya bisa saja merah, kuning dan hijau seperti lampu lalu-lintas.

Tambahkan satu tombol pushbutton “Deteksi Warna (Euclidean)” untuk membedakan dengan tombol sebelumnya yang hanya menggunakan nilai maksimal RGB.

Sebagai ilustrasi, nilai X tentu saja dengan nilai terbesar akan ditebak masuk kategori R. Tetapi di sini kita menghitung terlebih dahulu jaraknya terhadap R, G, dan B lalu dibandingkan mana jarak terkecilnya. Rumus Euclidean adalah mirip sisi miring Phytagoras:

Silahkan menggunakan rumus di atas, atau bisa menggunakan fasilitas fungsi norm pada Matlab yang artinya “normal Euclidean”. Berbeda dengan fungsi max untuk mencari nilai maksimum, untuk mencari nilai minimum dapat menggunakan fungsi min. Ok, masukan kode ini pada tombol “Deteksi Warna (Euclidean)”.

  • warna=[fr fg fb]
  • dR=norm(warna-[255 0 0])
  • dH=norm(warna-[0 255 0])
  • dB=norm(warna-[0 0 255])
  • hasil=[dR dH dB]
  • % mencari jarak terkecil
  • strwarna={‘merah’ ‘hijau’ ‘biru’}
  • [minimum,indeks]=min(hasil)
  • outwarna=strwarna(indeks)
  • set(handles.edit4,’String’,outwarna)
  • set(handles.edit5,’String’,fr)
  • set(handles.edit6,’String’,fg)
  • set(handles.edit7,’String’,fb)

Uji dengan me-run GUI yang baru saja diisi kode-nya. Pastikan sistem bisa menebak warna. Selamat Ber-praktikum.

Deteksi Tepi dengan Matlab

[peng.citra|t.kom|lab.hardware|pert.5]

Di antara deteksi lainnya, seperti titik dan garis, deteksi tepi sangat bermanfaat untuk mengetahui suatu objek secara pasti dan terpisah dari objek lainnya, misalnya background. Pertemuan kali ini sedikit membahas metode-metode deteksi tepi yang terkenal antara lain: sobel, prewitt, dan robert. Untuk itu lanjutkan proyek sederhana pertemuan yang lalu dengan menambahkan satu panel berisi tiga pushbutton: sobel, prewitt, dan robert.

Konversi ke Gray

Deteksi tepi bermain dengan intensitas brightness. Ketika langsung mengakses gambar berwarna RGB ada pesan kesalahan. Perlu merubah terlebih dahulu citra yang diambil dari pushbutton “Ambil Citra” menjadi gray. Copas saja kode pada tombol “Konversi ke Gray” dan masukan ke “Sobel”.

  • z=rgb2gray(handles.y);
  • [g,t]=edge(z,’sobel’)
  • axes(handles.axes2)
  • imshow(g)

Silahkan lihat tatacara penggunaan fungsi edge dengan mengetik “help edge” pada command window. Untuk metode Prewitt dan Robert, caranya sama hanya saja menggunakan parameter berturut-turut ‘prewitt’ dan ‘robert’.

Perhatikan ada noise yang tertangkap. Biasanya sebelum deteksi tepi beberapa manipulasi terhadap citra original-nya diperlukan, misalnya filter dengan fungsi imfilter. Selamat mencoba, semoga bermanfaat.

Melakukan Cropping Pada Citra

[peng.citra|t.komputer|lab.hardware|pert.4]

Terkadang untuk menangkap secara detil suatu permukaan diperlukan proses pemotongan/cropping. Sebagai contoh, lanjutan dari pertemuan 3 yang lalu, tambahkan satu tombol Crop Gambar.

Jika tombol “Crop Gambar” ditekan maka gambar hasil cropping akan ditampilkan pada axes2 di sebelah kanan. Dan jika tombol “Ekstrak Citra R-G-B” ditekan akan menghasilkan harga-harga R,G, dan B yang sudah ternormalisasi di tiga edit text di atasnya.

Cropping Image Pada Matlab

Pada Matlab, fungsi cropping dengan menggunakan fasilitas fungsi imcrop. Silahkan tekan “help imcrop” di command window untuk mengetahui format penulisan fungsi tersebut di kode yang akan dibuat.

  • x=uigetfile(‘*.jpg’);
  • data=imread(x);
  • size(data)
  • ans =
  • 423 644 3

Perhatikan ukuran data citra yang dibaca (lewat imread). Jika kita bayangkan dengan koordinat kartesians, maka panjangnya adalah 644 dan lebarnya adalah 423. Untuk panjang tidak masalah karena arahnya dari kiri ke kanan, hanya saja untuk lebar sedikit berbeda dengan koordinat kartesian. Di sini positif ke arah bawah. Jadi titik tengah gambar tersebut adalah panjang 322 dan lebar 211. Jika ingin mengambil lebar 50 dan panjang juga 50 maka region tersebut dari titik (297, 186) dan offset sebesar masing-masing 50 piksel. Masukan fungsi imcrop untuk memotong gambar.

  • >> data2=imcrop(data,[297 186 50 50]);
  • >> imshow(data2)

Perhatikan format penulisan cropping dimana dua angka terakhir merupakan offset dari titik dimana posisi awal crop dimulai. Untuk mengekstrak citra RGB silahkan gunakan kode di pertemuan 3 yang lalu. Selamat mencoba, semoga bermanfaat.

Menghitung Nilai RGB Sebuah Citra

[peng.citra.digital|tek.komputer|lab.software|pert.4]

Nilai RGB merupakan format pewarnaan yang paling banyak digunakan. Format ini menangkap warna merah (red), hijau (green) dan biru (blue) suatu citra. Dengan komposisi tiga warna tersebut dapat dibuat beragam spektrum warna lainnya. Postingan kali ini akan dibahas bagaimana mengekstrak nilai R, G, dan B suatu citra.

Format RGB

Letakan current directory pada folder di mana citra berada. Kemudian lanjutkan dengan menarik suatu gambar bertipe jpg, png, bmp dan lain-lain. Format RGB suatu citra dapat diketahui dengan fungsi size dan menghasilkan format:

(baris) (kolom) (rgb)

Untuk contoh penerapan dapat menggunakan instruksi berikut ini:

  • [1] x=uigetfile(‘*.jpg*’);
  • [2] data=imread(x);

Misalnya dengan mengetik instruksi size(data) diperoleh hasil:

1150         1427          3

Kolom ke-3 mengindikasikan tiga komposisi warna (merah, hijau, dan biru).

Mengekstrak R, G, dan B

Untuk mengetahui komposisi warna (RGB) dapat dengan cara mengakses data yang dibaca lewat fungsi imread mengikuti indeks kolom 3 apakah 1 (untuk red), 2 (untuk green) dan 3 (untuk blue).

  • [3] fR=data(:,:,1);
  • [4] fG=data(:,:,2);
  • [5] fB=data(:,:,3);

 

Tingkat R, G, dan B

Untuk mengetahui tingkat merah, hijau, dan biru secara total dapat mencari nilai rata-rata lewat fungsi mean. Line [6] – [8] bermaksud menghitung rata-rata masing-masing kelas warna. Dua buah fungsi mean dibutuhkan untuk menghitung total baris dan kolom. Line [9] – [11] bermaksud menormalkan tingkat warna dengan jangkauan 0 hingga 1.

  • [6] fr=mean(mean(fR));
  • [7] fb=mean(mean(fG));
  • [8] fc=mean(mean(fB));
  • [9] frr=fr/255;
  • [10]fbb=fb/255;
  • [11]fcc=fc/255;

Contoh GUI Menghitung Tingkat RGB

Untuk memudahkan, terkadang perlu dibuat GUI agar lebih mudah mencari nilai RGB suatu citra. Contohnya adalah rancangan berikut. Gunakan fungsi tambahan set untuk mengirim hasil perhitungan rgb (nilai RGB yang sudah dinormalkan).


  • [12] set(handles.edit1,‘String’,frr)
  • [13] set(handles.edit2,‘String’,fbb)
  • [14] set(handles.edit3,‘String’,fcc)

Jalankan dan lihat hasilnya seperti di bawah (nilai dari atas ke bawah menunjukkan masing-masing R, G, dan B). Padukan dengan fungsi lain seperti imcrop untuk memotong citra agar tidak masuk di dalamnya background, dibahas pada pertemuan yang lain. Semoga bermanfaat.