5.12. Thresholding biner

Banyak pipeline pemrosesan citra bermuara pada pertanyaan tentang setiap piksel: apakah kecerahan ini berada dalam rentang yang berarti "latar depan"? Apakah warna ini cukup dekat dengan merah untuk menjadi penanda yang dilacak aplikasi? Apakah piksel ini merupakan bagian dari set kandidat yang harus dilihat oleh tahap pipeline berikutnya? Thresholding adalah operasi yang mengubah pertanyaan-pertanyaan tersebut menjadi jawaban biner di setiap posisi -- aktif jika piksel cocok, mati jika tidak -- dan mereduksi seluruh citra menjadi masker yang dapat digunakan oleh sisa pipeline.

5.12.1. Metode binary

Metode binary() menjalankan klasifikasi tersebut di setiap piksel dalam satu panggilan. Metode ini mengambil daftar rentang ambang batas -- kondisi yang dapat dicocokkan oleh piksel untuk dihitung sebagai "aktif" -- dan menulis ulang citra sehingga setiap piksel yang cocok dengan setidaknya satu rentang diset ke nilai maksimum formatnya, dan setiap piksel yang tidak cocok diset ke nol. Hasilnya adalah masker biner yang dapat langsung digunakan oleh sisa pipeline.

Dalam bentuk paling sederhana, daftar ambang batas memiliki satu rentang dan panggilan mengembalikan masker piksel dalam rentang tersebut:

img.binary([(120, 255)])

Bentuk daftar inilah yang membuat binary menjadi kuat. Pipeline yang ingin melacak dua penanda berwarna, atau rentang kecerahan ditambah puncak saturasi yang terisolasi, memasukkan kedua rentang dalam daftar yang sama dan mendapatkan satu masker output yang mencakup semua kecocokan.

A horizontal grayscale gradient at the top labelled "input -- pixel values from 0 to 255". Below it, an inclusive threshold range from lo to hi is marked with brackets along the gradient, enclosing the range of brightness values that count as matches. A binary output bar at the bottom shows white inside the lo-to-hi range and black outside it.

Thresholding mengubah citra bernilai kontinu menjadi masker biner: setiap piksel di dalam rentang ambang batas menjadi nilai maksimum formatnya, setiap piksel di luar menjadi nol.

5.12.2. Tuple skala abu-abu

Untuk citra skala abu-abu, setiap entri dalam daftar ambang batas adalah tuple dua elemen (lo, hi) yang mendeskripsikan rentang kecerahan inklusif. Piksel dengan nilai antara lo dan hi (inklusif) cocok; semua yang di luar rentang itu tidak. Pola-pola alaminya sangat mudah dipahami:

  • (0, 60) cocok dengan piksel gelap -- semua dari hitam hingga abu-abu tua.

  • (180, 255) cocok dengan piksel terang -- semua dari abu-abu muda hingga putih.

  • (100, 160) cocok dengan piksel abu-abu tengah -- sebuah band di tengah rentang kecerahan.

Urutan dua nilai di dalam tuple tidak masalah; metode ini menukarnya secara internal jika lo lebih besar dari hi, sehingga (60, 0) bekerja sama seperti (0, 60).

5.12.3. Tuple LAB untuk warna

Untuk citra RGB565, setiap entri adalah tuple enam elemen (l_lo, l_hi, a_lo, a_hi, b_lo, b_hi) yang mendeskripsikan rentang inklusif dalam ruang warna LAB daripada langsung dalam merah, hijau, dan biru. Ambang batas tersebut adalah L (kecerahan), A (sumbu kromatik hijau-ke-merah), dan B (sumbu kromatik biru-ke-kuning), masing-masing dibandingkan dengan nilai piksel di saluran tersebut.

Alasan menggunakan LAB daripada melakukan thresholding langsung pada RGB adalah properti yang dirancang untuk ruang warna LAB: LAB memisahkan kecerahan dari kroma. Dua piksel yang menampilkan warna yang sama tetapi pada kecerahan yang berbeda berakhir pada nilai L yang berbeda tetapi pada nilai A dan B yang kira-kira sama. Pemisahan tersebut memungkinkan rentang ambang batas mendeskripsikan sebuah warna berdasarkan posisinya pada sumbu A dan B serta membiarkan rentang L tetap lebar untuk menerima warna tersebut pada setiap kecerahan dari bayangan hingga sorotan. Ambang batas berbasis RGB tidak dapat melakukan itu -- setiap perubahan pencahayaan menggeser ketiga nilai R, G, B sekaligus, dan pelacak yang dibangun pada ambang batas RGB rusak pertama kali awan melewati matahari.

Pola praktis: pilih rentang A dan B yang mendeskripsikan warna yang dilacak aplikasi, dan biarkan rentang L tetap lebar -- sering kali (0, 100) untuk menerima kecerahan apa pun -- kecuali aplikasi secara khusus ingin melakukan thresholding pada kecerahan serta warna.

Untuk tuple dengan kurang dari enam nilai, komponen yang hilang secara default ke rentang maksimum (tidak ada batasan pada sumbu tersebut). Sebuah tuple dua elemen (l_lo, l_hi) dalam daftar ambang batas RGB565 oleh karena itu melakukan thresholding hanya pada kecerahan dan cocok dengan setiap warna.

Catatan

Rentang L yang benar-benar lebar memiliki masalah di ujung bawahnya. Saat kecerahan turun mendekati nol, setiap warna bertemu pada hitam, dengan nilai A dan B runtuh mendekati nol dan didominasi oleh noise -- sehingga piksel gelap dapat menyimpang ke dalam rentang A dan B dan dilacak sebagai warna target. Jika wilayah hitam adegan menyala sebagai kecocokan, naikkan l_lo hingga wilayah tersebut tidak terdeteksi.

5.12.4. Flag

Tiga argumen kata kunci mengontrol output:

  • invert=True membalik hasilnya. Setiap piksel yang seharusnya cocok menjadi nol, dan setiap piksel yang seharusnya nol menjadi nilai maksimum. Berguna ketika cara alami untuk mendeskripsikan latar depan adalah dengan apa yang bukan itu.

  • zero=True mengubah mode operasi: piksel yang cocok dinolkan dan piksel yang tidak cocok mempertahankan nilai aslinya. Gunakan ini ketika tujuannya adalah menghapus piksel yang cocok dari citra daripada mereduksi citra menjadi masker biner dari piksel-piksel tersebut.

  • to_bitmap=True mengembalikan hasil sebagai citra BINARY alih-alih menimpa format asli sumber. Hasil satu-bit-per-piksel adalah apa yang langsung diterima oleh argumen masker berikutnya, dan konversi ini sering kali menghemat tekanan memori dari membawa masker berformat penuh.

Mask dan ROI mengikuti konvensi yang sama dengan sisa antarmuka: sebuah persegi panjang roi membatasi operasi ke sub-area, sebuah citra mask membatasinya ke pola posisi yang sembarang.

5.12.5. Secara default di tempat

Seperti operasi aritmetika, binary berjalan di tempat secara default: piksel-piksel citra sumber ditimpa dengan output biner, dan nilai-nilai asli hilang setelah panggilan. Bentuk to_bitmap=True adalah alternatif ketika sumber perlu dipertahankan dan output harus berupa citra BINARY yang baru dialokasikan. Bentuk copy=True juga diterima untuk hasil berformat sama pada buffer baru.