5.13. Filter linear dan tetangga

Operasi matematika piksel yang dibahas sebelumnya dalam bab ini menggabungkan dua citra titik per titik. Filter melakukan pekerjaan serupa dengan cara yang berbeda: filter menghitung nilai setiap piksel keluaran dari tetangga kecil piksel masukan di sekitar posisi yang bersesuaian. Keluaran pada (x, y) adalah statistik tertentu -- rata-rata, median, nilai yang paling umum -- dari piksel masukan dalam sebuah kotak kecil yang berpusat pada (x, y).

Perubahan kecil dalam sudut pandang itu -- beralih dari satu piksel dalam satu waktu ke jendela piksel dalam satu waktu -- adalah yang membuat seluruh keluarga operasi berguna berfungsi. Rata-rata sederhana pada jendela kecil menghaluskan noise sensor. Median pada jendela yang sama menghilangkan speckle piksel tunggal tanpa memperlemah tepi sebanyak itu. Rata-rata bilateral menolak meratakan batas kontras yang kuat, mempertahankan tepi objek sambil membersihkan tekstur di dalamnya. Tetangga adalah unit kerja; pilihan statistik menentukan apa yang dilakukan filter.

5.13.1. Ukuran kernel

Setiap filter tetangga menerima parameter size yang menetapkan radius jendela dalam piksel. Jendela itu sendiri berbentuk persegi dan mencakup (2 * size + 1) piksel di setiap sisi -- sehingga size=1 berarti tetangga 3-kali-3, size=2 berarti 5-kali-5, size=3 berarti 7-kali-7, dan seterusnya.

A small image grid with a highlighted 3-by-3 sub-grid representing the filter's neighbourhood. An arrow shows the neighbourhood sliding one pixel to the right. A second arrow shows it sliding down to the next row at the end of the row. The output pixel for each position is drawn under the neighbourhood, with a small note saying that the output is some statistic of the input neighbourhood.

Tetangga meluncur melintasi citra satu piksel dalam satu waktu, dari kiri atas ke kanan bawah. Setiap piksel keluaran adalah hasil penerapan statistik filter pada tetangga masukan yang berpusat padanya.

Ukuran yang lebih besar berarti tetangga yang lebih besar, yang berarti pemfilteran yang lebih halus (atau lebih agresif). Biaya tumbuh seiring area jendela, sehingga filter size=3 melakukan sekitar sembilan kali pekerjaan per piksel dibanding filter size=1. Default praktis untuk sebagian besar pekerjaan pembersihan adalah size=1 atau size=2; gunakan ukuran yang lebih besar hanya ketika tetangga kecil tidak cukup untuk menekan fitur yang ingin ditekan oleh aplikasi.

5.13.2. Filter mean

mean() menggantikan setiap piksel dengan rata-rata aritmetika dari tetangganya. Hasilnya menghaluskan variasi piksel ke piksel di seluruh ukuran jendela, menjadikannya cara termurah untuk menekan speckle noise sensor: variasi frekuensi tinggi dirata-ratakan, konten frekuensi rendah bertahan.

Trade-offnya adalah tepi dan fitur tajam lainnya ikut dirata-ratakan juga. Tepi cerah yang sebelumnya lebarnya satu piksel menjadi dua atau tiga piksel setelah filter mean size=1, dengan kecerahan yang memudar di sisi-sisinya. Untuk pengurangan noise murni pada citra yang miskin tekstur (dinding bersih, bagian dalam spidol berwarna), pertukaran ini baik-baik saja. Untuk adegan yang sibuk di mana tepi penting, salah satu filter berikut biasanya lebih cocok.

img.mean(1)        # 3x3 box average -- fast, gentle smoothing
img.mean(2)        # 5x5 box average -- stronger, slower

5.13.3. Median, mode, midpoint

Tiga filter tetangga statistik lainnya menukar rata-rata aritmetika sederhana dengan sesuatu yang lebih tahan terhadap outlier.

median() mengembalikan median dari tetangga -- nilai yang berada di tengah daftar piksel jendela yang telah diurutkan. Satu piksel yang sangat cerah atau sangat gelap dalam jendela tidak menarik median; ia hanya menjadi salah satu ekstrem yang dibuang. Efek praktisnya adalah pemfilteran median menghilangkan speckle piksel tunggal dan noise salt-and-pepper tanpa memperlemah tepi seperti yang dilakukan mean. Biayanya adalah lebih banyak komputasi per piksel -- mengurutkan jendela lebih lambat daripada meratakannya -- dan hasilnya bukan rata-rata yang ketat, yang kadang-kadang penting untuk matematika selanjutnya.

Parameter percentile (default 0.5) memindahkan nilai yang dipilih dari median yang ketat. percentile=0.0 mengembalikan minimum tetangga, percentile=1.0 mengembalikan maksimum; nilai antara memilih secara proporsional di antara keduanya dalam jendela yang telah diurutkan. Itu memberi median kemampuan untuk menekankan bagian gelap atau cerah dari tetangga tanpa kehilangan ketahanan outlier dari statistik order.

mode() mengembalikan nilai yang paling umum dalam tetangga. Berguna ketika model noise adalah "sebagian besar piksel benar, beberapa telah rusak ke berbagai tingkat," di mana jawaban yang benar adalah nilai yang paling sering muncul -- yang dapat dilewatkan oleh median ketika nilai-nilai yang rusak menumpuk di satu sisi jendela yang telah diurutkan.

midpoint() mengembalikan kombinasi berbobot antara minimum dan maksimum dari tetangga -- bias=0.5 memberikan titik tengah di antara keduanya, bias=0.0 memberikan minimum, bias=1.0 memberikan maksimum. Lebih jarang digunakan daripada yang lain tetapi layak diketahui ketika tujuannya secara khusus adalah mengekstrak fitur gelap atau cerah.

5.13.4. Bilateral, versi yang mempertahankan tepi

bilateral() adalah filter tetangga yang paling layak dipahami dengan baik. Filter ini menghasilkan efek penghalusan dari mean(), tetapi dengan batasan tambahan: semakin banyak piksel tetangga berbeda dari piksel pusat, semakin sedikit kontribusinya dalam rata-rata. Hasilnya menghaluskan bagian dalam setiap wilayah yang seragam tanpa bocor melintasi tepi yang memisahkan mereka, yang merupakan tepat apa yang sebagian besar aplikasi sebenarnya inginkan.

Dua parameter mengontrol seberapa agresif filter mendiskon piksel:

  • color_sigma menentukan bagaimana perbedaan warna mempengaruhi pembobotan. Nilai yang lebih kecil berarti filter lebih ketat dalam mendiskon piksel yang berbeda dari pusat.

  • space_sigma menentukan bagaimana jarak spasial mempengaruhi pembobotan. Nilai yang lebih kecil memberikan bobot lebih pada piksel yang dekat dengan pusat.

Default (color_sigma=0.1, space_sigma=1.0) adalah titik awal yang wajar; menyetelnya biasanya merupakan masalah menjalankan filter pada bingkai sampel dan menyesuaikan sampai tepi tajam dan bagian dalam bersih.

Bilateral lebih mahal dari median() dan jauh lebih mahal dari mean(), sehingga layak digunakan hanya ketika perilaku yang mempertahankan tepi adalah yang dibutuhkan aplikasi.

5.13.5. Ambang batas adaptif

Filter mean, median, mode, dan midpoint semuanya membawa pasangan argumen kata kunci yang sama yang mengubah keluaran mereka menjadi ambang batas biner:

  • threshold=True mengalihkan filter ke mode thresholding.

  • offset=N menggeser batas potong lokal sebesar N unit sebelum perbandingan.

Mekanismenya dibangun langsung di atas perilaku biasa filter. Tanpa threshold=True, filter menghitung statistiknya pada tetangga dan menuliskan statistik itu ke piksel keluaran. Dengan threshold=True, filter menghitung statistik yang sama, kemudian membandingkan piksel sumber pada posisi yang sama terhadap statistik ditambah offset, dan menuliskan nilai maksimum format jika sumber lebih besar, nol sebaliknya.

Hasilnya adalah citra biner yang batas potongnya bergerak mengikuti kecerahan lokal di seluruh bingkai. Wilayah terang mendapat batas potong yang tinggi, wilayah redup mendapat batas potong yang rendah, dan piksel latar depan yang secara lokal lebih cerah dari tetangganya cocok baik di wilayah terang maupun redup -- yang merupakan tepat perilaku yang tidak bisa dihasilkan oleh ambang batas global tunggal pada citra yang diterangi tidak merata.

img.mean(3, threshold=True, offset=5)

Parameter offset adalah tempat aplikasi mengontrol seberapa ketat pengujiannya. Offset positif kecil menuntut agar piksel sumber lebih cerah secara terukur dari tetangganya sebelum dihitung sebagai cocok, yang menekan false positive noise sensor dengan biaya melewatkan latar depan yang redup. Offset negatif kecil menangkap latar depan yang redup dengan biaya membiarkan beberapa noise lolos. Pilihan tergantung pada apa yang akan dilakukan pipeline selanjutnya dengan keluaran biner.

Three image panels in a row. The first is an input grayscale frame with a brightness gradient and foreground marks scattered across at uniform darkness. The second panel shows a global threshold applied to it: the foreground is correctly classified on the bright side, but the entire dark side reads as foreground because page and foreground both fall below the cutoff. The third panel shows an adaptive threshold applied to the same input: the foreground is correctly classified across the whole frame.

Di bawah pencahayaan yang tidak merata, ambang batas global tunggal tidak dapat mendeskripsikan latar depan di setiap posisi. Filter tetangga yang dijalankan dengan threshold=True menghasilkan batas potong yang bergerak mengikuti kecerahan lokal dan mengklasifikasikan latar depan dengan benar di seluruh bingkai.

Keluarga filter menjalankan ambang batas adaptif, sehingga memilih filter yang tepat penting: mean() untuk ambang batas adaptif yang paling murah, median() ketika masukan memiliki noise salt-and-pepper yang harus ditolak oleh filter sebelum menghitung batas potong lokal.