jpeg. Algoritma kompresi

Halo lagi! Saya menemukan artikel ini ditulis pada Mei 2019. Ini lanjutan dari rangkaian artikel tentang WAVE dan JPEG, nih pertama. Publikasi ini akan memuat informasi tentang algoritma pengkodean gambar dan format itu sendiri secara keseluruhan.

Sedikit sejarah

Satu sendok makan artikel Wikipedia:

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

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

Bagaimana cara mengubah gambar dari mentah ke JPEG?

Beberapa orang mengira gambar JPEG adalah data mentah yang dikompresi menggunakan metode Huffman, padahal ini tidak benar. Sebelum mengontrol kompresi, data melakukan perjalanan jauh.

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

Hal pertama yang harus dilakukan dengan gambar adalah "penjarangan" (subsampling). Mudah dipahami: diambil array piksel berukuran 2x2, kemudian diambil Cb dan Cr - nilai rata-rata masing-masing komponen YCbCr dari 4 piksel tersebut. Jadi, kami memenangkan 6 byte, alih-alih 4 Y, 4 Cb, 4 Cr kita mendapatkan 4 Y dan Cb dan Cr yang sama untuk masing-masingnya (4 + 4 + 4 = 12; 4 + 1 + 1 = 6; 12 - 6 = 6). Pada skala genap 2x2, kompresi lossy dengan rasio kompresi 2:1 terdengar solid. Ini berlaku untuk keseluruhan gambar. Jadi - mereka turun setengah ukuran. Dan kita bisa menggunakan teknik ini berkat persepsi warna kita. Seseorang akan dengan mudah melihat perbedaan kecerahan, tetapi tidak dalam warna, jika dirata-ratakan pada blok kecil piksel. Thinning juga dapat dilakukan secara garis, 4 piksel secara horizontal dan vertikal. Opsi pertama lebih sering digunakan. Jika kualitas gambar penting, maka penipisan tidak dilakukan sama sekali.
Ilustrasi visual penipisan (Habr tidak mengizinkan saya memasukkan gif) - https://i.ibb.co/Rg5Th9H/150953010617579181.gif

Bagian utama dari persiapan

Dkp

Sekarang sampai pada bagian tersulit dan paling penting. Keseluruhan gambar dibagi menjadi blok-blok berukuran 8x8 (pengisian digunakan jika resolusinya bukan kelipatan sisi blok).

Sekarang terapkan ke setiap blok DCT (Transformasi Kosinus Diskrit). Di bagian ini, segala sesuatu yang tidak perlu dihilangkan dari gambar. Dengan menggunakan DCT, Anda perlu memahami apakah blok tertentu (8Γ—8) mendeskripsikan bagian gambar yang monoton: langit, dinding; atau mengandung struktur kompleks (rambut, simbol, dll.). Masuk akal jika 64 piksel dengan warna serupa dapat dijelaskan hanya dengan 1, karena ukuran blok sudah diketahui. Begitu banyak untuk kompresi: 64 banding 1.

DCT mengubah blok menjadi spektrum, dan jika pembacaannya berubah tajam, koefisiennya menjadi positif, dan semakin tajam transisinya, semakin tinggi outputnya. Jika koefisiennya lebih tinggi, gambar menunjukkan transisi warna dan kecerahan yang jelas, jika koefisiennya lebih rendah, perubahan lemah (halus) pada nilai komponen YCbCr di blok.

kuantisasi

Pengaturan kompresi sudah diterapkan di sini. Masing-masing koefisien pada setiap matriks 8x8 dibagi dengan suatu bilangan tertentu. Jika Anda tidak ingin mengurangi kualitas gambar setelah semua modifikasinya, maka pembaginya harus satu. Jika memori yang ditempati oleh foto ini lebih penting bagi Anda, maka pembaginya akan lebih besar dari 1, dan hasil bagi akan dibulatkan. Ternyata setelah pembulatan sering kali Anda mendapatkan banyak angka nol.

Kuantisasi dilakukan untuk menciptakan kemungkinan kompresi yang lebih besar. Berikut tampilannya dengan menggunakan contoh kuantisasi grafik y = sin(x):

jpeg. Algoritma kompresi

Kompresi

Pertama kita menelusuri matriks dalam pola zig-zag:

jpeg. Algoritma kompresi

Kami mendapatkan array satu dimensi dengan angka. Kami melihat ada banyak angka nol di dalamnya, bisa dihilangkan. Untuk melakukan ini, alih-alih barisan banyak angka nol, kita memasukkan 1 angka nol dan setelah itu angka yang menunjukkan nomornya dalam urutan tersebut. Dengan cara ini Anda dapat mengatur ulang ke 1/3 ukuran keseluruhan array. Dan kemudian kita cukup mengompres array ini menggunakan metode Huffman dan menuliskannya ke dalam file itu sendiri.

Dimana digunakan

Di mana pun. Seperti PNG, JPEG digunakan di kamera, OS (sebagai logo perusahaan, ikon aplikasi, thumbnail) dan di semua area yang memungkinkan gambar perlu disimpan secara efisien.

Keluaran

Saat ini, pengetahuan tentang JPEG kini hanya berharga untuk tujuan pendidikan, karena sudah dibangun di mana-mana dan dioptimalkan oleh banyak orang, namun granit sains tetap enak.

sumber

Artikel tentang YCbCr di Wikipedia
Artikel Wikipedia tentang JPEG
Sedikit tentang PrEP dari postingan Pikabu
Artikel Wikipedia tentang PrEP

Sumber: www.habr.com

Tambah komentar