Mana-mana raster imej boleh diwakili dalam bentuk matriks dua dimensi. Apabila ia datang kepada warna, idea itu boleh dikembangkan dengan melihat imej sebagai matriks tiga dimensi, di mana dimensi tambahan digunakan untuk menyimpan data bagi setiap warna.
Jika kita menganggap warna akhir sebagai gabungan yang dipanggil. warna primer (merah, hijau dan biru), dalam matriks tiga dimensi kami, kami mentakrifkan tiga satah: yang pertama untuk merah, yang kedua untuk hijau dan yang terakhir untuk biru.
Kami akan memanggil setiap titik dalam matriks ini sebagai piksel (elemen imej). Setiap piksel mengandungi maklumat tentang keamatan (biasanya sebagai nilai berangka) bagi setiap warna. Sebagai contoh, piksel merah bermakna ia mengandungi 0 hijau, 0 biru dan merah maksimum. Piksel merah jambu boleh dibentuk menggunakan gabungan tiga warna. Menggunakan julat angka dari 0 hingga 255, piksel merah jambu ditakrifkan sebagai Merah = 255, Hijau = 192 ΠΈ Biru = 203.
Terdapat banyak model lain untuk mewakili warna yang membentuk imej. Sebagai contoh, anda boleh menggunakan palet diindeks, yang memerlukan hanya satu bait untuk mewakili setiap piksel, bukannya tiga yang diperlukan apabila menggunakan model RGB. Dalam model sedemikian, adalah mungkin untuk menggunakan matriks 2D dan bukannya matriks 3D untuk mewakili setiap warna. Ini menjimatkan memori, tetapi memberikan gamut warna yang lebih kecil.
rgb
Sebagai contoh, lihat gambar di bawah ini. Muka pertama dicat sepenuhnya. Yang lain ialah satah merah, hijau dan biru (keamatan warna yang sepadan ditunjukkan dalam skala kelabu).
Kami melihat bahawa warna merah dalam asal akan berada di tempat yang sama di mana bahagian paling terang pada muka kedua diperhatikan. Manakala sumbangan biru terutamanya hanya dapat dilihat pada mata Mario (wajah terakhir) dan elemen pakaiannya. Perhatikan di mana ketiga-tiga satah warna menyumbang paling sedikit (bahagian paling gelap pada imej) - misai Mario.
Untuk menyimpan keamatan setiap warna, bilangan bit tertentu diperlukan - kuantiti ini dipanggil kedalaman sedikit. Katakan 8 bit dibelanjakan (berdasarkan nilai dari 0 hingga 255) setiap satah warna. Kemudian kita mempunyai kedalaman warna 24 bit (8 bit * 3 satah R/G/B).
Satu lagi sifat imej ialah resolusi, iaitu bilangan piksel dalam satu dimensi. Selalunya dilambangkan sebagai lebar Γ tinggi, seperti dalam imej contoh 4 dengan 4 di bawah.
Harta lain yang kami berurusan apabila bekerja dengan imej/video ialah Nisbah aspek, menerangkan hubungan berkadar normal antara lebar dan ketinggian imej atau piksel.
Apabila mereka mengatakan bahawa filem atau gambar tertentu bersaiz 16 hingga 9, mereka biasanya bermaksud nisbah aspek paparan (DAR - dari Nisbah Aspek Paparan). Walau bagaimanapun, kadangkala mungkin terdapat pelbagai bentuk piksel individu - dalam kes ini kita bercakap tentang nisbah piksel (PAR - dari Nisbah Aspek Piksel).
Nota kepada tuan rumah: DVD sepadan dengan DAR 4 hingga 3
Walaupun resolusi DVD sebenar ialah 704x480, ia masih mengekalkan nisbah bidang 4:3 kerana PAR ialah 10:11 (704x10 / 480x11).
Dan akhirnya, kita boleh tentukan video seperti urutan n bingkai untuk tempoh tersebut masa, yang boleh dianggap sebagai dimensi tambahan. A n maka ialah kadar bingkai atau bilangan bingkai sesaat (FPS - dari Bingkai sesaat).
Bilangan bit sesaat yang diperlukan untuk memaparkan video adalah jumlahnya kelajuan penghantaran - kadar bit.
kadar bit = lebar * tinggi * kedalaman bit * bingkai sesaat
Contohnya, video 30 fps, 24 bps, 480x240 memerlukan 82,944,000 bps atau 82,944 Mbps (30x480x240x24) - tetapi itu jika tiada kaedah pemampatan digunakan.
Jika kelajuan pemindahan hampir berterusan, maka ia dipanggil kelajuan penghantaran tetap (CBR - dari kadar bit tetap). Tetapi ia juga boleh berbeza-beza, dalam kes ini ia dipanggil kadar baud berubah-ubah (VBR - dari kadar bit berubah-ubah).
Graf ini menunjukkan VBR terhad, di mana tidak terlalu banyak bit terbuang dalam kes bingkai gelap sepenuhnya.
Jurutera pada mulanya membangunkan kaedah untuk menggandakan kadar bingkai yang dilihat bagi paparan video tanpa menggunakan lebar jalur tambahan. Kaedah ini dikenali sebagai video berjalin; Pada asasnya, ia menghantar separuh skrin dalam "bingkai" pertama dan separuh lagi dalam "bingkai" seterusnya.
Pada masa ini, adegan kebanyakannya dipaparkan menggunakan teknologi pengimbasan progresif. Ia adalah kaedah untuk memaparkan, menyimpan atau menghantar imej bergerak di mana semua garisan setiap bingkai dilukis secara berurutan.
Nah! Kini kita sedar tentang cara imej diwakili secara digital, bagaimana warnanya disusun, berapa banyak bit sesaat yang kita habiskan untuk menunjukkan video, jika kadar bit adalah malar (CBR) atau pembolehubah (VBR). Kami mengetahui tentang peleraian yang diberikan menggunakan kadar bingkai yang diberikan, kami biasa dengan banyak istilah lain, seperti video berjalin, PAR dan beberapa istilah lain.
Mengeluarkan lebihan
Adalah diketahui bahawa video tanpa pemampatan tidak boleh digunakan secara normal. Video selama sejam pada resolusi 720p dan 30 bingkai sesaat akan mengambil masa 278 GB. Kami mencapai nilai ini dengan mendarab 1280 x 720 x 24 x 30 x 3600 (lebar, tinggi, bit setiap piksel, FPS dan masa dalam saat).
Gunakan algoritma pemampatan tanpa kerugian, seperti DEFLATE (digunakan dalam PKZIP, Gzip dan PNG), tidak akan cukup mengurangkan lebar jalur yang diperlukan. Kita perlu mencari cara lain untuk memampatkan video.
Untuk melakukan ini, anda boleh menggunakan ciri penglihatan kami. Kami lebih baik membezakan kecerahan daripada warna. Video ialah satu siri imej berjujukan yang berulang dari semasa ke semasa. Terdapat perbezaan kecil antara bingkai bersebelahan adegan yang sama. Selain itu, setiap bingkai mengandungi banyak kawasan menggunakan warna yang sama (atau serupa).
Warna, kecerahan dan mata kita
Mata kita lebih sensitif kepada kecerahan daripada warna. Anda boleh lihat sendiri dengan melihat gambar ini.
Jika anda tidak melihat bahawa pada separuh kiri imej warna petak A ΠΈ B sebenarnya sama, maka itu perkara biasa. Otak kita memaksa kita untuk memberi lebih perhatian kepada cahaya dan naungan daripada warna. Di sebelah kanan antara petak yang ditetapkan terdapat pelompat dengan warna yang sama - jadi kita (iaitu otak kita) dengan mudah menentukan bahawa, sebenarnya, ia adalah warna yang sama.
Mari lihat (dengan cara yang mudah) bagaimana mata kita berfungsi. Mata adalah organ kompleks yang terdiri daripada banyak bahagian. Walau bagaimanapun, kami paling berminat dengan kon dan rod. Mata mengandungi kira-kira 120 juta batang dan 6 juta kon.
Mari kita pertimbangkan persepsi warna dan kecerahan sebagai fungsi berasingan bahagian mata tertentu (sebenarnya, semuanya agak rumit, tetapi kami akan memudahkannya). Sel rod bertanggungjawab terutamanya untuk kecerahan, manakala sel kon bertanggungjawab untuk warna. Kon dibahagikan kepada tiga jenis, bergantung pada pigmen yang terkandung di dalamnya: kon S (biru), kon M (hijau), dan kon L (merah).
Oleh kerana kita mempunyai lebih banyak rod (kecerahan) daripada kon (warna), kita boleh membuat kesimpulan bahawa kita lebih mampu membezakan peralihan antara gelap dan terang daripada warna.
Ciri Kepekaan Kontras
Penyelidik dalam psikologi eksperimen dan banyak bidang lain telah membangunkan banyak teori penglihatan manusia. Dan salah seorang daripada mereka dipanggil fungsi kepekaan kontras. Mereka berkaitan dengan pencahayaan spatial dan temporal. Ringkasnya, ini mengenai berapa banyak perubahan yang diperlukan sebelum pemerhati menyedarinya. Perhatikan bentuk jamak bagi perkataan "fungsi". Ini disebabkan oleh fakta bahawa kita boleh mengukur fungsi sensitiviti kontras bukan sahaja untuk imej hitam dan putih, tetapi juga untuk imej berwarna. Keputusan eksperimen ini menunjukkan bahawa dalam kebanyakan kes mata kita lebih sensitif kepada kecerahan daripada warna.
Memandangkan kita tahu bahawa kita lebih sensitif terhadap kecerahan imej, kita boleh cuba menggunakan fakta ini.
Model warna
Kami mengetahui sedikit cara untuk bekerja dengan imej berwarna menggunakan skema RGB. Terdapat model lain juga. Terdapat model yang memisahkan pencahayaan daripada kroma dan ia dikenali sebagai YCbCr. Dengan cara ini, terdapat model lain yang membuat bahagian yang sama, tetapi kami hanya akan mempertimbangkan yang ini.
Dalam model warna ini Y ialah perwakilan kecerahan, dan juga menggunakan dua saluran warna: Cb (biru kaya) dan Cr (merah kaya). YCbCr boleh diperoleh daripada RGB, dan penukaran terbalik juga mungkin. Menggunakan model ini kita boleh mencipta imej berwarna penuh seperti yang kita lihat di bawah:
Tukar antara YCbCr dan RGB
Seseorang akan membantah: bagaimana mungkin untuk mendapatkan semua warna jika hijau tidak digunakan?
Untuk menjawab soalan ini, mari tukar RGB kepada YCbCr. Mari kita gunakan pekali yang diterima pakai dalam piawaian BT.601, yang disyorkan oleh unit ITU-R. Bahagian ini menetapkan piawaian untuk video digital. Contohnya: apakah itu 4K? Apakah kadar bingkai, resolusi, model warna yang sepatutnya?
Mula-mula mari kita mengira kecerahan. Mari kita gunakan pemalar yang dicadangkan oleh ITU dan gantikan nilai RGB.
Y = 0.299R + 0.587G + 0.114B
Selepas kami mempunyai kecerahan, kami akan memisahkan warna biru dan merah:
Cb = 0.564(B - Y)
Cr = 0.713(R - Y)
Dan kita juga boleh menukar kembali dan juga menjadi hijau menggunakan YCbCr:
R = Y + 1.402Cr
B = Y + 1.772Cb
G = Y - 0.344Cb - 0.714Cr
Biasanya, paparan (monitor, TV, skrin, dll.) hanya menggunakan model RGB. Tetapi model ini boleh disusun dengan cara yang berbeza:
Pensubsampelan warna
Dengan imej yang diwakili sebagai gabungan pencahayaan dan chrominance, kita boleh mengeksploitasi sensitiviti sistem visual manusia yang lebih besar terhadap kecerahan berbanding chrominance dengan mengalih keluar maklumat secara selektif. Pensubsampelan Chroma ialah kaedah pengekodan imej menggunakan peleraian yang kurang untuk kroma berbanding kecerahan.
Berapa banyak yang dibenarkan untuk mengurangkan resolusi warna?! Ternyata sudah ada beberapa rajah yang menerangkan cara mengendalikan resolusi dan penggabungan (Warna Hasil = Y + Cb + Cr).
Skim ini dikenali sebagai sistem pensampelan rendah dan dinyatakan sebagai nisbah 3 kali ganda - a:x:y, yang menentukan bilangan sampel kecerahan dan isyarat perbezaan warna.
a β standard persampelan mendatar (biasanya sama dengan 4) x β bilangan sampel kroma dalam baris pertama piksel (peleraian mendatar berbanding dengan a) y β bilangan perubahan dalam sampel kroma antara baris pertama dan kedua piksel.
Pengecualian adalah 4:1:0, menyediakan satu sampel kroma dalam setiap blok resolusi pencahayaan 4-oleh-4.
Skim biasa yang digunakan dalam codec moden:
4:4:4 (tiada downsampling)
4:2:2
4:1:1
4:2:0
4:1:0
3:1:1
YCbCr 4:2:0 - contoh gabungan
Berikut ialah imej yang digabungkan menggunakan YCbCr 4:2:0. Ambil perhatian bahawa kami hanya membelanjakan 12 bit setiap piksel.
Beginilah rupa imej yang sama, dikodkan dengan jenis utama subsampel warna. Baris pertama ialah YCbCr terakhir, baris bawah menunjukkan resolusi kroma. Keputusan yang sangat baik, memandangkan sedikit kehilangan kualiti.
Ingat apabila kami mengira 278 GB ruang storan untuk menyimpan fail video selama sejam pada resolusi 720p dan 30 bingkai sesaat? Jika kita menggunakan YCbCr 4:2:0, maka saiz ini akan dikurangkan separuh - 139 GB. Setakat ini, ia masih jauh daripada keputusan yang boleh diterima.
Anda boleh mendapatkan histogram YCbCr sendiri menggunakan FFmpeg. Dalam imej ini, biru menguasai merah, yang jelas kelihatan dalam histogram itu sendiri.
Warna, kecerahan, gamut warna - semakan video
Kami mengesyorkan menonton video hebat ini. Ia menerangkan apa itu kecerahan, dan secara amnya semua titik bertitik Ρ tentang kecerahan dan warna.
Jenis Bingkai
Jom teruskan. Mari cuba untuk menghapuskan lebihan masa. Tetapi pertama, mari kita tentukan beberapa istilah asas. Katakan kita mempunyai filem dengan 30 bingkai sesaat, berikut ialah 4 bingkai pertamanya:
Kita boleh melihat banyak pengulangan dalam bingkai: sebagai contoh, latar belakang biru yang tidak berubah dari bingkai ke bingkai. Untuk menyelesaikan masalah ini, kita boleh mengklasifikasikannya secara abstrak kepada tiga jenis bingkai.
I-frame (IBingkai ntro)
Bingkai-I (bingkai rujukan, bingkai kunci, bingkai dalam) adalah serba lengkap. Tidak kira apa yang anda mahu gambarkan, bingkai-I pada asasnya ialah gambar statik. Bingkai pertama biasanya adalah bingkai-I, tetapi kami akan sentiasa memerhatikan bingkai-I walaupun bukan bingkai pertama.
bingkai-P (PBingkai diredik)
Bingkai-P (bingkai ramalan) mengambil kesempatan daripada fakta bahawa hampir selalu imej semasa boleh dihasilkan semula menggunakan bingkai sebelumnya. Sebagai contoh, dalam bingkai kedua satu-satunya perubahan ialah bola bergerak ke hadapan. Kita boleh mendapatkan bingkai 2 dengan hanya mengubah sedikit bingkai 1, hanya menggunakan perbezaan antara bingkai ini. Untuk membina bingkai 2, kami merujuk kepada bingkai 1 sebelumnya.
β
bingkai B (BBingkai i-ramalan)
Bagaimana pula dengan pautan bukan sahaja ke masa lalu, tetapi juga ke bingkai masa depan untuk memberikan pemampatan yang lebih baik?! Ini pada asasnya ialah bingkai B (bingkai dua arah).
β β
Pengeluaran pertengahan
Jenis bingkai ini digunakan untuk memberikan pemampatan yang terbaik. Kami akan melihat bagaimana ini berlaku dalam bahagian seterusnya. Buat masa ini, mari kita ambil perhatian bahawa yang paling "mahal" dari segi memori yang digunakan ialah bingkai-I, bingkai-P adalah lebih murah, tetapi pilihan yang paling menguntungkan untuk video ialah bingkai-B.
Lebihan sementara (ramalan antara bingkai)
Mari kita lihat pilihan yang kita ada untuk meminimumkan pengulangan dari semasa ke semasa. Kita boleh menyelesaikan jenis redundansi ini menggunakan kaedah ramalan silang.
Kami akan cuba menghabiskan sesedikit mungkin untuk mengekod jujukan bingkai 0 dan 1.
Kita boleh hasilkan penolakan, kita hanya tolak bingkai 1 daripada bingkai 0. Kita dapat bingkai 1, hanya gunakan perbezaan antara ia dan bingkai sebelumnya, sebenarnya kita hanya mengekod baki yang terhasil.
Tetapi bagaimana jika saya memberitahu anda bahawa terdapat kaedah yang lebih baik yang menggunakan lebih sedikit bit?! Mula-mula, mari pecahkan bingkai 0 kepada grid yang jelas yang terdiri daripada blok. Dan kemudian kami akan cuba memadankan blok dari bingkai 0 dengan bingkai 1. Dengan kata lain, kami akan menganggarkan pergerakan antara bingkai.
Dari Wikipedia - pampasan gerakan blok
Pampasan gerakan blok membahagikan bingkai semasa kepada blok tidak bertindih dan vektor pampasan gerakan melaporkan asal blok (salah tanggapan yang biasa ialah sebelumnya bingkai dibahagikan kepada blok tidak bertindih, dan vektor pampasan gerakan memberitahu ke mana blok tersebut pergi. Tetapi sebenarnya, ia adalah sebaliknya - bukan bingkai sebelumnya yang dianalisis, tetapi yang seterusnya; tidak jelas ke mana blok itu bergerak, tetapi dari mana asalnya). Biasanya blok sumber bertindih dalam bingkai sumber. Sesetengah algoritma pemampatan video memasang bingkai semasa daripada bahagian bukan satu pun, tetapi beberapa bingkai yang dihantar sebelum ini.
Semasa proses penilaian, kita melihat bahawa bola telah bergerak dari (x= 0, y=25) oleh (x= 6, y=26), nilai x ΠΈ y tentukan vektor gerakan. Satu lagi langkah yang boleh kita lakukan untuk mengekalkan bit ialah mengekod hanya perbezaan vektor gerakan antara kedudukan blok terakhir dan yang diramalkan, jadi vektor gerakan akhir ialah (x=6-0=6, y=26-25=1 ).
Dalam keadaan sebenar, bola ini akan dibahagikan kepada n blok, tetapi ini tidak mengubah intipati perkara itu.
Objek dalam bingkai bergerak dalam tiga dimensi, jadi apabila bola bergerak, ia boleh menjadi lebih kecil secara visual (atau lebih besar jika ia bergerak ke arah penonton). Adalah perkara biasa bahawa tidak akan ada padanan sempurna antara blok. Berikut ialah gabungan pandangan anggaran kami dan gambaran sebenar.
Tetapi kita melihat bahawa apabila kita menggunakan anggaran gerakan, terdapat lebih sedikit data untuk pengekodan berbanding apabila menggunakan kaedah yang lebih mudah untuk mengira delta antara bingkai.
Apakah rupa pampasan gerakan sebenar
Teknik ini digunakan pada semua blok sekaligus. Selalunya bola bergerak bersyarat kita akan dibahagikan kepada beberapa blok sekaligus.
Anda boleh merasai sendiri konsep ini menggunakan Musytari.
Untuk melihat vektor gerakan, anda boleh membuat video ramalan luaran menggunakan ffmpeg.
Anda juga boleh menggunakan Penganalisis Video Intel Intel (ia berbayar, tetapi terdapat percubaan percuma yang terhad kepada sepuluh bingkai pertama sahaja).
Lebihan ruang (ramalan dalaman)
Jika kita menganalisis setiap bingkai dalam video, kita akan menemui banyak kawasan yang saling berkaitan.
Mari kita lihat contoh ini. Pemandangan ini terutamanya terdiri daripada warna biru dan putih.
Ini adalah bingkai-I. Kami tidak boleh mengambil bingkai sebelumnya untuk ramalan, tetapi kami boleh memampatkannya. Mari kita mengekod pemilihan blok merah. Jika kita melihat jirannya, kita dapati terdapat beberapa trend warna di sekelilingnya.
Kami menganggap bahawa warna tersebar secara menegak dalam bingkai. Ini bermakna warna piksel yang tidak diketahui akan mengandungi nilai jirannya.
Ramalan sedemikian mungkin ternyata tidak betul. Atas sebab inilah anda perlu menggunakan kaedah ini (ramalan dalaman), dan kemudian menolak nilai sebenar. Ini akan memberi kita blok baki, yang akan menghasilkan matriks yang lebih termampat berbanding dengan yang asal.
Jika anda ingin berlatih dengan ramalan dalaman, anda boleh membuat video sekatan makro dan ramalannya menggunakan ffmpeg. Untuk memahami maksud setiap warna blok, anda perlu membaca dokumentasi ffmpeg.
Atau anda boleh menggunakan Intel Video Pro Analyzer (seperti yang saya nyatakan di atas, versi percubaan percuma terhad kepada 10 bingkai pertama, tetapi ini akan mencukupi untuk anda pada mulanya).