Saturday, December 31, 2016

Bab 2. Pemrosesan Citra Digital Menggunakan MATLAB


2
Pemrosesan Warna




2.1 Mengkonversi Ruang Warna


Toolbox MATLAB secara otomatis menggunakan ruang warna RGB (red, green, blue) dalam merepresentasikan warna. Namun, masih ada ruang warna lain yang pada kondisi-kondisi tertentu lebih sesuai digunakan daripada ruang warna RGB. Ruang-ruang warna tersebut adalah NTSC, YCbCr, HSV, CMY, CMYK, dan HSI. Toolbox menyediakan fungsi-fungsi untuk mengkonversi dari RGB menjadi NTSC, YCbCr, HSV, dan CMY, dan sebaliknya. Fungsi untuk mengkonversi ruang warna dari RGB menjadi HSI dan sebaliknya silahkan dikembangkan sendiri.


2.2 Ruang Warna NTSC


Sistem warna NTSC dipakai oleh televisi di Amerika Serikat. Salah satu keuntungannya adalah bahwa informasi keabuan terpisah dari data warna, sehingga sinyal yang sama dapat dipakai untuk televisi monokrom atau warna. Dalam format NTSC, data memuat tiga komponen; komponen luminance (Y), komponen hue (I), dan komponen saturation (Q), dimana pemilihan huruf YIQ adalah berdasarkan konvensional. Komponen Y merepresentasikan data keabuan dan kedua komponen lainnya merepresentasikan data warna atas suatu sinyal televisi. Komponen YIQ dapat diperoleh dari komponen RGB menggunakan transformasi:








Perhatikan bahwa elemen-elemen pada baris pertama berjumlah 1 dan penjumlahan elemen-elemen pada dua baris lainnya adalah 0. Hal ini karena untuk suatu citra abu-abu semua komponen RGB bernilai sama, sedangkan komponen I dan Q bernilai 0. Fungsi rgb2ntsc disediakan MATLAB untuk melakukan transformasi ini, dengan sintaks:

YIQ = rgb2ntsc(RGB)

dimana citra masukan RGB bertipe uint8, uint16, atau double. Citra keluaran adalah suatu array berukuran m x n x 3 bertipe class double. Komponen Y adalah YIQ(:,:,1), komponen I adalah YIQ(:,:,2), dan komponen Q adalah YIQ(:,:,3).


Dengan cara yang sama, komponen RGB dapat diperoleh dari komponen YIQ menggunakan transformasi:



Fungsi ntsc2rgb disediakan MATLAB untuk melakukan transformasi ini, dengan sintaks:

RGB = ntsc2rgb (YIQ)

Perhatikan bahwa kedua matriks transformasi tersebut saling berketerbalikan. Proses konversi RGB menjadi YIQ dan kembali lagi menjadi RGB dituliskan dalam skript MATLAB berikut ini:

RGB = imread('board.tif'), imshow(RGB);
NTSC = rgb2ntsc(RGB), imshow(NTSC);
RGB2 = ntsc2rgb(NTSC), imshow(RGB2);

Hasilnya ditampilkan pada Gambar 2.1. Perhatikan bahwa RGB adalah RGB2.


Gambar 2.1 Konversi RGB menjadi NTSC dan kembali lagi menjadi RGB


2.3 Ruang Warna YCbCr

Ruang warna YCbCr sangat luas digunakan di dalam video. Dalam format ini, informasi luminance direpresentasikan oleh komponen Y, dan informasi warna disimpan pada komponen Cb dan Cr. Komponen Cb merupakan selisih antara komponen blue dengan suatu nilai referensi, dan komponen Cr adalah selisih antara komponen red dengan suatu nilai referensi. Transformasi untuk mengkonversi RGB menjadi YCbCr adalah




Fungsi konversi YCBCR = rgb2ycbcr(RGB) disediakan MATLAB, dengan sintaks:

YCBCR = rgb2ycbcr(RGB)

Hasil konversi RGB menjadi YCBCR ditampilkan pada Gambar 2.2 berikut ini.




Gambar 2.2 Konversi RGB menjadi YCbCr


2.4 Ruang Warna HSV

HSV (hue, saturation, value) merupakan salah satu sistem warna yang digunakan manusia dalam memilih warna (cat atau tinta). Sistem ini dipandang lebih dekat daripada sistem RGB dalam mendeskripsikan sensasi warna oleh mata manusia. Dalam terminologi yang dianut para seniman, hue, saturation, dan value berkaitan dengan tint, shade, dan tone. Perhatikan ruang warna sistem HSV yang direpresentasikan pada Gambar 2.3.


Gambar 2.3 Representasi sistem warna HSV


Perhatikan bahwa bila R, G, dan B bernilai sama, maka warna menjadi keabuan; yaitu, intensitas putih. Warna seperti itu, yang memuat hanya warna putih, akan memiliki nilai saturation nol. Sebaliknya, jika nilai-nilai RGB benar-benar berbeda, maka warna yang dihasilkan akan memiliki nilai saturation yang tinggi. Dapat diamati bahwa jika salah satu dari nilai-nilai RGB bernilai nol, maka saturation akan 1.

Hue didefinisikan sebagai nilai-nilai pecahan di sekitar lingkaran dimulai dari red, yang memiliki hue bernilai nol. Dengan membaca lingkaran pada Gambar 2.3 akan menghasilkan nilai-nilai hue sebagai berikut:



yang dinormalisasi dengan 255 terlebih dahulu. Kemudian dapat didefinisikan:






























Konversi ini diimplementasikan dalam MATLAB menggunakan fungsi rgb2hsv. Fungsi ini tentu saja didesain untuk suatu array berukuran m x n x 3, tetapi dalam kasus ini hanya diinginkan untuk membuktikan hasil hitungan di atas saja:

rgb2hsv([0.2 0.4 0.6])
ans =

    0.5833    0.6667    0.6000

dan dihasilkan nilai HSV sama dengan yang telah dihitung secara manual. Untuk menghitung nilai-nilai HSV menjadi RGB, didefinisikan:































2.5 Citra Warna Dalam MATLAB

Karena suatu citra berwarna memerlukan tiga item informasi terpisah untuk setiap pikselnya, suatu citra berwarna berukuran m x n direpresentasikan dalam MATLAB oleh suatu array berukuran m x n x 3: suatu array tiga dimensi. Array tiga dimensi ini bisa dipandang sebagai suatu entitas tunggal yang memuat tiga matriks terpisah secara vertikal. Gambar 2.4 menunjukkan suatu diagram yang mengillustrasikan ide ini. 

Suatu citra RGB dibaca dengan:

>> x=imread('wanita.tif');
>> size(x)
ans =
   256   256     3

Setiap komponen warna dapat diisolasi menggunakan operator titik-dua:
x(:,:,1) komponen warna pertama (Red/merah)
x(:,:,2) komponen warna kedua (Green/hijau)
x(:,:,3) komponen warna ketiga (Blue/biru)

Gambar 2.4 Suatu array tiga dimensi untuk suatu citra RGB

Ketiganya dapat dilihat menggunakan fungsi imshow:

figure,imshow(x(:,:,1))
figure,imshow(x(:,:,2))
figure,imshow(x(:,:,3))

Semuanya ditampilkan pada Gambar 2.5. Dapat diperhatikan bahwa topi wanita dalam citra tersebut lebih terang pada komponen red dan lebih gelap pada komponen green dan blue. Pada umumnya komponen green dan blue memiliki nilai-nilai intensitas yang lebih rendah dibandingkan dengan komponen red.

Gambar 2.5 Suatu citra RGB dan komponen-komponennya

Anda bisa mengkonversi RGB menjadi ruang warna YIQ atau HSV dan melihat komponen-komponennya kembali:

xh=rgb2hsv(x);
figure,imshow(x(:,:,1))
figure,imshow(x(:,:,2))
figure,imshow(x(:,:,3))

yang ditampilkan pada Gambar 2.6. Anda bisa melakukan hal yang sama untuk ruang warna YIQ:

Gambar 2.6 Komponen-komponen HSV


xn=rgb2ntsc(x);
imshow(xn(:,:,1))
figure,imshow(xn(:,:,2))
figure,imshow(xn(:,:,3))

yang ditampilkan pada Gambar 2.7. Perhatikan bahwa komponen Y dari ruang warna YIQ memberikan suatu versi keabuan dari citra daripada komponen Value dari ruang warna HSV.

Gambar 2.7 Komponen-komponen ruang warna YIQ


2.6 Pewarnaan-Semu (Pseudocoloring)

Hal ini berarti bahwa penugasan warna kepada suatu citra abu-abu untuk membuat aspek-aspek tertentu dari citra tersebut lebih nyaman dipandang untuk kepentingan interpretasi visual, misalnya untuk citra medik. Terdapat beberapa metode pewarnaan-semu.

Pengirisan Intensitas

Dalam metode ini, citra dipecah-pecah menjadi berbagai rentang nilai keabuan. Yang dilakukan selanjutnya hanyalah menugaskan warna tertentu untuk tiap rentang yang telah diiris. Misalnya,


Pengirisan intensitas ini dipandang sebagai pemetaan, yang digambarkan pada Gambar 2.8.

Gambar 2.8 Pengirisan intensitas sebagai pemetaan


Transformasi Keabuan Warna

Dimiliki tiga fungsi , dan  yang menugaskan nilai-nilai red, green, dan blue kepada setiap level keabuan . Nilai-nilai ini (dengan penskalaan yang sesuai, jika diperlukan) kemudian digunakan untuk penampilan citra. Dengan menggunakan himpunan fungsi-fungsi yang sesuai, maka suatu citra abu-abu dapat ditingkatkan menjadi lebih baik, seperti yang ditampilkan pada Gambar 2.9.

Gambar 2.9 Tiga fungsi transformasi keabuan-warna


Level keabuan  dipetakan menjadi nilai-nilai red, green, dan blue berturut-turut sebesar 0.375, 0.125, dan 0.75. Dalam MATLAB, cara sederhana untuk melihat suatu citra dengan warna yang telah ditambahkan adalah dengan menggunakan fungsi imshow dengan parameter tambahan colormap. Misalnya, diambil citra lena.png. Anda bisa menambahkan fungsi colormap; terdapat beberapa peta warna dalam MATLAB yang bisa dipilih.

Gambar 2.10 menampilkan citra lena.png setelah mengalami transformasi warna. Gambar 2.10a didapatkan dengan skript MATLAB:

b=imread('lena.png');
imshow(b,colormap(jet(256)))

Tetapi pemilihan peta warna dapat merusak citra tersebut. Citra pada Gambar 2.10b adalah contohnya, yang menggunakan peta warna vga.
Karena hanya memiliki 16 baris, maka level keabuan citra direduksi menjadi 16 rentang saja. Hal ini dilakukan menggunakan fungsi grayslice:

b16=grayslice(b,16);
figure,imshow(b16,colormap(vga))

Gambar 2.10 Menerapkan suatu peta warna terhadap citra abu-abu


Anda bisa memeriksa peta-peta warna yang disediakan MATLAB dengan cara mengetikkan help graph3d:

Color maps.
    hsv        - Hue-saturation-value color map.
    hot        - Black-red-yellow-white color map.
    gray       - Linear gray-scale color map.
    bone       - Gray-scale with tinge of blue color map.
    copper     - Linear copper-tone color map.
    pink       - Pastel shades of pink color map.
    white      - All white color map.
    flag       - Alternating red, white, blue, and black color map.
    lines      - Color map with the line colors.
    colorcube  - Enhanced color-cube color map.
    vga        - Windows colormap for 16 colors.
    jet        - Variant of HSV.
    prism      - Prism color map.
    cool       - Shades of cyan and magenta color map.
    autumn     - Shades of red and yellow color map.
    spring     - Shades of magenta and yellow color map.
    winter     - Shades of blue and green color map.
    summer     - Shades of green and yellow color map.

Ada penjelasan atas tiap peta warna yang disediakan MATLAB. Sebagai contoh, anda bisa mengetikkan help hsv, akan memberikan penjelasan tentang peta warna hsv.

Anda juga bisa menciptakan peta warna sendiri; peta tersebut harus berupa suatu matriks dengan 3 kolom, dimana setiap baris memuat nilai-nilai RGB dari 0.0 sampai 1.0. Misalnya diinginkan untuk menciptakan suatu peta warna blue, magenta, green, dan red seperti yang ditunjukkan pada Gambar 2.8. Menggunakan nilai-nilai RGB:


Peta warna sendiri bisa diciptakan dengan:

petawarnaku=[0 0 1;1 0 1;0 1 0;1 0 0];

Sebelum memakai peta warna tersebut, citra masukan perlu diskalakan sehingga hanya terdapat empat nilai keabuan 0, 1, 2, dan 3:

b4=grayslice(b,4);
imshow(b4,petawarnaku)

Hasilnya ditampilkan pada Gambar 2.11.

Gambar 2.11 Suatu citra abu-abu yang diwarnai secara manual menggunakan peta warna sendiri.


2.7 Pemrosesan Citra Warna

Ada dua cara memproses citra berwarna:
  • Memproses matriks R, G, dan B secara terpisah.
  • Mentransformasi ruang warna menjadi satu dimana intensitas dipisahkan dari warna, dan kemudian memproses komponen intensitas saja.
  • Kedua skema ini berturut-turut ditampilkan pada Gambar 2.12. Berikut akan didiskusikan beberapa kasus pemrosesan citra berwarna dan menerapkan kedua skema tersebut.

Peningkatan Kontrast
Hal ini paling baik dilakukan dengan pemrosesan intensitas. Diberikan suatu citra yamaguchi.bmp dan dibaca dengan:

c=imread('yamaguchi.bmp');

Sekarang citra RGB tersebut dikonversi menjadi YIQ untuk memisahkan komponen intensitasnya:

cn=rgb2ntsc(c);

Sekarang dilakukan ekualisasi histogram terhadap komponen intensitas tersebut, kemudian dikonversi kembali menjadi RGB untuk ditampilkan:

cn(:,:,1)=histeq(cn(:,:,1));
c2=ntsc2rgb(cn);
imshow(c2)

Gambar 2.12 (a) Pemrosesan RGB; (b) Pemrosesan intensitas

Hasilnya ditampilkan pada Gambar 2.13a. Apakah hasil yang ditampilkan lebih baik masih bisa diperdebatkan, tetapi yang pasti terjadi adalah peningkatan kontras.

Jika dilakukan ekualisasi histogram terhadap tiap komponen RGB:
cr=histeq(c(:,:,1));
cg=histeq(c(:,:,2));
cb=histeq(c(:,:,3));

Sekarang hasil di atas disatukan kembali menjadi suatu array tiga dimensi dan kemudian ditampilkan menggunakan fungsi imshow, dan hasilnya ditampilkan pada Gambar 2.13b:

c3=cat(3,cr,cg,cb);
imshow(c3)


Gambar 2.13 Ekualisasi histogram atas suatu citra berwarna


Pemilteran Spasial

Kasus pemilteran spasial sangat bergantung pada jenis filter yang digunakan untuk menentukan skema mana yang lebih tepat dipakai. Untuk suatu filter lowpass, katakanlah filter pengabur, anda dapat menggunakannya pada setiap komponen RGB:

a15=fspecial('average',15);
cr=filter2(a15,c(:,:,1));
cg=filter2(a15,c(:,:,2));
cb=filter2(a15,c(:,:,3));
blur=cat(3,cr,cg,cb);
imshow(uint8(blur))

Hasilnya ditampilkan pada Gambar 2.14a. Anda bisa mendapatkan hasil yang hampir sama bila memprosesnya dengan pemrosesan intensitas. Tetapi untuk suatu filter highpass, seperti filter unsharp masking, lebih baik digunakan pemrosesan intensitas saja:

cn=rgb2ntsc(c);
a=fspecial('unsharp');
cn(:,:,1)=filter2(a,cn(:,:,1));
cu=ntsc2rgb(cn);
imshow(cu)

dan hasilnya ditampilkan pada Gambar 2.14b. Pada umumnya, pemilteran spasial yang dilakukan dengan pemrosesan intensitas akan menghasilkan keluaran yang cukup baik. Meskipun kadang-kadang pemilteran spasial dilakukan terhadap setiap komponen RGB, seperti pemilteran lowpass pengabur yang telah dilakukan, namun tidak ada jaminan bahwa yang akan dihasilkan berkualitas baik. Masalahnya adalah pemilteran akan mempengaruhi setiap nilai piksel pada tiap komponen RGB, dan hal ini dapat menghasilkan warna-warna yang tidak diinginkan.

Gambar 2.14 Pemilteran spasial atas suatu citra berwarna


Penekanan Derau
Seperti yang telah dilakukan sebelumnya, berikut dilakukan penekanan derau atas suatu citra berwarna:

tw=imread('rismon.tif');

Derau salt and pepper dapat ditambahkan, dan setiap komponen RGBnya dapat ditampilkan sebagai berikut:

tn=imnoise(tw,'salt & pepper');
imshow(tn)
figure,imshow(tn(:,:,1))
figure,imshow(tn(:,:,2))
figure,imshow(tn(:,:,3))

Semuanya ditampilkan pada Gambar 2.15. Kelihatannya diperlukan pemilteran median terhadap tiap komponen RGB yang dihasilkan. Hal ini dapat dengan mudah dilakukan:

trm=medfilt2(tn(:,:,1));
tgm=medfilt2(tn(:,:,2));
tbm=medfilt2(tn(:,:,3));
tm=cat(3,trm,tgm,tbm);
imshow(tm)

dan hasilnya ditampilkan pada Gambar 2.16. Dalam kasus penekanan derau, tidak bisa hanya dilakukan pada komponen Y saja, karena konversi RGB menjadi YIQ akan menyebarkan derau ke semua komponen YIQ. Jika derau pada komponen Y saja yang ditekan:

tnn=rgb2ntsc(tn);
tnn(:,:,1)=medfilt2(tnn(:,:,1));
tm2=ntsc2rgb(tnn);
imshow(tm2)


Gambar 2.15 Derau pada suatu citra berwarna


dan derau tertekan kurang signifikan, seperti tertampil pada Gambar 2.16. Jika derau hanya pada salah satu komponen RGB, maka metode penekanan derau dengan pemrosesan intensitas akan cocok.


Gambar 2.16 Percobaan penekanan derau pada suatu citra berwarna


Deteksi Tepi
Suatu tepi citra merupakan citra biner yang memuat tepi-tepi citra masukan. Ada dua cara untuk mendapatkan tepi citra berwarna:

  • Mengambil hanya komponen intensitas saja, dan kemudian menerapkan fungsi edge terhadapnya.
  • Menerapkan fungsi edge pada tiap komponen RGB, kemudian hasil-hasilnya disatukan kembali.

Untuk menerapkan metode pertama, perlu dipakai fungsi rgb2gray sebagai berikut:

f=imread('wanita.tif');
fg=rgb2gray(f);
fe1=edge(fg);
imshow(fe1)

Ingat bahwa fungsi edge tanpa parameter berarti deteksi tepi Sobel. Hasil yang diperoleh ditampilkan pada Gambar 2.17. Untuk metode kedua, hasil-hasil yang diperoleh dapat disatukan kembali menggunakan logika or:

f1=edge(f(:,:,1));
f2=edge(f(:,:,2));
f3=edge(f(:,:,3));
fe2=f1 | f2 | f3;
figure,imshow(fe2)

dan juga ditampilkan pada Gambar 2.17. Citra tepi fe2 lebih tampak lebih lengkap daripada citra tepi fe1.



Gambar 2.17 Tepi-tepi suatu citra berwarna



No comments: