Sunday, December 25, 2016

Bab 1. Pemrosesan Citra Digital Menggunakan MATLAB



Pengantar Citra Digital



Pemrosesan tetangga adalah operasi dalam pemrosesan citra digital untuk mengubah level keabuan atas suatu piksel dimana dibutuhkan nilai-nilai level keabuan pada piksel-piksel tetangga di sekitar piksel tersebut. Sedangkan pemrosesan titik adalah operasi dalam pemrosesan citra digital untuk mengubah level keabuan atas suatu piksel dimana tidak dibutuhkan pemahaman tentang nilai-nilai keabuan piksel-piksel tetangganya. Kedua jenis pemrosesan ini akan ditinjau dan didiskusikan.

1.1 Operasi Aritmatika


Operasi-operasi ini dilakukan hanya dengan menerapkan suatu fungsi




terhadap setiap nilai piksel pada suatu citra. Jadi,  merupakan suatu fungsi yang memetakan rentang 0 sampai 255 ke dalam dirinya sendiri. Fungsi-fungsi sederhana termasuk penjumlahan atau pengurangan suatu nilai konstan terhadap setiap piksel:




atau mengalikan setiap piksel dengan suatu konstan:
 



Gambar 1.1 (a) Penjumlahan 128 ke setiap piksel; (b) Pengurangan 128 dari setiap piksel


Pada ketiga kasus operasi aritmatika ini, anda perlu memastikan bahwa keluaran harus berada dalam rentang integer 0 sampai 255, dengan cara pembulatan seperti ini:



Gambar 1.1 di bawah ini mengillustrasikan hasil penjumlahan atau pengurangan 128 dari setiap piksel pada suatu citra. Perhatikan bahwa ketika 128 ditambahkan ke setiap piksel, semua nilai-nilai keabuan 127 atau lebih besar akan dipetakan menjadi nilai 255. Dan ketika mengurangkan 128 dari setiap piksel, nilai-nilai keabuan 128 atau kurang akan dipetakan menjadi nilai 0. Dengan melihat kedua grafik pemetaan tersebut, dapat diamati bahwa penjumlahan citra dengan suatu konstan akan membuat citra lebih terang, sedangkan pengurangan akan membuatnya lebih gelap.

Anda bisa membuktikan hal ini dengan MATLAB, didahului dengan membaca suatu citra:

>> b=imread('bintik.tif');
>> whos b
  Name      Size                    Bytes  Class

Penjumlahan dan pengurangan citra dapat dilakukan dengan:

>> b1=imadd(b,128); imshow(b1)
>> b2=imsubtract(b,128); imshow(b2);

dan hasilnya ditampilkan pada Gambar 1.2.

Gambar 1.2 Hasil penjumlahan dan pengurangan citra

Anda juga bisa membuat citra menjadi gelap atau terang dengan perkalian. Pada Gambar 1.3 ditunjukkan beberapa contoh fungsi yang memiliki efek-efek ini. Untuk mengimplementasikannya, anda bisa menggunakan fungsi MATLAB immultiply. Hasilnya ditampilkan pada Gambar 1.4.

Gambar 1.3 Penggunaan perkalian dan pembagian


Gunakan skript MATLAB berikut ini:

>> b3=immultiply(b,0.5); imshow(b3)
>> b4=immultiply(b,2); imshow(b4)
>> b5=imadd(immultiply(b,0.5),128); imshow(b5)

Gambar 1.4 Penerapan operasi-operasi aritmatika pada suatu citra: perkalian dan pembagian


Komplemen

Komplemen suatu citra abu-abu merupakan format negatif fotografiknya. Jika suatu matriks citra bertipa double, yang nilai-nilainya berada dalam rentang 0 sampai 1, maka format negatifnya didapatkan dengan

>> 1-m;

Jika citra biner, maka digunakan

>> ~m

Jika citra bertipe uint8, maka pendekatan terbaik yang bisa digunakan adalah menggunakan fungsi imcomplement. Pada Gambar 1.5 ditunjukkan fungsi komplemen  dan digunakan skript MATLAB berikut ini:

>> bc=imcomplement(b);
>> imshow(bc)


Gambar 1.5 Komplementasi citra


Selisih Absolut Atas Dua Citra
Untuk mendapatkan selisih dua citra, anda bisa menggunakan skript MATLAB berikut ini:

>> a=imread('bintik.tif');
>> c=imread('kameraman.tif');
>> S = imabsdiff(a,c);
>> imshow(S)

Hasilnya ditampilkan pada Gambar 1.6.


Gambar 1.6 Selisih absolut atas dua citra

Kombinasi Citra



dimana  adalah bilangan riil dan  matriks citra. Anda bisa menggunakan skript MATLAB ini untuk melakukannya.

>> Z = imlincomb(0.25,a,3.5,c);
>> imshow(Z)


Gambar 1.7 Hasil kombinasi dua citra


1.2 Histogram

Histogram adalah suatu grafik yang mengindikasikan jumlah kemunculan setiap level keabuan pada suatu citra. Ada beberapa indikasi yang bisa diambil dari histogram suatu citra:
·         Pada suatu citra gelap, level keabuan pada histogram mengelompok pada bagian sebelah bawah.
·         Pada suatu citra terang dan seragam, level keabuan pada histogram mengelompok pada bagian sebelah atas.
·         Pada suatu citra dengan kontras signifikan, level keabuan pada histogram akan menyebar.
Anda bisa melihat histogram suatu citra menggunakan fungsi MATLAB imhist:

p=imread('pout.tif');
imshow(p),figure,imhist(p),axis tight

Hasilnya ditampilkan pada Gambar 1.8. Karena histogramnya mengelompok di tengah, maka bisa dipastikan bahwa citra yang tertampil memiliki kontras yang jelek.


Gambar 1.8 Citra pout.tif dan histogramnya


Jika terdapat suatu citra berkontras jelek, ada dua cara untuk mengatasinya: pelebaran hitogram dan ekualisasi histogram. Berikut akan didiskusikan keduanya.

Pelebaran Histogram
Jika diberikan suatu citra dengan histogram seperti yang ditampilkan pada Gambar 1.9, yang disertai dengan suatu tabel frekuensi kemunculan  dari nilai-nilai keabuan:


Level-level keabuan dapat ditarik atau dilebarkan dengan menerapkan fungsi piecewise linier, seperti yang ditunjukkan pada Gambar 1.9 sebelah kanan. Fungsi ini memiliki efek pelebaran pada level-level keabuan 5-9 menjadi level-level keabuan 2-14, sesuai dengan persamaan:


dimana  adalah level keabuan asli dan  adalah level keabuan setelah transformasi. Level-level keabuan di luar rentang ini dibiarkan sebagaimana aslinya. Hasil transformasi pelebaran ini menghasilkan


dan histogramnya, yang ditunjukkan pada Gambar 1.10, mengindikasikan kontras yang lebih baik dari yang asli.


Gambar 1.9 Suatu histogram dengan kontras buruk, dan fungsi pelebarnya


Gambar 1.10 Histogram hasil pelebaran


Kegunaan Fungsi imadjust

Untuk melakukan pelebaran histogram pada MATLAB, anda bisa menggunakan fungsi imadjust, dengan sintaks:

imadjust(im,[a,b],[c,d])

yang melebarkan kekontrasan citra sesuai dengan fungsi pada Gambar 1.11. Karena fungsi imadjust didesain untuk bekerja pada citra bertipe double, maka nilai-nilai uint8 dan uint16 dari a, b, c, dan d harus berada dalam rentang 0 dan 1.

Perhatikan bahwa imadjust tidak bekerja seperti fungsi pelebar histogram pada Gambar 1.9. Nilai-nilai piksel yang kurang dari a semua dikonversi menjadi c, dan semua nilai-nilai piksel yang lebih dari b dikonversi menjadi d. Jika salah satu atau kedua [a,b] atau [c,d] dipilih [0,1], maka Anda bisa menyingkatnya menjadi hanya [ ]. Jadi, jika diberikan perintah
imadjust(im,[],[])


Gambar 1.11 Fungsi pelebar histogram oleh fungsi imadjust

maka hasilnya sama seperti citra asli. Sedangkan perintah

imadjust(im,[],[1,0])

akan menghasilkan citra negatif fotografik. Perhatikan Gambar 1.12.


Gambar 1.12 Berbagai efek fungsi imadjust


Gambar 1.13 Fungsi imadjust dengan gamma tidak sama dengan 1

Fungsi imadjust memiliki satu parameter lain: nilai gamma, yang mendeskripsikan bentuk fungsi antara koordinat (a,c) dengan (b,d). Jika gamma bernilai satu, maka bentuk fungsi default adalah seperti pada Gambar 1.11. Tetapi jika gamma lebih kecil dari 1 maka bentuk fungsi menjadi cembung (membengkok ke arah bawah) dan jika gamma lebih besar dari 1 maka bentuk fungsi menjadi cekung (membengkok menghadap atas). Perhatikan Gambar 1.13. Fungsi yang digunakan sedikit berbeda:


Kegunaan gamma sendiri sudah cukup mempengaruhi penampilan suatu citra:


Gambar 1.14 Efek gamma pada fungsi imadjust


Membuat Fungsi Pelebar Histogram Sendiri

maka skript MATLAB yang dibutuhkan adalah

pix=find(im >= a(i) & im < a(i+1));
out(pix)=(im(pix)-a(i))*(b(i+1)-b(i))/(a(i+1)-a(i))+b(i);

dimana im adalah citra masukan dan out adalah citra keluaran. Berikut disajikan skript fungsi histpwl.

function out = histpwl(im,a,b)
%
% HISTPWL(IM,A,B) menerapkan transformasi piecewise linear transformation
% terhadap piksel-piksel citra IM, dimana A dan B adalah vektor-vektor
% yan memuat koordinat x dan y pada kedua ujung segmen garis.
% IM dapat bertipe UINT8 atau DOUBLE,
% dan nilai-nilai dalam A dan B harus dalam rentang 0 dan 1.
%
% Contoh: histpwl(x,[0,1],[1,0])
%
classChanged = 0;
if ~isa(im, 'double'),
classChanged = 1;
im = im2double(im);
end
if length(a) ~= length (b)
error('Vektor A dan B harus berukuran sama');
end
N=length(a);
out=zeros(size(im));

for i=1:N-1
pix=find(im>=a(i) & im<a(i+1));
out(pix)=(im(pix)-a(i))*(b(i+1)-b(i))/(a(i+1)-a(i))+b(i);
end

pix=find(im==a(N));
out(pix)=b(N);

if classChanged==1
out = uint8(255*out);
end

Kegunaan fungsi histpwl ini dapat diperhatikan pada contoh berikut:

t=imread('tire.tif');
th=histpwl(t,[0 .25 .5 .75 1],[0 .75 .25 .5 1]);
imshow(th)
figure,plot(t,th,'.'),axis tight

Hasilnya diperlihatkan pada Gambar 1.15.

Gambar 1.15 Hasil pelebaran histogram atas citra tire.tif dan fungsi pelebar histogramnya


Ekualisasi Histogram

Masalah yang terjadi pada pelebaran histogram adalah fakta bahwa diperlukannya masukan dari pengguna atau pemakai. Seringkali dijumpai bahwa pendekatan yang lebih baik adalah menggunakan ekualisasi histogram dimana keseluruhan prosedur dilakukan secara otomatis. Idenya adalah mengubah histogram suatu citra menjadi seragam; yaitu setiap grafik batang pada histogram harus sama tinggi, atau dengan kata lain bahwa setiap level keabuan dalam citra harus memiliki frekuensi kemunculan yang sama.



Suatu contoh ekualisasi histogram akan disajikan berikut ini. Diasumsikan diberikan suatu citra abu-abu 4-bit yang memiliki histogram ditunjukkan pada Gambar 1.16. Berikut adalah tabel frekuensi kemunculan level-level keabuan citra tersebut:






Berikut ditabulasikan level-level keabuan asli dan hasil transformasi:



Gambar 1.17 Histogram hasil ekualisasi


dan histrogram hasil ekualisasi ditampilkan pada Gambar 1.17. Kelihatan bahwa histogram hasil ekualisasi lebih menyebar daripada histogram asli, jadi, citra hasil ekualisasi akan memiliki kekontrasan yang lebih baik.

Untuk menerapkan ekualisasi histogram dalam MATLAB, anda bisa menggunakan fungsi histeq:

p=imread('pout.tif');
ph=histeq(p);
imshow(ph),figure,imhist(ph),axis tight

Hasil ekualisasi histogram citra pout.tif ditampilkan pada Gambar 1.18.

Gambar 1.18 Histogram atas Gambar 1.8 setelah ekualisasi


Akan disajikan satu lagi kasus ekualisasi histogram berikut. Suatu citra gelap didapatkan dengan memanfaatkan fungsi imdivide:

en=imread('peta.tif');
e=imdivide(en,4);
imshow(e),figure,imhist(e),axis tight

Citra gelap peta.tif dan histogramnya ditampilkan pada Gambar 1.19 dan hasil ekualisasi histogramnya ditunjukkan pada Gambar 1.20.

Gambar 1.19 Citra gelap peta.tif dan histogramnya

Gambar 1.20 Hasil ekualisasi histogram atas citra peta.tif


Ekualisasi Histogram Adaptif

Ekualisasi adaptif dapat dilakukan menggunakan fungsi MATLAB adapthisteq. Berikut disajikan dua contoh sebagai perbandingan dengan ekualisasi histogram non-adaptif yang telah didiskusikan.

I = imread('pout.tif'); % atau I = imread('peta.tif');
J = adapthisteq(I);
imshow(J)
figure, imhist(J)

Gambar 1.21 Hasil ekualisasi histogram atas citra pout.tif

Gambar 1.22 Hasil ekualisasi histogram atas citra peta.tif


1.3 Pemrosesan Tetangga

Pada sub-bab sebelumnya telah dibuktikan bahwa suatu citra dapat dimodifikasi dengan menerapkan suatu fungsi khusus terhadap setiap piksel. Pemrosesan tetangga dapat dipandang sebagai pengembangan dari pemrosesan titik, dimana suatu fungsi dapat diterapkan terhadap tetangga atau sekitar dari setiap piksel. Idenya adalah untuk menggerakkan suatu ‘mask’: suatu persegi panjang atau persegi (biasanya dengan panjang sisi-sisi ganjil), seperti yang ditunjukkan pada Gambar 1.23. Kombinasi dari mask dan fungsi disebut dengan filter. Jika fungsi yang menghitung nilai-nilai keabuan yang baru adalah suatu fungsi linier, maka filter tersebut dikatakan filter linier.

Gambar 1.23. Penggunaan suatu mask spasial pada suatu citra


Suatu filter linier dapat diimplementasikan dengan mengalikan semua elemen di dalam mask dengan elemen-elemen di sekitar atau tetangga piksel, dan menjumlahkan semua hasilnya.  Jika diberikan suatu mask berukuran 3 x 5 seperti yang diillustrasikan pada Gambar 1.23, maka nilai-nilai mask diberikan oleh:


dan nilai-nilai pikselnya adalah


Kemudian dikalikan dan dijumlahkan


Suatu diagram yang mengillustrasikan pemilteran spasial diberikan pada Gambar 1.24 berikut ini:

Gambar 1.24 Pemilteran spasial

Pemilteran spasial memerlukan tiga langkah:
1.       Pemosisian mask di area piksel yang ditinjau.
2.       Pengalian semua elemen mask dengan piksel-piksel tetangga.
3.       Penjumlahan hasil pada langkah 3.
Ketiga langkah ini diulangi untuk setiap piksel pada citra.



Perhatikan tanda negatif pada indeks  pada persamaan di atas. Hasil yang sama didapatkan dengan


Di sini piksel-piksel citra dirotasi sejauh 180 derajat; tentu saja hal ini tidak akan mempengaruhi hasil. Kegunaan konvolusi akan nyata pada transformasi Fourier dan pemrosesan sinyal digital. Perlu diketahui bahwa pada prakteknya, mask filter umumnya secara rotasional simmetrik sehingga pemilteran spasial dan konvolusi spasial akan mengeluarkan hasil yang sama.

Contoh 1-1: Diberikan suatu filter linier dengan mask berukuran 3 x 3 sehingga berfungsi sebagai perata-rata sembilan nilai di dalam mask. Nilai rata-rata tersebut menjadi nilai dari piksel yang ditinjau pada citra yang baru. Operasi ini dideskripsikan sebagai berikut:



dimana  merupakan nilai piksel yang ditinjau pada citra asli, dan rata-rata adalah nilai keabuan piksel yang ditinjau pada citra yang baru. Untuk mengapplikasikannya pada suatu citra, perhatikan “citra” 5 x 5 sebagai berikut:

>> x=uint8(10*magic(5))
x =
  170  240   10   80  150
  230   50   70  140  160
   40   60  130  200  220
  100  120  190  210   30
  110  180  250   20   90

Array di atas dipandang sebagai sembilan kelompok berukuran 3 x 3. Oleh karena itu, keluaran dari filter ini hanya akan menghasilkan sembilan jenis nilai. Perhatikan kelompok 3 x 3 pada sisi atas kiri citra:


Sekarang diambil rata-rata dari nilai-nilai tersebut:
>> mean2(x(1:3,1:3))
ans =
  111.1111

yang dibulatkan menjadi 111. Sekarang, akan ditinjau kelompok 3 x 3 yang kedua:


dan juga diambil rata-ratanya:

>> mean2(x(1:3,2:4))
ans =
  108.8889

yang dibulatkan menjadi 108, atau ke integer terdekat. Jika cara tersebut diulangi, maka akan didapatkan keluaran:


Keluaran ini merupakan hasil pemilteran citra x dengan filter perata-rata berukuran 3 x 3.

Notasi

Adalah hal yang sangat membantu jika suatu filter linier dideskripsikan dengan suku-suku koefisien-koefisien semua nilai keabuan piksel di dalam mask. Hal ini dapat dituliskan menjadi suatu matriks.

Filter perata-rata yang telah didiskusikan memiliki ekspressi keluaran sebagai berikut:


dan filter ini dideskripsikan oleh matriks


Contoh 1-2: Filter


akan beroperasi pada nilai-nilai keabuan sebagai:




Tepi Citra
Terdapat suatu masalah riil dalam mengapplikasikan suatu filter, yaitu apa yang terjadi pada saat di tepi citra, dimana sebagian dari mask yang jatuh di luar citra? Pada kasus tersebut, seperti diillustrasikan pada Gambar 1.25, terjadi kekurangan nilai-nilai keabuan yang digunakan dalam fungsi filter.

Gambar 1.25 Suatu mask di tepi suatu citra

Ada dua pendekatan untuk mengatasi masalah ini:
Mengabaikan tepi: Yaitu, mask hanya diterapkan pada piksel-piksel di dalam citra dimana mask akan jatuh secara utuh di dalam citra. Hal ini berarti semua piksel kecuali tepi, yang hasilnya akan berukuran lebih kecil dari citra asli. Jika mask cukup besar, maka sejumlah informasi penting akan hilang karena proses ini. Pada contoh 1-1 diterapkan pendekatan ini.

Menyisipkan nol-nol: Di sini, diasumsikan bahwa semua nilai-nilai di luar citra adalah nol. Hal ini akan memberikan nilai-nilai yang dibutuhkan, dan akan menghasilkan ukuran citra keluaran sama dengan ukuran citra asli. Tetapi, hal ini akan menyebabkan artifak (tepi yang tidak diinginkan) pada citra.


Pemilteran Dalam MATLAB

Fungsi filter2 dalam MATLAB melakukan pemilteran linier, dengan sintaks:

filter2(filter,citra,format)

dan hasilnya adalah suatu matriks bertipe double. Parameter format bersifat opsional, yang menjelaskan bagaimana menangani tepi:
·         filter2(filter, citra, ‘same’) adalah default yang menghasilkan suatu matriks berukuran sama dengan matriks citra asli. Perintah ini menggunakan penyisipan nol.
>> a=ones(3,3)/9
a =
    0.1111    0.1111    0.1111
    0.1111    0.1111    0.1111
    0.1111    0.1111    0.1111

>> filter2(a,x,'same')
ans =
   76.6667   85.5556   65.5556   67.7778   58.8889
   87.7778  111.1111  108.8889  128.8889  105.5556
   66.6667  110.0000  130.0000  150.0000  106.6667
   67.7778  131.1111  151.1111  148.8889   85.5556
   56.6667  105.5556  107.7778   87.7778   38.8889
·         filter2(filter, citra, ‘valid’) menerapkan mask hanya pada piksel-piksel sebelah dalam. Hasilnya akan berukuran lebih kecil dari citra asli.

>> filter2(a,x,'valid')

ans =

  111.1111  108.8889  128.8889
  110.0000  130.0000  150.0000
  131.1111  151.1111  148.8889

Hasil format ‘same’ di atas bisa didapatkan dengan menyisipkan nol-nol dan menggunakan format ‘valid’:
>> x2=zeros(7,7);
>> x2(2:6,2:6)=x
x2 =
     0     0     0     0     0     0     0
     0   170   240    10    80   150     0
     0   230    50    70   140   160     0
     0    40    60   130   200   220     0
     0   100   120   190   210    30     0
     0   110   180   250    20    90     0
     0     0     0     0     0     0     0

>> filter2(a,x2,'valid')
ans =
   76.6667   85.5556   65.5556   67.7778   58.8889
   87.7778  111.1111  108.8889  128.8889  105.5556
   66.6667  110.0000  130.0000  150.0000  106.6667
   67.7778  131.1111  151.1111  148.8889   85.5556
   56.6667  105.5556  107.7778   87.7778   38.8889

·         filter2(filter, citra, ‘full’) memberikan keluaran yang berukuran lebih besar dari citra asli; hal ini dilakukan dengan menyisipkan nol-nol, dan menerapkan filter pada semua tempat-tempat di dalam dan di sekitar citra dimana mask beririsan dengan matriks citra:

>> filter2(a,x,'full')
ans =
   18.8889   45.5556   46.6667   36.6667   26.6667   25.5556   16.6667
   44.4444   76.6667   85.5556   65.5556   67.7778   58.8889   34.4444
   48.8889   87.7778  111.1111  108.8889  128.8889  105.5556   58.8889
   41.1111   66.6667  110.0000  130.0000  150.0000  106.6667   45.5556
   27.7778   67.7778  131.1111  151.1111  148.8889   85.5556   37.7778
   23.3333   56.6667  105.5556  107.7778   87.7778   38.8889   13.3333
   12.2222   32.2222   60.0000   50.0000   40.0000   12.2222   10.0000


Anda dapat pula menciptakan filter sendiri menggunakan fungsi fspecial; Fungsi ini memiliki banyak opsi yang mempermudah pembuatan suatu filter. Jika anda ingin menciptakan suatu filter perata-rata, anda bisa memakai opsi ‘average’ sebagai berikut:

>> fspecial('average',[5,7])
ans =
    0.0286    0.0286    0.0286    0.0286    0.0286    0.0286    0.0286
    0.0286    0.0286    0.0286    0.0286    0.0286    0.0286    0.0286
    0.0286    0.0286    0.0286    0.0286    0.0286    0.0286    0.0286
    0.0286    0.0286    0.0286    0.0286    0.0286    0.0286    0.0286
    0.0286    0.0286    0.0286    0.0286    0.0286    0.0286    0.0286

atau secara sederhana, anda bisa menggunakan

>> fspecial('average',11)
ans =
  Columns 1 through 9
    0.0083  0.0083  0.0083  0.0083  0.0083  0.0083  0.0083  0.0083    0.0083
    0.0083  0.0083  0.0083  0.0083  0.0083  0.0083  0.0083  0.0083    0.0083
    0.0083  0.0083  0.0083  0.0083  0.0083  0.0083  0.0083  0.0083    0.0083
    0.0083  0.0083  0.0083  0.0083  0.0083  0.0083  0.0083  0.0083    0.0083
    0.0083  0.0083  0.0083  0.0083  0.0083  0.0083  0.0083  0.0083    0.0083
    0.0083  0.0083  0.0083  0.0083  0.0083  0.0083  0.0083  0.0083    0.0083
    0.0083  0.0083  0.0083  0.0083  0.0083  0.0083  0.0083  0.0083    0.0083
    0.0083  0.0083  0.0083  0.0083  0.0083  0.0083  0.0083  0.0083    0.0083
    0.0083  0.0083  0.0083  0.0083  0.0083  0.0083  0.0083  0.0083    0.0083
    0.0083  0.0083  0.0083  0.0083  0.0083  0.0083  0.0083  0.0083    0.0083
    0.0083  0.0083  0.0083  0.0083  0.0083  0.0083  0.0083  0.0083    0.0083

  Columns 10 through 11
    0.0083    0.0083
    0.0083    0.0083
    0.0083    0.0083
    0.0083    0.0083
    0.0083    0.0083
    0.0083    0.0083
    0.0083    0.0083
    0.0083    0.0083
    0.0083    0.0083
    0.0083    0.0083
    0.0083    0.0083

yang menghasilkan suatu matriks berukuran 11 x 11. Jika jumlah vektor diabaikan, maka keluarannya berukuran 3 x 3:

>> fspecial('average')
ans =
    0.1111    0.1111    0.1111
    0.1111    0.1111    0.1111
    0.1111    0.1111    0.1111

Sebagai contoh, filter perata-rata 3 x 3 diterapkan pada suatu citra sebagai berikut:
>> c=imread('mandrill.png');
f1=fspecial('average',5);
cf1=filter2(f1,c);
>> figure,imshow(c),figure,imshow(cf1/255)

Hasil yang diperoleh ditampilkan pada Gambar 1.26. Perhatikan bahwa filter perata-rata mengaburkan tepi citra; tepi di beberapa area menjadi kurang tegas daripada yang asli. Citra dapat pula dibuat menjadi lebih kabur menggunakan filter perata-rata yang berukuran lebih besar. Hal ini ditampilkan pada Gambar 1.26c, dimana digunakan filter berukuran 9 x 9, dan Gambar 1.26d, dimana digunakan filter berukuran 25 x 25.

Gambar 1.26 Pemilteran rata-rata

Perhatikan pula bahwa penyisipan nol-nol pada tepi mengakibatkan border atau batas hitam yang tampak mengitari citra. Hal ini semakin kelihatan bila digunakan filter perata-rata yang berukuran lebih besar. Jika artifak tersebut tidak diinginkan; misalnya menyebabkan kecerahan rata-rata berubah, maka akan lebih tepat digunakan opsi ‘valid’.

Citra yang dihasilkan bisa jadi tampak lebih buruk dari citra asli. Akan tetapi, penerapan filter pengabur seperti itu bisa dimanfaatkan untuk mengurangi detil citra yang berguna bagi operasi-operasi pengenalan objek suatu mesin otonom.


Pemisahan Filter

Beberapa filter dapat diimplementasikan dengan penggunaan dua filter yang lebih sederhana secara berurutan. Misalnya, karena




Semua filter perata-rata dapat dipisahkan, termasuk di dalamnya filter laplacian berikut ini:



Frekuensi: Filter Highpass dan Lowpass

Akan sangat membantu jika dimiliki terminologi standar sehingga diskusi tentang efek suatu filter terhadap citra bisa lebih tajam dan agar bisa dipilih filter yang cocok untuk kebutuhan tertentu. Salah satu aspek penting dalam pemrosesan citra digital adalah frekuensi. Secara garis besar, frekuensi dalam suatu citra adalah suatu ukuran atas perubahan nilai-nilai keabuan terhadap jarak. Komponen-komponen frekuensi tinggi dikarakteristikkan sebagai perubahan besar dari nilai-nilai keabuan terhadap jarak yang pendek: contoh dari komponen frekuensi tinggi adalah tepi dan derau. Komponen-komponen frekuensi rendah, di sisi lain, dikarakteristikkan sebagai perubahan kecil dari nilai-nilai keabuan terhadap jarak yang panjang: contoh dari komponen frekuensi rendah adalah tekstur kulit binatang atau pola-pola alam yang lain. Kemudian suatu filter dapat dikatakan sebagai
·         Filter pelewat tinggi (highpass) jika melewatkan komponen-komponen frekuensi tinggi, dan mereduksi atau mengeliminasi komponen-komponen frekuensi rendah.
·         Filter pelewat rendah (lowpass) jika melewatkan komponen-komponen frekuensi rendah, dan mereduksi atau mengeliminasi komponen-komponen frekuensi tinggi.

Sebagai contoh, suatu filter perata-rata 3 x 3 merupakan suatu filter lowpass, karena cenderung untuk mengaburkan tepi. Filter


merupakan suatu filter highpass. Dapat diperhatikan bahwa jumlah dari semua elemen matriks di atas adalah nol. Hal ini berarti bahwa pada bagian frekuensi rendah suatu citra, dimana terdapat nilai-nilai keabuan yang hampir sama, penggunaan filter highpass akan menyebabkan nilai-nilai keabuan pada citra yang baru bernilai mendekati nol. Untuk membuktikan hal ini, perhatikan suatu blok 4 x 4 yang memuat nilai-nilai hampir sama, dan filter highpass diterapkan pada empat piksel tengah:



Total penjumlahan nilai yang dihasilkan mendekati nol, yang telah diduga sebagai hasil penerapan filter highpass pada bagian frekuensi rendah suatu citra. Nanti akan didiskusikan bagaimana menangani nilai-nilai negatif yang dihasilkan.

Filter highpass berguna dalam deteksi tepi dan peningkatan tepi. Berikut diberikan contoh penggunaan filter highpass pada suatu citra:

>> c=imread('cameraman.tif');
>> f=fspecial('laplacian')
f =
    0.1667    0.6667    0.1667
    0.6667   -3.3333    0.6667
    0.1667    0.6667    0.1667

>> cf=filter2(f,c);
>> f1=fspecial('average');
>> cf1=filter2(f1,c);
>> c=imread('cameraman.tif');
>> f=fspecial('laplacian')
f =
    0.1667    0.6667    0.1667
    0.6667   -3.3333    0.6667
    0.1667    0.6667    0.1667

>> cf=filter2(f,c);
>> imshow(cf/100)
>> f1=fspecial('log')
f1 =
    0.0448    0.0468    0.0564    0.0468    0.0448
    0.0468    0.3167    0.7146    0.3167    0.0468
    0.0564    0.7146   -4.9048    0.7146    0.0564
    0.0468    0.3167    0.7146    0.3167    0.0468
    0.0448    0.0468    0.0564    0.0468    0.0448

>> cf1=filter2(f1,c);
>> figure,imshow(cf1/100)


Gambar 1.27 Pemilteran menggunakan highpass


Hasilnya ditampilkan pada Gambar 1.27. Citra (a) merupakan hasil pemilteran menggunakan filter laplacian dan citra (b) adalah hasil pemilteran menggunakan filter Log (laplacian of Gaussian). Pada kedua kasus ini, dapat dilihat bahwa hasil penjumlahan elemen-elemen filter adalah nol.


Nilai-Nilai di Luar Rentang 0-255

Sejauh ini telah didiskusikan bahwa untuk menampilkan suatu citra diperlukan agar nilai-nilai piksel harus berada dalam rentang 0 sampai 255. Tetapi, penerapan suatu filter linier bisa jadi menghasilkan keluaran nilai-nilai yang berada di luar rentang tersebut. Terdapat beberapa cara untuk mengatasi hal ini:
·         Membuat semua nilai negatif menjadi positif: Hal ini akan mengatasi nilai-nilai negatif, tetapi tidak untuk nilai-nilai yang lebih besar dari 255. Oleh karena itu, prosedur ini hanya akan dipakai untuk keadaan tertentu: misalnya ketika hanya terdapat sedikit nilai-nilai negatif, atau ketika nilai-nilai negatif tersebut mendekati nol.

·         Memotong nilai: Operasi ambang-batas ini dipakai terhadap nilai-nilai keabuan x yang dihasilkan filter untuk mendapatkan nilai-nilai yang bisa ditampilkan y:



Ini akan menghasilkan suatu citra dengan semua piksel yang memiliki nilai dalam rentang yang diinginkan, tetapi metode ini tidak cocok jika banyak nilai-nilai keabuan berada di luar rentang 0-255. Pada kasus tersebut, operasi ini cenderung untuk merusak hasil filter.

·         Transformasi penskalaan: Jika diberikan suatu nilai keabuan terendah yang dihasilkan suatu filter adalah gL dan nilai keabuan tertingginya adalah gH , maka semua nilai yang berada dalam rentang gL sampai gH dapat ditransformasi menjadi 0 sampai 255 menggunakan transformasi linier sebagai berikut:

Gambar 1.28 Transformasi penskalaan linier

Karena gradien garis sebesar 255/(gH-gL), maka persamaan garis lurus transformasi penskalaan adalah


yang diterapkan pada semua nilai keabuan x yang dihasilkan filter agar bisa ditampilkan.

Sebagai contoh, diterapkan suatu filter highpass pada citra kameraman.tif:

>> c=imread('cameraman.tif');
>> f2=[1 -2 1;-2 4 -2;1 -2 1];
>> cf2=filter2(f2,c);
>> max(max(cf2))
ans =
   593

>> min(min(cf2))
ans =
  -541

Sekarang terbukti bahwa nilai maksimum dan minimum hasil filter terhadap citra kameraman.tif adalah 593 dan -541. Fungsi mat2gray secara otomatis menskalakan elemen-elemen matriks menjadi nilai-nilai yang dapat ditampilkan; untuk sembarang matriks , fungsi mat2gray menskalakan elemen-elemen matriks menggunakan suatu transformasi linier sehingga nilai terendah menjadi 0.0 dan elemen tertinggi menjadi 1.0. Hal ini berarti bahwa keluaran fungsi mat2gray selalu bertipe double. Fungsi ini juga mensyaratkan argumen masukan bertipe double pula. Lihat Gambar 1.29.


Gambar 1.29 Citra yang tertampil, hasil dari filter kameraman.tif yang difilter dengan f2=[1 -2 1;-2 4 -2;1 -2 1], memanfaatkan fungsi mat2gray

Anda bisa menggantikan fungsi mat2gray dengan perhitungan manual:

>> figure,imshow(mat2gray(cf2));
>> maxcf2=max(cf2(:));
>> mincf2=min(cf2(:));
>> cf2g=(cf2-mincf2)/(maxcf2-mincf2);
>> imshow(cf2g)

Hasilnya akan berupa suatu matriks bertipe double, dengan elemen-elemen berinilai 0.0 sampai 1.0. Anda bisa mengkonversi nilai elemen-elemen tersebut menjadi uint8 dengan mengalikannya dengan 255.
>> figure,imshow(cf2/60)

Untuk mendapatkan hasil yang lebih baik, biasanya keluaran filter dibagi dengan suatu konstan:

Gambar 1.30 Pembagian suatu citra dengan suatu konstan


Penajaman Tepi
Pemilteran spasial dapat digunakan untuk membuat tepi dalam suatu citra sedikit lebih tajam atau lebih tegas, yang umumnya lebih enak dipandang mata manusia. Operasi ini disebut pula dengan “peningkatan tepi” atau “penegasan tepi” atau “penajaman tepi” atau “unsharp masking”. Istilah terakhir populer pada industri percetakan.

Pada prakteknya, penajaman tepi dilakukan dengan mengurangi suatu citra asli dengan suatu citra asli yang telah dikaburkan. Skema penajaman tepi dapat diperhatikan pada Gambar 1.31.


Gambar 1.31 Skema penajaman tepi


Jika diberikan suatu citra x bertipe uint8, maka penajaman tepi dapat diterapkan dengan urutan perintah berikut ini:

>> figure,imshow(mat2gray(cf2));
>> maxcf2=max(cf2(:));
>> mincf2=min(cf2(:));
>> cf2g=(cf2-mincf2)/(maxcf2-mincf2);
>> imshow(cf2g)

Gambar 1.32 Suatu contoh penajaman tepi

Untuk melihat bagaimana proses penajaman tepi bekerja, perhatikan fungsi nilai-nilai keabuan yang berada di sekitar tepi seperti yang ditunjukkan pada Gambar 1.33.

Gambar 1.33 Proses penajaman tepi


Setelah citra yang dikaburkan dikurangkan dari citra asli, maka akan dihasilkan citra baru dengan tepi yang ditajamkan, seperti yang tertampil pada Gambar 1.33c. Pada dasarnya, Anda bisa melakukan proses pengurangan dan pemilteran dengan satu perintah, memanfaatkan linieritas filter dan suatu filter identitas 3 x 3:


Maka penajaman tepi dapat diimplementasikan menggunakan suatu filter dengan format


dimana  adalah suatu konstan yang dipilih untuk memberikan hasil yang terbaik. Filter penajam tepi alternatif didefinisikan sebagai


Opsi unsharp pada fungsi fspecial menghasilkan filter penajam tepi; filter tersebut memiliki format


dimana  adalah suatu parameter opsional dengan nilai default 0.2. Jika alfa = 0.5, filter ini menjadi


Gambar 1.34 dihasilkan dari perintah-perintah berikut ini:

>> p=imread('pelicans.tif');
>> u=fspecial('unsharp',0.5);
>> pu=filter2(u,p);
>> imshow(p),figure,imshow(pu/255)

Gambar 1.34 Peningkatan tepi menggunakan fungsi fspecial dan opsi unsharp

Gambar 1.34b tampak lebih bersih dan bertepi tegas. Perhatikan pula bebatuan dan riak air pada citra yang tampak lebih tajam dari citra asli.


Filter High Boost
Dengan tujuan yang sama dengan filter penajam tepi, filter high boost didapatkan dari



>> x=imread('rusa.tif');
>> xf=filter2(f,x,'same');
>> imshow(xf/80)

akan menghasilkan suatu citra yang hampir sama dengan 2.32b. Nilai 80 didapatkan dengan cara trial and error untuk mendapatkan intensitas keabuan yang hampir sama. Anda juga bisa memformulasikan filter high boost dengan




>> id=[0 0 0;0 1 0;0 0 0];
>> f=fspecial('average');
>> hb1=3*id-2*f
hb1 =

   -0.2222   -0.2222   -0.2222
   -0.2222    2.7778   -0.2222
   -0.2222   -0.2222   -0.2222

>> hb2=1.25*id-0.25*f
hb2 =

   -0.0278   -0.0278   -0.0278
   -0.0278    1.2222   -0.0278
   -0.0278   -0.0278   -0.0278

Jika setiap filter hb1 dan hb2 diapplikasikan terhadap citra menggunakan fungsi filter2, maka hasilnya akan berupa suatu citra yang tepinya ditajamkan. Gambar 1.35 membuktikan hal ini.



Gambar 1.35 Pemilteran high boost


Dari kedua hasil filter high boost, tampak bahwa hb1 memberikan hasil yang terbaik; hb2 memberikan hasil yang tidak lebih tegas dan tajam dari citra asli.

Filter Non-Linier

Filter linier, seperti yang telah didiskusikan, cukup mudah untuk dijelaskan dan dapat diimplementasikan secara effisien dengan MATLAB. Filter non-linier diperoleh dengan menerapkan suatu fungsi non-linier atas nilai-nilai keabuan di dalam mask. Dua contoh sederhana adalah filter maksimum, yang memiliki nilai maksimum sebagai nilai keluaran di dalam mask, dan filter minimum, yang memiliki nilai minimum sebagai nilai keluaran di dalam mask.

Kedua filter maksimum dan filter minimum merupakan dua contoh filter urut-ranking (rank-order). Pada filter seperti itu, elemen-elemen yang berada di bawah mask diurutkan, dan suatu nilai tertentu diberikan sebagai nilai balik keluaran. Jadi, jika elemen-elemen tersebut diurutkan menaik, maka filter minimum akan memberikan elemen pertama sebagai keluarannya, dan filter maksimum akan memberikan elemen terakhir sebagai nilai balik keluarannya.

Untuk menerapkan suatu filter non-linier di dalam MATLAB, fungsi yang  digunakan adalah nlfilter, yang memakai suatu filter terhadap suatu citra sesuai denga fungsi yang ditetapkan sebelumnya. Jika fungsi belum didefinisikan, maka anda perlu menciptakan suatu m-file untuk mendefinisikannya.

Berikut diberikan beberapa contoh; pertama untuk mengimplementasikan suatu filter maksimum dan minimum pada lingkungan 3 x 3:

>> cmax=nlfilter(x,[3,3],'max(x(:))');
>> imshow(cmax)
>> cmin=nlfilter(x,[3,3],'min(x(:))');
>> figure, imshow(cmin)


Gambar 1.36 Penggunakan dua filter non-linier

Perhatikan pada kedua hasil, semuanya kehilangan ketajaman, dan dicerahkan oleh filter maksimum, dan digelapkan oleh filter minimum. Fungsi nlfilter sangat lambat oleh karena itu direkomendasikan untuk membuat suatu filter non-linier sendiri.

Disamping filter nlfilter, Anda bisa menggunakan fungsi yang lebih cepat colfilt, yang terlebih dahulu menata-ulang citra menjadi kolom-kolom. Sebagai contoh, anda bisa menerapkan filter maksimum terhadap citra pelicans.tif dengan

>> cmax=colfilt(x,[3,3],'sliding',@max);

Parameter sliding mengindikasikan bahwa lingkungan-lingkungan yang digunakan saling tumpang-tindih. Operasi ini terbilang sangat cepat jika dibandingkan bila menggunakan fungsi nlfilter.

Untuk mengimplementasikan filter maksimum dan filter minimum sebagai filter urut-ranking, anda bisa menggunakan fungsi MATLAB ordfilt2. Perintah ini memerlukan tiga masukan: citra, nilai indeks atas keluaran yang diurutkan yang dipilih sebagai keluaran, dan definisi dari mask. Jadi, untuk menerapkan filter maksimum pada suatu mask 3 x 3, anda menggunakan

>> cmax=ordfilt2(x,9,ones(3,3));

dan

cmin=ordfilt2(x,1,ones(3,3));

Salah satu filter urut-ranking yang paling penting adalah filter median, yang mengambil titik tengah dari elemen-elemen yang diurutkan. Anda bisa menggunakan filter median dengan

>> cmed=ordfilt2(x,5,ones(3,3));

Akan tetapi, filter median memiliki fungsi sendiri, medfilt2, yang akan didiskusikan lebih detil selanjutnya. Hasil pemilteran median ditampilkan pada Gambar 1.37.


Gambar 1.37 Hasil pemilteran median