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.
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)
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.
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.
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,[],[])
maka hasilnya sama seperti citra
asli. Sedangkan perintah
imadjust(im,[],[1,0])
akan menghasilkan citra negatif
fotografik. Perhatikan Gambar 1.12.
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:
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.
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:
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.
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.
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)
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.
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:
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:
>> 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
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.
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.
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)
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:
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:
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.
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)
Untuk melihat bagaimana proses
penajaman tepi bekerja, perhatikan fungsi nilai-nilai keabuan yang berada di
sekitar tepi seperti yang ditunjukkan pada Gambar 1.33.
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.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.
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)
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.
1 comment:
Ini sangat bermanfat
elemen solder uap
Post a Comment