Jpeg. Algoritma kompresi

Halo lagi! Saya menemukan artikel ini, ditulis kembali pada Mei 2019. Ini adalah kelanjutan dari serangkaian artikel tentang WAVE dan JPEG. Inilah yang pertama . Publikasi ini akan mencakup informasi tentang algoritma penyandian gambar dan format itu sendiri secara keseluruhan.


Sedikit sejarah


Satu sendok makan artikel Wikipedia:


JPEG (Joint Photographic Experts Group) adalah salah satu format grafis raster populer yang digunakan untuk menyimpan gambar foto dan gambar serupa.

Standar ini dikembangkan oleh Joint Photographic Experts Group pada tahun 1991 untuk kompresi gambar yang efisien.


Jalur mana yang beralih dari mentah ke jpeg


Beberapa orang berpikir bahwa gambar JPEG adalah data mentah yang dikompres dengan metode Huffman, tetapi ini tidak benar. Sebelum mengontrol kompresi, data berjalan jauh.


Pertama, model warna diubah dari RGB ke YCbCr. Bahkan ada algoritma khusus untuk ini - di sini . Y tidak tersentuh, karena bertanggung jawab atas kecerahan, dan perubahannya akan terlihat.


Hal pertama yang dilakukan dengan gambar adalah subsampling. Ini mudah dipahami: array piksel 2x2 diambil, lalu Cb dan Cr diambil - nilai rata-rata dari masing-masing komponen YCbCr dari 4 piksel ini. Jadi, kami memenangkan 6 byte , bukannya 4 Y, 4 Cb, 4 Cr, kami mendapat 4 Y dan Cb dan Cr yang sama untuk masing-masing (4 + 4 + 4 = 12; 4 + 1 + 1 + 1 = 6; 12 - 6 = 6). Pada skala genap 2x2, kompresi lossy dengan rasio kompresi 2: 1 terdengar solid. Ini berlaku untuk seluruh gambar. Jadi - mereka menjatuhkan setengah ukuran. Dan kita bisa menggunakan teknik ini karena persepsi warna kita. Seseorang akan dengan mudah melihat perbedaan dalam kecerahan, tetapi tidak dalam warna, jika ia dirata-rata dalam blok kecil piksel. Penipisan juga dapat dilakukan dalam satu baris, 4 piksel secara horizontal dan vertikal. Opsi pertama lebih sering digunakan. Jika kualitas gambar penting, penipisan tidak dilakukan sama sekali.
Ilustrasi visual penjarangan (Habr tidak mengizinkan untuk memasukkan gif) - https://i.ibb.co/Rg5Th9H/150953010617579181.gif


Sebagian besar persiapan

DCT

Sekarang bagian yang paling sulit dan perlu. Seluruh gambar dibagi menjadi 8x8 blok (gunakan padding jika resolusi bukan kelipatan dari sisi blok).


Sekarang, untuk setiap blok, DCT (Discrete Cosine Transformation) diterapkan. Pada bagian ini, semua kelebihan dikeluarkan dari gambar. Menggunakan DCT, perlu untuk memahami apakah blok ini (8x8) menggambarkan bagian gambar yang monoton: langit, dinding; atau mengandung struktur yang rumit (rambut, karakter, dll.). Adalah logis bahwa 64 piksel warna yang serupa dapat dijelaskan hanya dalam satu, karena ukuran blok sudah diketahui. Begitu banyak untuk kompresi: 64 ke 1.


DCT mengubah blok menjadi spektrum, dan ketika bacaan berubah tiba-tiba, koefisien menjadi positif, dan semakin tajam transisi, semakin tinggi output. Di mana koefisien lebih tinggi, gambar menunjukkan transisi yang jelas dalam warna dan kecerahan, di mana ia lebih rendah - lemah (halus) perubahan nilai-nilai komponen YCbCr di blok.


Kuantisasi

Sudah ada pengaturan kompresi yang diterapkan. Setiap koefisien dalam masing-masing matriks 8x8 dibagi dengan jumlah tertentu. Jika kualitas gambar setelah semua modifikasinya Anda tidak akan mengurangi lebih banyak, maka pembagi harus menjadi satu. Jika memori yang ditempati oleh foto ini lebih penting bagi Anda, maka pembagi akan lebih besar dari 1, dan hasil bagi akan dibulatkan. Jadi ternyata setelah pembulatan sering ternyata banyak nol.


Kuantisasi dilakukan untuk membuat lebih banyak kompresi. Berikut ini tampilannya pada contoh kuantisasi grafik y = sin (x):


gambar


Kompresi

Pertama kita melalui matriks zig-zag:


gambar


Kami mendapatkan array satu dimensi dengan angka. Kami melihat bahwa ada banyak nol di dalamnya, mereka dapat dihapus. Untuk melakukan ini, alih-alih urutan banyak nol, kita masukkan 1 nol dan setelah itu angka yang menunjukkan nomor mereka dalam urutan. Dengan demikian, Anda dapat mengatur ulang ke 1/3 dari ukuran seluruh array. Dan kemudian kompres array ini menggunakan metode Huffman dan kita masukkan ke dalam file itu sendiri.


Di mana digunakan


Di mana-mana. Seperti PNG, JPEG digunakan dalam kamera, OS (sebagai logo perusahaan, ikon aplikasi, gambar mini) dan di semua area yang memungkinkan di mana Anda perlu menyimpan gambar dengan efisien.


Kesimpulan


Pada saat ini, pengetahuan tentang JPEG hanya berharga untuk tujuan pendidikan, karena sudah built-in dan dioptimalkan di mana-mana oleh sekelompok besar orang tapi granit sains masih enak .


Sumber

Artikel Wikipedia tentang YCbCr
Artikel JPEG di Wikipedia
Sedikit tentang DCT dari pos Picabu
Artikel DCT di Wikipedia

Source: https://habr.com/ru/post/id482728/


All Articles