5.5. Wilayah dan Mask¶
Setiap operasi dalam modul image menyentuh setiap piksel dari citra sumbernya secara default. Itulah perilaku paling sederhana untuk dijelaskan, dan yang tepat ketika tugas algoritma benar-benar mencakup seluruh bingkai -- koreksi warna yang seragam, histogram global, atau pass pengkodean untuk transmisi. Namun sebagian besar algoritma dalam praktiknya ingin melihat lebih sedikit dari itu. Pelacak blob yang mengawasi penanda berwarna peduli tentang bagian adegan tempat penanda tersebut bisa muncul, bukan dinding di belakangnya. Pass pembersihan morfologis hanya aman dilakukan pada piksel yang telah ditandai oleh tahap sebelumnya sebagai kandidat. Sebuah detektor wajah mungkin hanya berjalan di dalam kotak pembatas yang sudah dipersempit oleh detektor yang lebih kasar. Modul image mendukung pekerjaan tersebut melalui dua mekanisme yang membatasi operasi pada subset piksel: wilayah yang diminati (ROI) berbentuk persegi panjang, dan mask biner. Keduanya dapat dikombinasikan secara bebas, dan hampir setiap metode yang menyentuh piksel menerima salah satu atau keduanya -- sebagai argumen kata kunci.
5.5.1. Wilayah yang Diminati (ROI)¶
Wilayah yang diminati adalah persegi panjang piksel yang dinamai dengan tuple empat elemen (x, y, w, h) yang diperkenalkan di halaman koordinat. Sekitar tiga puluh metode pada antarmuka menerima argumen kata kunci roi; ketika diberikan, operasi hanya berjalan pada piksel di dalam persegi panjang tersebut dan membiarkan sisa citra tidak tersentuh. Ketika roi adalah None atau dihilangkan, operasi berjalan di seluruh citra -- sama seperti jika roi=(0, 0, width, height) telah diberikan.
Dalam kode, kata kunci tersebut berada di samping argumen lain yang diterima operasi:
# Compute a histogram over a centred crop of the image.
h = img.get_histogram(roi=(64, 64, 128, 128))
Hal pertama yang dibeli ROI adalah kontrol positif palsu. Pelacak warna yang hanya melihat meja tidak akan pernah terpicu oleh kaos yang berjalan melewatinya; detektor tepi yang hanya berjalan di dalam area kerja yang ditentukan tidak akan pernah melaporkan tepi dari dudukan kamera itu sendiri. Mempersempit area pencarian ke bagian adegan yang benar-benar dipedulikan oleh algoritma adalah peningkatan paling murah yang dapat dilakukan sebuah pipeline untuk meningkatkan keandalannya sendiri.
Hal kedua yang dibeli adalah pipeline dari kasar ke halus. Objek hasil deteksi -- sebuah blob, sebuah rect, sebuah apriltag, dan sebagainya -- memperlihatkan kotak pembatasnya sebagai tuple empat elemen (x, y, w, h) yang sama yang diterima roi. Jadi tahap pertama yang kasar dapat mengembalikan kotak pembatas, kotak tersebut langsung dimasukkan ke dalam roi tahap berikutnya, dan tahap kedua berjalan di area yang lebih sempit. Setiap penyempitan progresif baik mempercepat tahap berikutnya maupun membuat hasilnya lebih andal, karena ruang pencarian sudah difilter.
5.5.2. Mask Biner¶
Persegi panjang adalah bentuk yang tepat ketika area yang diminati sejajar dengan sumbu. Ketika tidak demikian -- wilayah melengkung, wilayah non-konveks, piksel yang diklasifikasikan oleh tahap sebelumnya sebagai "kecocokan" -- operasi harus diberitahu untuk membatasi dirinya pada pola piksel yang arbitrer. Mekanisme untuk itu adalah mask biner: Image terpisah dengan dimensi yang sama dengan sumber, digunakan sebagai sakelar on/off per piksel. Piksel non-nol dalam mask berarti "sertakan piksel sumber yang sesuai"; piksel nol berarti "biarkan piksel sumber tidak diubah."
Sebuah mask biasanya berupa citra BINARY -- format satu bit per piksel yang ada persis untuk tujuan ini -- tetapi setiap citra satu saluran akan berfungsi, karena konsumen memperlakukan nilai non-nol apa pun sebagai on.
Metode pemfilteran, pengambangan, dan aritmatika menerima argumen kata kunci mask. Formatnya sama di setiap metode: citra biner yang dialokasikan secara terpisah, dengan dimensi yang sama dengan sumber, diteruskan melaluinya.
ROI dan mask saling melengkapi. Berikan keduanya, dan operasi hanya berjalan pada piksel yang berada di dalam ROI dan aktif dalam mask. Kedua mekanisme memberikan kode aplikasi pengontrol yang independen -- satu untuk area persegi panjang yang diminati, satu untuk pola arbitrer di dalamnya -- tanpa membuat salah satu bentuk mewarisi batasan dari yang lain.
ROI membatasi operasi pada persegi panjang yang sejajar sumbu. Sebuah mask lebih lanjut mempersempitnya ke pola piksel yang arbitrer. Keduanya saling melengkapi: hanya piksel yang berada di dalam ROI dan aktif dalam mask yang dimodifikasi.¶
5.5.3. Membangun Mask¶
Tiga metode Image membangun geometri mask umum di tempat dengan mengosongkan piksel di luar wilayah yang dipilih:
mask_rectangle()mempertahankan sebuah persegi panjang.mask_circle()mempertahankan sebuah lingkaran.mask_ellipse()mempertahankan sebuah elips.
Masing-masing mengambil (x, y, w, h) (untuk persegi panjang dan elips) atau (x, y, radius) (untuk lingkaran). Memanggil salah satunya tanpa argumen akan memusatkan geometri dan mengukurnya untuk memenuhi citra, yang merupakan bentuk yang digunakan aplikasi ketika tujuannya adalah oval atau lingkaran penuh citra sederhana yang tidak menyembunyikan apapun selain sudut-sudutnya.
mask = image.Image(img.width(), img.height(), image.BINARY)
mask.clear() # start from all zeros
mask.mask_ellipse() # centred, full-size oval
Mask yang menarik jarang berasal dari metode mask_* saja. Mereka berasal dari tahap pipeline sebelumnya: sebuah pass pengambangan menghasilkan citra biner yang piksel non-nolnya menandai kecocokan, persis dalam bentuk yang tepat untuk dimasukkan ke dalam argumen mask= tahap berikutnya. Sebuah pass pembersihan morfologis memperhalus mask tersebut tanpa mengubah formatnya. Apapun yang berakhir sebagai citra satu saluran adalah mask yang valid.
5.5.4. Cara Operasi Memodifikasi Citra¶
Sebuah pola yang terlihat di setiap cuplikan kode di beberapa halaman terakhir -- operasi mengembalikan img yang sama untuk chaining -- layak untuk ditarik keluar secara eksplisit agar tidak perlu dinyatakan ulang setiap kali metode baru diperkenalkan. Tiga keluarga metode muncul pada antarmuka Image, masing-masing memperlakukan citra sumber secara berbeda:
Metode operasi memodifikasi piksel sumber di tempat dan mengembalikan citra yang sama untuk chaining. Keluarga gambar, aritmatika, ambang batas, dan filter semua berperilaku demikian.
img.gaussian(1)mengaburkanimgdan mengembalikanimgyang sama; penugasan ulang --img = img.gaussian(1)-- tidak berbahaya tetapi tidak diperlukan.Metode konversi beroperasi di tempat secara default dengan cara yang sama seperti metode operasi, tetapi menerima
copy=Truedancopy_to_fb=Trueuntuk mengalokasikan citra hasil terpisah ketika sumber perlu dipertahankan. Konversi format dan salinan geometris adalah anggota utama dari keluarga ini.Metode inspeksi membaca piksel dan mengembalikan objek hasil -- daftar fitur yang terdeteksi, histogram, sekumpulan statistik -- tanpa memodifikasi citra sumber sama sekali.
Trikotomi tersebut konsisten di seluruh antarmuka. Mengetahui keluarga mana suatu metode menjadi miliknya memberi tahu aplikasi apa yang diharapkan dari sebuah panggilan: apakah piksel sumber akan tetap utuh, apakah citra hasil terpisah akan dialokasikan, dan apakah nilai kembalian adalah sumber itu sendiri atau sesuatu yang lain.