4.13. Format Piksel

Tahap akhir dari pipeline ISP mengemas setiap piksel ke dalam tata letak byte tertentu di memori. Format yang dipilih menyeimbangkan kualitas citra, ukuran memori, dan cara kode hilir membaca byte tersebut. Beberapa format mendominasi.

4.13.1. RAW (Bayer)

Output default adalah Bayer mentah -- mosaik satu channel per piksel yang sama seperti yang dihasilkan sensor. Satu byte per piksel, ditata dalam pola Bayer: merah dan hijau bergantian pada baris genap, hijau dan biru bergantian pada baris ganjil. Tidak ada debayering yang diterapkan, sehingga setiap sel masih menyimpan hanya nilai yang diloloskan filter warnanya.

Bayer mentah menggunakan sepertiga memori dari citra RGB tiga-channel yang sudah jadi -- satu byte per piksel dibanding tiga -- dan tidak ada siklus ISP yang dihabiskan untuk debayering atau konversinya. Biayanya adalah bahwa kode pengguna harus melakukan debayering sendiri sebelum pemrosesan yang sadar warna dapat berjalan.

4.13.2. RGB888

RGB888 adalah format yang sudah jadi yang natural untuk citra warna: tiga byte per piksel, masing-masing satu untuk channel merah, hijau, dan biru pada 8 bit per channel. Dua puluh empat bit per piksel dan hampir tujuh belas juta warna berbeda.

RGB888 adalah referensi konseptual untuk citra warna yang sudah jadi dan sebagian besar perangkat lunak di luar papan mendukungnya. Pada perangkat keras tertanam, kelemahan utamanya adalah ukuran piksel 24-bit -- bukan kelipatan ukuran kata prosesor, tidak nyaman untuk perataan memori, dan 50% lebih besar dari format berikutnya.

4.13.3. RGB565

RGB565 mengemas setiap piksel ke dalam dua byte: lima bit merah, enam bit hijau, lima bit biru. Bit hijau tambahan mencerminkan sensitivitas mata yang lebih tinggi terhadap hijau, dan sesuai dengan bobot ganda channel hijau dalam pola Bayer.

RGB565 adalah format warna default pada OpenMV Cam. Dua byte per piksel sejajar 16-bit, yang sesuai dengan lebar data alami MCU -- beban piksel, penyimpanan, dan aritmatika semuanya berjalan pada kecepatan penuh, dan banyak operasi dapat memproses sepasang piksel sekaligus. Piksel 24-bit RGB888 tidak sejajar demikian dan membayar biaya pada setiap akses. Penghematan memori 33 persen dibanding RGB888 juga terakumulasi: QVGA (320 x 240) berukuran 150 KB dalam RGB565 dibanding 225 KB dalam RGB888, dan selisihnya semakin besar dengan resolusi.

Trade-off-nya adalah 65 ribu warna berbeda alih-alih tujuh belas juta. Untuk sebagian besar tugas visi mesin, perbedaannya tidak terlihat, karena algoritma mereduksi bingkai menjadi representasi yang telah di-threshold atau dideteksi tepinya yang menghilangkan sebagian besar detail warna. Untuk pandangan manusia, bit yang hilang muncul sebagai banding samar dalam gradien warna halus tetapi bukan sesuatu yang langsung ditandai oleh mata.

4.13.4. YUV422

YUV422 membagi warna setiap piksel menjadi nilai luminansi (Y) dan dua nilai krominansi (U dan V), kemudian melakukan subsampel krominansi karena penglihatan manusia jauh kurang sensitif terhadap variasi warna daripada variasi kecerahan. Setiap piksel membawa Y-nya sendiri, tetapi pasangan piksel yang berdekatan berbagi satu U dan satu V. Tata letak byte untuk setiap pasangan adalah empat byte -- Y0, U, Y1, V -- yang menghasilkan rata-rata dua byte per piksel, identik dengan RGB565.

Namun, kedua byte tersebut berarti sesuatu yang berbeda dari RGB565. Channel Y saja sudah merupakan citra skala abu-abu 8-bit yang siap digunakan, yang merupakan input yang sebenarnya dikonsumsi oleh sebagian besar algoritma visi mesin klasik (deteksi tepi, pencocokan template, analisis blob); channel U dan V membawa informasi warna untuk sejumlah kecil algoritma yang membutuhkannya.

YUV422 adalah pilihan yang tepat ketika pipeline membutuhkan keduanya -- algoritma tahap awal yang hanya membaca Y diikuti oleh tahap selanjutnya yang menggunakan chroma untuk keputusan warna yang lebih halus -- karena nilai Y sudah ada di sana siap digunakan tanpa konversi ruang warna.

4.13.5. Skala Abu-Abu

Skala abu-abu adalah satu byte per piksel: hanya nilai luminansi, tanpa warna sama sekali. Ini adalah format yang sudah jadi paling kecil -- setengah ukuran RGB565 dan YUV422, sepertiga ukuran RGB888.

Sebagian besar algoritma visi mesin klasik bekerja pada skala abu-abu, sehingga menghapus channel warna langsung dari sensor seringkali merupakan pilihan paling sederhana dan paling efisien memori. Deteksi tepi, pencarian garis, analisis blob, dekoding kode QR, pencocokan template, dan deteksi AprilTag semuanya berjalan pada skala abu-abu dan diuntungkan dari buffer yang lebih kecil.

4.13.6. Format Lainnya

Beberapa format yang dapat dihasilkan OpenMV Cam tidak keluar dari pipeline ISP sebagai bagian dari alur normal.

BINARY adalah satu bit per piksel -- representasi terkecil yang mungkin. Digunakan untuk citra yang telah di-threshold, buffer masker, dan output dari operasi apa pun yang hanya membedakan antara cocok dan tidak cocok di setiap piksel.

JPEG adalah format warna terkompresi. Beberapa sensor menyertakan encoder JPEG on-chip dan dapat mengirimkan bingkai yang dikompresi JPEG secara langsung; untuk sensor tanpa encoder, MCU menjalankan encoder JPEG pada bingkai RGB atau skala abu-abu yang sudah jadi setelah ISP. Dalam kedua kasus, outputnya adalah bitstream JPEG, berguna untuk menyimpan bingkai ke penyimpanan atau mengirimkannya melalui tautan yang terbatas bandwidth.

PNG adalah format terkompresi lossless. Sensor tidak menghasilkan PNG secara langsung; MCU mengompresi bingkai RGB atau skala abu-abu yang sudah jadi sesuai permintaan. Berguna ketika bandwidth atau penyimpanan penting tetapi kompresi lossy yang diterapkan JPEG akan membuang informasi yang nanti dibutuhkan aplikasi.