Fixing: “Warning: Single line Edit Controls can not have multi-line text”

[inf.retrieval|t.komputer|lab.soft|pert.8]

This problem appears when someone tries to send the result to edit text. The warning is shown in command window and the edit text in GUI is also disappeared. First we should understand that Matlab has two kinds of text format: string and cell. The cell cannot be presented, except you transpose it. But the edit text will show the text in column based. Only the string/char format can be presented in row based (see the picture below showing the string and cell).

Some text processing methods need conversion from string to cell. Therefore, the manipulation should be done in order to show the text in edit text. The algorithm are as follow:

  • Input: cell
  • Output: string in row
  • Use function char to convert cell into character
  • Transpose the characters
  • Use function sprintf to print the characters in row based

This simple method can be solve the warning above. As an impormation, some text manipulation need conversion from cell to char and vice versa, e.g. regexp (regular expression function). I hope this information is useful. This is an output when I stemmed to remove preffix (‘ber’) except when the root-word below 4 characters (e.g. “dua” from “berdua”)

Iklan

Stemming Pada Matlab

[per.informasi|t.komputer|lab.soft|pert.5]

Jika pada pertemuan sebelumnya telah berhasil memisahkan kata-kata dalam suatu kalimat agar bisa menghitung jumlah katanya maka pada pertemuan kali ini akan mencoba memisahkan kata dari imbuhan (awalan dan akhiran) agar diperoleh kata dasarnya yang dikenal dengan istilah stemming/lematization. Proses ini sangat penting dalam perancangan mesin pencari (searching). Imbuhan merupakan ciri khas bahasa Indonesia yang memang berbeda sekali dengan bahasa Inggris. Coba rancang GUI berikut untuk melakukan proses stemming.

Imbuhan ada banyak misalnya me, meng, ber, per, -an, dan lain-lain. Untuk memisahkannya kita perlu memproses pencarian berdasarkan spasi dan titik (untuk akhiran). Jika tanpa spasi akan terjadi kesalahan karena sistem akan mereplace seluruh yang diduga awalan/akhiran walau terletak di tengah-tengah kata yang tentu saja salah.

  • % menghilangkan “-an”
  • y=regexprep(y,‘an+\s’,‘ ‘) % sebelum spasi
  • y=regexprep(y,‘an+\.’,‘.’) % sebelum titik
  • set(handles.edit1,‘String’,y)

Kode di atas bermaksud menghilangkan akhiran –an. Jika diinput kata “akhiran.” Akan dihasilkan kata dasarnya “akhir”. Ada dua deteksi yaitu sebelum spasi dan sebelum titik.

Logika sederhananya adalah mengganti “-an” tersebut dengan “blank”. Fungsi yang digunakan adalah regexprep yang mencari dan me-replace suatu string. Pertemuan berikutnya akan menggunakan proses perhitungan karakter tertentu, misalnya “makan”, tidak bisa jadi “mak” karena kurang dari 4 karakter. Selain itu perlu proses N-gram (dua, tiga, dst). Selamat mencoba, semoga UTS dapat dikerjakan dengan baik.

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.

Menampilkan Matriks Pada GUI Matlab

Biasanya output ditampilkan pada GUI dengan memanfaatkan Edit Text. Namun jika data yang dihasilkan lebih dari satu maka pada Edit Text tersebut tidak muncul angka/hasil perhitungannya. Salah satu hasil perhitungan yang lebih dari satu angka adalah Matriks. Postingan ini sekedar menginformasikan bagaimana menampilkan matriks pada GUI yang kita buat.

Komponen Uitable

Misal kita memiliki satu matriks berukuran 2×2 yang akan ditampilkan dalam suatu GUI. Setelah sebuah matriks dimasukan, maka gunakan fungsi set untuk mengirimkan ke komponen uitable. Ketik kode berikut:

  • >> a=[1 2 ;3 4];
  • >> figure
  • >> t=uitable;
  • >> set(t,’Data’,a)

Akan dihasilkan sebuah matriks dalam GUI berikut ini:

    

Selanjutnya data yang ditampilkan pada Matriks di GUI bisa berupa hasil perhitungan Matlab. Sebagai contoh GUI di bawah ini menampilan matriks confusion saat testing. Semoga postingan singkat ini 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.