Konsep-konsep yang telah kita lihat dalam beberapa bagian terakhir muncul dalam pengolahan citra dan digunakan setiap hari tanpa selalu kita sadari. Bagian ini memperkenalkan algoritma kompresi JPEG dan transformasi Fourier diskret sebagai penerapan gagasan-gagasan tersebut. Selain memperlihatkan kekuatan cara berpikir aljabar linear, penerapan ini membantu menjadikan beberapa konsep abstrak yang telah kita kembangkan lebih konkret dan wajar.
Citra digital, seperti foto yang diambil dengan ponsel Anda, ditampilkan sebagai larik piksel berbentuk persegi panjang. Sebagai contoh, foto pada Gambar 3.3.1 memiliki lebar 1440 piksel dan tinggi 1468 piksel. Jika foto tersebut kita perbesar, kita dapat melihat piksel-pikselnya satu per satu, seperti yang ditampilkan di sebelah kanan.
Foto dinding ngarai gurun dengan latar langit biru. Terdapat bayangan pekat pada dinding ngarai, tetapi sebagian besar dinding berwarna jingga yang cukup seragam. Langitnya juga berwarna biru yang cukup seragam.
Satu blok piksel \(8\times8\) yang diambil dari foto pemandangan gurun. Blok ini diambil dari daerah yang ditempati dinding ngarai. Warna ke-64 piksel tersebut tidak banyak berubah. Semuanya berwarna jingga yang cukup seragam dengan sedikit perubahan kecerahan.
Diperlukan banyak data untuk menampilkan citra ini. Banyaknya data digital sering diukur dalam bita; satu bita adalah kapasitas penyimpanan yang diperlukan untuk mencatat sebuah bilangan bulat antara 0 dan 255. Seperti yang akan segera kita lihat, setiap piksel memerlukan tiga bita untuk mencatat warnanya. Artinya, banyaknya data yang diperlukan untuk menampilkan citra ini adalah \(3\times1440\times1468 = 6,341,760\) bita atau sekitar 6,3 megabita.
Tentu saja, kita ingin menyimpan citra ini di ponsel atau komputer dan mungkin mengirimkannya melalui paket data untuk dibagikan kepada orang lain. Jika mungkin, kita ingin menemukan cara merepresentasikan citra ini dengan lebih sedikit data agar memori ponsel tidak habis dan paket data tidak cepat terkuras.
Seperti yang akan kita lihat dalam bagian ini, algoritma kompresi JPEG menyediakan cara untuk melakukan hal tersebut. Ketika disimpan dalam format JPEG, citra ini hanya memerlukan 467.359 bita data, yaitu sekitar 7% dari 6,3 megabita yang diperlukan untuk menampilkan citra. Dengan kata lain, ketika menampilkan citra ini, kita merekonstruksinya hanya dari 7% data aslinya. Hal ini tidak terlalu mengejutkan karena citra tersebut memiliki cukup banyak redundansi; bagian kiri citra hampir seluruhnya berwarna biru seragam. Algoritma JPEG mendeteksi redundansi ini dengan merepresentasikan data menggunakan basis-basis yang sesuai untuk tugas tersebut.
Misalkan kita memiliki basis \(\bcal=\{\vvec_1,\vvec_2,\ldots,\vvec_m\}\) untuk \(\real^m\text{.}\) Jelaskan apa yang dimaksud dengan representasi \(\coords{\xvec}{\bcal}\) dari vektor \(\xvec\) dalam sistem koordinat yang ditentukan oleh \(\bcal\text{.}\)
Secara digital, warna direpresentasikan oleh vektor dalam \(\real^3\text{.}\) Namun, ada berbagai cara untuk merepresentasikan warna, bergantung pada apakah warna itu akan diproses oleh komputer atau manusia. Kita akan menjelaskan dua representasi tersebut, yang disebut model warna, dan memperlihatkan penggunaannya dalam algoritma kompresi JPEG.
Layar digital biasanya menghasilkan warna dengan mencampurkan merah, hijau, dan biru dalam kadar yang berbeda-beda. Karena itu, kita dapat menjelaskan suatu warna dengan memasukkan kadar merah, hijau, dan biru penyusunnya ke dalam vektor \(\threevec{R}{G}{B}\text{.}\) Besaran \(R\text{,}\)\(G\text{,}\) dan \(B\) masing-masing disimpan dalam satu bita informasi, sehingga berupa bilangan bulat antara 0 dan 255. Representasi ini disebut model warna \(RGB\text{.}\)
Koordinat \(Y\) disebut luminans, sedangkan \(C_b\) dan \(C_r\) masing-masing disebut krominans biru dan merah. Dalam sistem koordinat ini, luminans bernilai antara 0 dan 255, sedangkan krominans bernilai antara -127,5 dan 127,5. Representasi ini dikenal sebagai model warna \(YC_bC_r\text{.}\) (Agar sepenuhnya tepat, seharusnya kita menambahkan 127,5 pada nilai krominans supaya berada antara 0 dan 255, tetapi hal itu tidak perlu kita perhatikan di sini.)
Diagram interaktif untuk menjelajahi model warna \(RGB\text{.}\) Terdapat tiga penggeser yang memungkinkan pembaca mengubah besaran \(R\text{,}\)\(G\text{,}\) dan \(B\text{.}\) Warna yang dihasilkan kemudian ditampilkan.
Diagram di bawah memungkinkan Anda membuat warna dengan kadar merah, hijau, dan biru yang berbeda-beda. Untuk masing-masing dari ketiga besaran ini, penggeser bergerak antara 0 dan 255.
Diagram interaktif untuk menjelajahi model warna \(YC_bC_r\text{.}\) Terdapat tiga penggeser yang memungkinkan pembaca mengubah besaran \(Y\text{,}\)\(C_b\text{,}\) dan \(C_r\text{.}\) Warna yang dihasilkan kemudian ditampilkan.
Diagram di bawah memungkinkan Anda membuat warna menggunakan berbagai nilai luminans \(Y\text{,}\) krominans biru \(C_b\text{,}\) dan krominans merah \(C_r\text{.}\) Penggeser luminans bergerak antara 0 dan 255, sedangkan penggeser krominans bergerak antara -127,5 dan 127,5.
Tentukan matriks \(P_{\bcal}\) yang mengonversi koordinat \(\threevec{Y}{C_b}{C_r}\) menjadi koordinat \(\threevec{R}{G}{B}\text{.}\) Kemudian tentukan matriks \(P_{\bcal}^{-1}\) yang mengonversi koordinat \(\threevec{R}{G}{B}\) kembali menjadi koordinat \(\threevec{Y}{C_b}{C_r}\text{.}\)
Tentukan koordinat \(\threevec{Y}{C_b}{C_r}\) untuk warna-warna berikut dan, dengan menggunakan diagram di atas, periksalah bahwa kedua representasinya sesuai.
Merah murni adalah \(\threevec{R}{G}{B}=
\threevec{255}{0}{0}\text{.}\)
Tentukan koordinat \(\threevec{R}{G}{B}\) untuk warna-warna berikut dan, dengan menggunakan diagram di atas, periksalah bahwa kedua representasinya sesuai.
Kedua model warna ini menyediakan dua cara untuk merepresentasikan warna, dan masing-masing berguna dalam konteks tertentu. Layar digital, seperti layar ponsel dan monitor komputer, menghasilkan warna dengan menggabungkan kadar merah, hijau, dan biru yang berbeda-beda. Oleh karena itu, model \(RGB\) paling sesuai untuk penerapan digital.
Sebaliknya, model warna \(YC_bC_r\) dibuat berdasarkan penelitian mengenai penglihatan manusia dan bertujuan memusatkan data yang paling penting secara visual ke dalam satu koordinat, yaitu luminans, yang paling peka ditangkap mata kita. Tentu saja, setiap basis \(\real^3\) harus memiliki tiga vektor, sehingga kita memerlukan dua koordinat lagi, yaitu krominans biru dan merah, jika ingin merepresentasikan semua warna.
Untuk melihatnya secara jelas, Gambar 3.3.4 menampilkan citra asli dan citra yang dirender hanya dengan luminans. Artinya, di sebelah kanan, warna setiap piksel direpresentasikan hanya oleh satu bita, yaitu luminans. Citra ini pada dasarnya tampak seperti versi skala abu-abu dari citra asli dengan seluruh detail visualnya. Bahkan, sebelum televisi digital menjadi standar, sinyal televisi disiarkan dengan model warna \(YC_bC_r\text{.}\) Ketika sinyal ditampilkan pada televisi hitam-putih, luminans ditampilkan sedangkan kedua nilai krominans diabaikan begitu saja.
Foto dinding ngarai gurun dengan latar langit biru. Terdapat bayangan pekat pada dinding ngarai, tetapi sebagian besar dinding berwarna jingga yang cukup seragam. Langitnya juga berwarna biru yang cukup seragam.
Foto yang sama dengan hanya nilai luminans setiap piksel yang ditampilkan. Citra ini pada dasarnya tampak seperti versi hitam-putih dari foto tersebut, dan sebagian besar detail dalam foto masih dapat dikenali. Citra ini memuat banyak informasi visual.
Sebagai perbandingan, Gambar 3.3.5 menampilkan citra-citra yang bersesuaian dan dibuat hanya dengan krominans biru dan krominans merah. Perhatikan bahwa detail visual dalam citra-citra ini jauh lebih sedikit.
Foto yang sama dengan hanya krominans biru yang ditampilkan. Informasi visualnya tidak sebanyak sebelumnya, dan ciri-ciri dalam foto lebih sulit dikenali.
Foto yang sama dengan hanya krominans merah yang ditampilkan. Informasi visualnya tidak sebanyak sebelumnya, dan ciri-ciri dalam foto lebih sulit dikenali.
Tujuan algoritma kompresi JPEG adalah merepresentasikan citra dengan data sesedikit mungkin. Dengan mengonversi dari model warna \(RGB\) ke model warna \(YC_bC_r\text{,}\) kita memusatkan data yang paling penting secara visual ke dalam nilai-nilai luminans. Hal ini berguna karena sebagian data dalam nilai krominans dapat diabaikan dengan aman sebab data tersebut tidak sepenting luminans secara visual.
Kunci untuk merepresentasikan citra dengan lebih sedikit data adalah mendeteksi redundansi dalam data tersebut. Sebagai langkah awal, kita membagi citra yang tersusun atas \(1440\times 1468\) piksel menjadi blok-blok kecil berukuran \(8\times8\) piksel. Sebagai contoh, kita akan meninjau blok \(8\times8\) piksel yang diberi garis tepi hijau pada citra asli di sebelah kiri Gambar 3.3.6. Citra di sebelah kanan memperbesar blok itu.
Foto dinding ngarai gurun dengan blok piksel berukuran delapan kali delapan yang disorot. Blok piksel yang diambil dari bagian dinding ngarai itu tampak sangat kecil.
Foto dan blok piksel berukuran delapan kali delapan yang sama ditampilkan pada skala berbeda agar pembaca dapat melihat beberapa detail di dalam blok piksel.
Gambar3.3.6.Blok piksel \(8\times8\) yang diberi garis tepi hijau pada citra asli di sebelah kiri. Blok yang sama tampak pada skala yang lebih kecil di sebelah kanan.
Perhatikan bahwa blok ini tampak sangat kecil pada citra asli. Jika sebagian warna dalam blok ini kita ubah sedikit, mata kita mungkin tidak akan menyadarinya.
Di sini kita melihat tampilan dekat blok tersebut. Hal yang penting adalah bahwa warna dalam blok ini tidak banyak berubah. Bahkan, kita memperkirakan hal ini berlaku untuk sebagian besar blok. Tentu saja, beberapa blok akan memuat perubahan mencolok, misalnya di tempat langit dan batu bertemu, tetapi blok semacam itu merupakan pengecualian.
Blok piksel berukuran delapan kali delapan. Warna-warna dalam blok ini tidak banyak berubah karena semuanya berwarna jingga dengan sedikit variasi kecerahan.
Mengikuti pembahasan sebelumnya, kita akan mengubah representasi warna dari model warna \(RGB\) ke model \(YC_bC_r\text{.}\) Langkah ini memisahkan warna menjadi nilai luminans dan krominans yang akan kita tinjau secara terpisah. Pada Gambar 3.3.8, kita melihat nilai luminans blok ini. Sekali lagi, perhatikan bahwa nilai-nilai tersebut tidak banyak berubah di seluruh blok.
Blok piksel berukuran delapan kali delapan yang dirender hanya dengan luminans. Setiap piksel berwarna abu-abu sedang dengan sedikit variasi kecerahan.
Nilai numerik luminans dalam blok piksel berukuran delapan kali delapan. Secara umum, nilai luminans berada antara 0 dan 255. Nilai-nilai dalam blok ini hanya menunjukkan sedikit variasi. Sebagian besar berada antara 150 dan 170, meskipun pada satu bagian terdapat beberapa nilai yang mendekati 130.
Strategi kita dalam algoritma kompresi adalah melakukan perubahan basis untuk memanfaatkan fakta bahwa nilai luminans tidak banyak berubah di seluruh blok. Alih-alih mencatat luminans setiap piksel, perubahan basis ini memungkinkan kita mencatat luminans rata-rata beserta sejumlah informasi tentang penyimpangan setiap warna dari nilai rata-rata tersebut.
Kita akan melakukan perubahan basis dan menjelaskan vektor ini melalui rata-rata nilai luminans serta informasi tentang penyimpangannya dari rata-rata.
Sekilas, hal ini mungkin tampak rumit, tetapi kita dapat memahaminya dengan melihat vektor-vektor tersebut secara grafis. Gambar 3.3.9 menampilkan empat di antara vektor basis ini. Perhatikan bahwa \(\vvec_0\) bernilai 1 secara konstan, \(\vvec_1\) berubah relatif lambat, \(\vvec_2\) berubah sedikit lebih cepat, dan \(\vvec_7\) berubah cukup cepat. Hal utama yang perlu diperhatikan adalah bahwa vektor-vektor basis berubah dengan laju yang berbeda: vektor-vektor awal berubah relatif lambat, sedangkan vektor-vektor berikutnya berubah lebih cepat.
Representasi grafis \(\vvec_0\text{,}\) yang semua komponennya bernilai satu secara konstan. Diagram memiliki sumbu horizontal berlabel nol hingga tujuh, dan di atas setiap label terdapat titik pada ketinggian satu di sumbu vertikal.
Representasi grafis \(\vvec_1\text{,}\) yang komponennya dibentuk oleh fungsi kosinus yang berubah lambat. Diagram memiliki sumbu horizontal berlabel nol hingga tujuh, dan di atas setiap label terdapat titik pada ketinggian yang sesuai dengan komponen vektornya di sumbu vertikal.
Representasi grafis \(\vvec_2\text{,}\) yang komponennya dibentuk oleh fungsi kosinus yang berubah. Diagram memiliki sumbu horizontal berlabel nol hingga tujuh, dan di atas setiap label terdapat titik pada ketinggian yang sesuai dengan komponen vektornya di sumbu vertikal.
Representasi grafis \(\vvec_7\text{,}\) yang komponennya dibentuk oleh fungsi kosinus yang berubah cepat. Diagram memiliki sumbu horizontal berlabel nol hingga tujuh, dan di atas setiap label terdapat titik pada ketinggian yang sesuai dengan komponen vektornya di sumbu vertikal.
Vektor-vektor ini membentuk basis \(\bcal\) untuk \(\real^8\text{.}\) Ingat bahwa \(\xvec\) adalah vektor nilai luminans pada kolom pertama, seperti terlihat di sebelah kanan. Kita akan menuliskan \(\xvec\) dalam koordinat baru
Representasi visual vektor yang dibentuk oleh komponen-komponen vektor \(\xvec\text{,}\) yang memberikan nilai luminans pada kolom pertama blok berukuran delapan kali delapan. Nilainya sedikit meningkat dari nilai pertama ke nilai kedua, kemudian menurun perlahan hingga nilai kelima, lalu meningkat perlahan hingga nilai kedelapan.
Diagram interaktif dengan penggeser yang memungkinkan pembaca mengubah koefisien Fourier \(F_0\text{.}\) Ketika koefisien diubah, kedelapan titik yang diplot dinaikkan atau diturunkan dalam jumlah yang sama sehingga selalu berada pada ketinggian yang sama.
Jelaskan pengaruh \(F_0\) terhadap vektor \(\xvec\text{.}\) Apakah Anda akan menyebut komponen-komponen \(\xvec\) konstan, berubah lambat, atau berubah cepat?
Diagram interaktif dengan penggeser yang memungkinkan pembaca mengubah koefisien Fourier keempat, \(F_3\text{.}\) Mula-mula koefisien ini ditetapkan nol dan kedelapan titik yang diplot berada pada ketinggian konstan. Namun, ketika \(F_3\) dinaikkan, titik-titik menurun dari titik pertama hingga ketiga, kemudian meningkat hingga titik kelima, lalu menurun hingga titik kedelapan. Semakin besar koefisiennya, semakin besar amplitudo variasinya.
Jelaskan pengaruh \(F_3\) terhadap vektor \(\xvec\text{.}\) Apakah Anda akan menyebut komponen-komponen \(\xvec\) konstan, berubah lambat, atau berubah cepat?
Diagram interaktif dengan penggeser yang memungkinkan pembaca mengubah koefisien Fourier terakhir, \(F_7\text{.}\) Mula-mula titik-titik berada pada nilai konstan di skala vertikal. Ketika \(F_7\) dinaikkan, titik-titik mulai berubah cepat dengan pola naik-turun-naik-turun. Ketika \(F_7\) terus dinaikkan, amplitudo variasinya menjadi semakin besar.
Jelaskan pengaruh \(F_7\) terhadap vektor \(\xvec\text{.}\) Apakah Anda akan menyebut komponen-komponen \(\xvec\) konstan, berubah lambat, atau berubah cepat?
Sel Sage di bawah akan menyusun matriks \(P_{\bcal}\text{,}\) yang dinyatakan sebagai P, dan inversnya \(P_{\bcal}^{-1}\text{,}\) yang dinyatakan sebagai Pinv. Evaluasilah sel Sage ini dan perhatikan bahwa sel tersebut mencetak matriks \(P_{\bcal}^{-1}\text{.}\)
Sel Sage di bawah mendefinisikan vektor \(\xvec\text{,}\) yaitu vektor nilai luminans pada kolom pertama, seperti terlihat pada Gambar 3.3.8. Gunakan sel di bawah untuk menentukan vektor \(\fvec\) yang memuat koefisien Fourier \(F_0,F_1,\ldots,F_7\text{.}\) Jika Anda telah mengevaluasi sel di atas, P dan Pinv masih dapat dirujuk dalam sel ini.
Mari kita lihat apa yang terjadi jika koefisien \(F_6\) dan \(F_7\) kita abaikan. Bentuklah vektor koefisien Fourier baru dengan membulatkan koefisien ke bilangan bulat terdekat serta menetapkan \(F_6\) dan \(F_7\) sama dengan nol. Vektor ini merupakan hampiran bagi \(\fvec\text{,}\) yaitu vektor koefisien Fourier. Gunakan hampiran bagi \(\fvec\) itu untuk membentuk hampiran bagi vektor \(\xvec\text{.}\)
Ketika koefisien Fourier yang bersesuaian dengan elemen basis yang berubah cepat kita abaikan, vektor \(\xvec\) yang kita rekonstruksi ternyata sangat dekat dengan vektor aslinya. Bahkan, nilai luminans dalam hampiran berbeda paling banyak satu atau dua dari nilai luminans sebenarnya. Mata kita tidak cukup peka untuk mendeteksi perbedaan ini.
Sejauh ini, kita hanya berfokus pada satu kolom dalam blok nilai luminans \(8\times8\text{.}\) Sekarang mari kita tinjau semua kolom. Sel Sage berikut mendefinisikan matriks bernama luminance, yaitu matriks nilai luminans \(8\times8\text{.}\) Tentukan matriks \(8\times8\)\(F\) yang kolom-kolomnya merupakan koefisien Fourier dari setiap kolom nilai luminans.
Perhatikan bahwa baris pertama matriks ini terdiri atas koefisien Fourier \(F_0\) untuk setiap kolom. Seperti yang kita lihat sebelumnya, entri-entri pada baris ini tidak banyak berubah ketika kita bergerak sepanjang baris tersebut. Dalam sel Sage di bawah, tuliskan entri-entri ini dalam vektor \(\yvec\) dan tentukan koefisien Fourier yang bersesuaian.
Sampai di sini, kita telah bekerja dengan nilai luminans dalam satu blok \(8\times8\) dari citra kita. Kita membentuk koefisien Fourier untuk setiap kolom blok tersebut. Setelah memperhatikan bahwa koefisien Fourier sepanjang suatu baris relatif konstan, masuk akal untuk menentukan koefisien Fourier dari baris-baris matriks koefisien Fourier. Langkah ini menghasilkan matriks
Jika kita melihat isi sebuah berkas citra JPEG, kita akan menemukan banyak matriks seperti ini. Untuk setiap blok \(8\times 8\text{,}\) terdapat tiga matriks koefisien Fourier dari baris-baris koefisien Fourier, masing-masing satu matriks untuk nilai luminans, krominans biru, dan krominans merah. Namun, koefisien Fourier ini disimpan sebagai bilangan bulat di dalam berkas JPEG, sehingga kita perlu membulatkannya ke bilangan bulat terdekat, seperti ditampilkan di sini:
Bahkan, ketika berkas JPEG dibuat, terdapat parameter “kualitas” yang dapat ditetapkan, seperti ditampilkan pada Gambar 3.3.13. Ketika parameter kualitas tinggi, kita menyimpan banyak koefisien Fourier; ketika parameter itu rendah, kita mengabaikan lebih banyak koefisien.
Jendela dari paket perangkat lunak grafis yang memungkinkan pengguna mengatur kualitas citra JPEG yang diekspor pada skala numerik dari \(0\) hingga \(100\text{.}\)
Untuk melihat cara kerjanya, misalkan pengaturan kualitas relatif tinggi. Setelah membulatkan koefisien Fourier, kita akan menetapkan semua koefisien yang nilai mutlaknya kurang dari 2 sama dengan nol, sehingga terbentuk matriks:
Perhatikan bahwa dari 64 koefisien Fourier, hanya 12 koefisien tak nol yang perlu kita catat. Akibatnya, kita hanya menyimpan \(12/64 \approx
19\%\) dari data.
Sebaliknya, jika pengaturan kualitas relatif rendah, kita menetapkan semua koefisien Fourier yang nilai mutlaknya kurang dari 4 sama dengan nol, sehingga terbentuk matriks:
Perhatikan bahwa sekarang hanya ada 5 koefisien Fourier tak nol yang perlu kita catat, sehingga kita hanya menyimpan \(5/64\approx 8\%\) dari data. Hal ini menghasilkan berkas JPEG yang lebih kecil untuk merepresentasikan citra.
Dengan pengaturan kualitas yang lebih rendah, kita membuang lebih banyak informasi tentang koefisien Fourier sehingga citra tidak dapat direkonstruksi setepat sebelumnya. Untuk melihatnya, kita dapat merekonstruksi nilai luminans dari koefisien Fourier dengan mengonversinya kembali ke sistem koordinat standar. Alih-alih menampilkan nilai luminans itu sendiri, kita akan menampilkan selisih antara nilai luminans asli dan nilai luminans hasil rekonstruksi. Ketika pengaturan kualitas tinggi dan kita menyimpan 12 koefisien Fourier, selisihnya adalah
Hal ini memperlihatkan adanya kompromi. Dengan pengaturan kualitas tinggi, kita memerlukan lebih banyak ruang penyimpanan untuk menyimpan lebih banyak data, tetapi citra hasil rekonstruksi lebih dekat dengan citra asli. Dengan pengaturan kualitas lebih rendah, kita memerlukan lebih sedikit ruang penyimpanan, tetapi citra hasil rekonstruksi lebih berbeda dari citra asli.
Jika kita ingat bahwa informasi visual yang disimpan oleh nilai krominans biru dan merah tidak sepenting informasi dalam nilai luminans, kita dapat lebih leluasa membuang lebih banyak koefisien Fourier untuk nilai krominans sehingga penghematannya semakin besar.
Gambar 3.3.14 membandingkan citra asli dengan versi yang disimpan menggunakan pengaturan kualitas sangat rendah. Jika diperhatikan dengan saksama, Anda dapat melihat blok-blok \(8\times8\) satu per satu.
Foto asli yang disimpan dengan pengaturan kualitas lebih rendah dalam algoritma kompresi JPEG sehingga sebagian informasi visual hilang. Sebagai contoh, blok-blok \(8\times8\) dapat terlihat satu per satu sehingga mengganggu kesan bahwa kita sedang melihat pemandangan gurun.
Pembahasan algoritma kompresi JPEG ini dimaksudkan untuk menjelajahi gagasan yang melandasi penyusunannya dan memperlihatkan pentingnya pemilihan basis beserta sistem koordinat yang menyertainya. Ada beberapa detail, terutama mengenai pembulatan koefisien Fourier, yang tidak sepenuhnya akurat. Implementasi sebenarnya sedikit lebih rumit, tetapi penyajian di sini menyampaikan inti algoritma tersebut.
Algoritma kompresi JPEG memungkinkan kita menyimpan berkas citra hanya dengan sebagian kecil datanya. Gagasan serupa digunakan untuk menyimpan berkas musik dan video digital secara efisien.
Bagian ini telah menjelajahi bagaimana perubahan basis yang tepat membantu kita merekonstruksi citra hanya dengan sebagian kecil datanya. Proses ini dikenal sebagai kompresi citra.
Ada beberapa cara untuk merepresentasikan warna, dan semuanya menggunakan vektor dalam \(\real^3\text{.}\) Kita menjelajahi model warna \(RGB\text{,}\) yang sesuai untuk penerapan digital, serta model \(YC_bC_r\text{,}\) yang menyampaikan informasi visual paling penting melalui komponen \(Y\text{,}\) yang dikenal sebagai luminans.
Kita juga menjelajahi perubahan basis yang disebut Transformasi Fourier Diskret. Dalam sistem koordinat yang dihasilkan, koefisien pertama mengukur rata-rata komponen suatu vektor. Koefisien-koefisien lain mengukur penyimpangan komponen dari nilai rata-rata.
Kita menggunakan kedua gagasan tersebut untuk memperlihatkan algoritma kompresi JPEG. Citra dibagi menjadi blok-blok \(8\times8\text{,}\) dan warna dipisahkan menjadi luminans, krominans biru, serta krominans merah. Penerapan Transformasi Fourier Diskret memungkinkan kita merekonstruksi hampiran citra yang baik hanya dengan sebagian kecil data asli.
Sekarang kita akan membentuk vektor \(\yvec\text{,}\) yang merupakan hampiran bagi \(\xvec\text{,}\) dengan membulatkan semua koefisien Fourier \(\xvec\) ke bilangan bulat terdekat untuk memperoleh \(\coords{\yvec}{\ccal}\text{.}\) Tentukan vektor \(\yvec\) dan bandingkan hampiran ini dengan \(\xvec\text{.}\) Berapakah galat hampiran ini?
Ulangi bagian terakhir soal ini, tetapi tetapkan koefisien Fourier yang telah dibulatkan sama dengan nol jika nilai mutlaknya kurang dari lima. Gunakan hasilnya untuk membuat hampiran kedua bagi \(\xvec\text{.}\) Berapakah galat hampiran ini?
Bandingkan banyaknya koefisien Fourier tak nol dalam kedua hampiran, lalu bandingkan ketepatan kedua hampiran tersebut. Dalam beberapa kalimat, bahaslah perbandingan yang Anda peroleh.
Transformasi Fourier yang kita gunakan dalam bagian ini sering disebut Transformasi Kosinus Fourier Diskret karena didefinisikan menggunakan basis \(\ccal\) yang terdiri atas fungsi-fungsi kosinus. Terdapat pula Transformasi Sinus Fourier yang didefinisikan menggunakan basis \(\scal\) yang terdiri atas fungsi-fungsi sinus. Sebagai contoh, dalam \(\real^4\text{,}\) vektor-vektor basis \(\scal\) adalah
Sel Sage di bawah mendefinisikan matriks S yang kolom-kolomnya merupakan vektor dalam basis \(\scal\text{,}\) serta matriks C yang kolom-kolomnya membentuk basis \(\ccal\) yang digunakan dalam Transformasi Kosinus Fourier.
Dalam blok nilai luminans \(8\times8\) yang kita tinjau dalam bagian ini, kolom pertama diawali oleh empat entri 176, 181, 165, dan 139, seperti terlihat pada Gambar 3.3.8. Entri-entri ini membentuk vektor \(\xvec=\fourvec{176}{181}{165}{139}\text{.}\) Tentukan \(\coords{\xvec}{\scal}\) dan \(\coords{\xvec}{\ccal}\text{.}\)
Tuliskan satu atau dua kalimat yang membandingkan nilai koefisien Sinus Fourier \(\coords{\xvec}{\scal}\) dengan koefisien Kosinus Fourier \(\coords{\xvec}{\ccal}\text{.}\)
Tuliskan beberapa kalimat yang menjelaskan mengapa kita menggunakan Transformasi Kosinus Fourier, bukan Transformasi Sinus Fourier, dalam algoritma kompresi JPEG.
Representasi visual vektor basis ketiga, dengan dua komponen pertama masing-masing bernilai satu dan negatif satu, serta dua komponen terakhir bernilai nol.
Representasi visual vektor basis keempat, dengan dua komponen pertama bernilai nol dan dua komponen terakhir masing-masing bernilai satu dan negatif satu.
Sel Sage berikut mendefinisikan matriks W yang kolom-kolomnya merupakan vektor basis dalam \(\wcal\text{.}\) Jika \(\xvec\) adalah kolom pertama nilai luminans dalam blok \(4\times4\) di atas, tentukan koefisien wavelet \(\coords{\xvec}{\wcal}\text{.}\)
Perhatikan bahwa \(H_1\) memberikan nilai rata-rata komponen \(\xvec\text{,}\) sedangkan \(H_2\) menjelaskan bagaimana rata-rata dua komponen pertama dan dua komponen terakhir berbeda dari rata-rata keseluruhan. Koefisien \(H_3\) dan \(H_4\) masing-masing menjelaskan variasi berskala kecil antara dua komponen pertama dan antara dua komponen terakhir.
Jika kita menetapkan dua koefisien wavelet terakhir \(H_3=0\) dan \(H_4=0\text{,}\) kita memperoleh koefisien wavelet \(\coords{\yvec}{\wcal}\) untuk vektor \(\yvec\) yang menghampiri \(\xvec\text{.}\) Tentukan vektor \(\yvec\) dan bandingkan dengan vektor asli \(\xvec\text{.}\)
Apa pengaruh penetapan \(H_3=0\) dan \(H_4=0\) terhadap bentuk vektor \(\yvec\text{?}\) Jelaskan bagaimana menetapkan koefisien-koefisien tersebut sama dengan nol mengabaikan perilaku \(\xvec\) pada skala kecil.
Dalam algoritma kompresi JPEG, kita meninjau koefisien Fourier dari semua kolom nilai luminans, lalu melakukan transformasi Fourier pada baris-barisnya. Sel Sage di bawah akan melakukan operasi yang sama menggunakan transformasi wavelet; yaitu, sel ini mula-mula menentukan koefisien wavelet setiap kolom, lalu melakukan transformasi wavelet pada baris-barisnya. Anda hanya perlu mengevaluasi sel tersebut untuk memperoleh koefisien wavelet yang dihasilkan dengan cara ini.
Sekarang tetapkan semua koefisien wavelet sama dengan nol, kecuali koefisien dalam blok \(2\times2\) di kiri atas, lalu gunakan koefisien tersebut untuk mendefinisikan matriks coeffs dalam sel Sage di bawah. Langkah ini mengabaikan semua perbedaan berskala kecil. Mengevaluasi sel ini akan memperoleh kembali nilai luminans hampirannya.
Dalam bagian ini, kita meninjau model warna \(RGB\) dan \(YC_bC_r\text{.}\) Dalam latihan ini, kita akan meninjau model warna \(HSV\text{,}\) dengan \(H\) sebagai rona, \(S\) sebagai saturasi, dan \(V\) sebagai nilai warna. Ketiga besaran tersebut bervariasi antara 0 dan 255.
Diagram interaktif untuk menjelajahi model warna \(HSV\text{.}\) Terdapat tiga penggeser yang memungkinkan pembaca mengubah besaran \(H\text{,}\)\(S\text{,}\) dan \(V\text{.}\) Warna yang dihasilkan kemudian ditampilkan.
Naikkan nilai \(V\) hingga 255, yaitu posisi paling kanan. Jelaskan apa yang terjadi ketika Anda mengubah saturasi \(S\) dengan rona \(H\) dan nilai \(V\) tetap.
Model warna \(YC_bC_r\) memusatkan informasi visual yang paling penting dalam koordinat luminans, yang secara kasar mengukur kecerahan warna. Dua koordinat lainnya menjelaskan rona warna. Sebaliknya, model warna \(HSV\) memusatkan seluruh informasi tentang rona dalam koordinat \(H\text{.}\)
Hal ini berguna dalam aplikasi visi komputer. Sebagai contoh, jika kita ingin robot mendeteksi bola biru dalam medan pandangnya, kita dapat menentukan kisaran nilai rona yang perlu dicari. Jika pencahayaan di ruangan berubah, saturasi dan nilai warna mungkin berubah, tetapi ronanya tidak. Hal ini memperbesar kemungkinan robot tetap mendeteksi bola biru dalam berbagai kondisi pencahayaan.