JPEG。 壓縮演算法

再一次問好! 我發現這篇文章寫於 2019 年 XNUMX 月。 這是 WAVE 和 JPEG 的一系列文章的續篇,在這裡 第一。 本出版品將包含有關影像編碼演算法和格式本身的整體資訊。

一段歷史

一湯匙維基百科文章:

JPEG(聯合影像專家小組)是一種流行的光柵圖形格式,用於儲存照片和類似影像。

該標準由聯合攝影專家組於 1991 年開發,旨在實現高效影像壓縮。

影像如何從原始格式轉換為 JPEG?

有些人認為JPEG影像是使用Huffman方法壓縮的原始數據,但事實並非如此。 在控制壓縮之前,資料會傳輸很長的距離。

首先,顏色模型從RGB改為YCbCr。 甚至有一個特殊的演算法: 這裡。 Y 不受影響,因為它負責亮度,而且它的變化會很明顯。

對圖像要做的第一件事是 “變薄” (二次抽樣)。 很容易理解:取一個2x2的像素數組,然後取Cb和Cr——這4個像素的每個YCbCr分量的平均值。 所以, 我們贏得了 6 個位元組,而不是 4 Y、4 Cb、4 Cr,我們得到 4 Y 以及它們每個的相同 Cb 和 Cr (4 + 4 + 4 = 12;4 + 1 + 1 = 6;12 - 6 = 6)。 即使在 2x2 比例下,具有 2:1 壓縮比的有損壓縮聽起來也很可靠。 這適用於整個影像。 所以 - 他們縮小了一半尺寸。 由於我們的顏色感知,我們可以使用這種技術。 如果對一小塊像素進行平均,人們會很容易注意到亮度的差異,但不會注意到顏色的差異。 細化也可以在一條線上進行,水平和垂直各 4 個像素。 第一個選項使用得更頻繁。 如果影像品質很重要,則根本不執行抽取。
稀疏化的直覺說明(Habr 不允許我插入 gif)- https://i.ibb.co/Rg5Th9H/150953010617579181.gif

主要準備部分

暴露前預防

現在是最難也是最必要的部分。 整個影像被分成8x8的區塊(如果解析度不是區塊邊的倍數則使用填滿)。

現在應用到每個區塊 DCT(離散餘弦轉換)。 在這一部分中,所有不必要的東西都被剔除了。 使用 DCT,您需要了解給定區塊 (8×8) 是否描述了影像的任何單調部分:天空、牆壁; 或者它包含複雜的結構(頭髮、符號等)。 邏輯上,64 個相似顏色的像素可以只用 1 來描述,因為塊大小是已知的。 壓縮就這麼多:64 比 1。

DCT將塊變成頻譜,讀數急劇變化的地方,係數變為正值,過渡越急劇,輸出就越高。 在係數較高的地方,圖片顯示顏色和亮度的清晰過渡,在係數較低的地方 - 區塊中 YCbCr 分量的值變化較弱(平滑)。

量化

此處已套用壓縮設定。 每個 8x8 矩陣中的每個係數都除以某個數字。 如果在進行所有修改後不會降低影像質量,則除數應為 1。 如果這張照片佔用的記憶體對你來說更重要,那麼除數會大於XNUMX,商會四捨五入。 事實證明,四捨五入後通常會得到很多零。

進行量化是為了創造更大壓縮的可能性。 以下是使用量化圖 y = sin(x) 的範例:

JPEG。 壓縮演算法

壓縮

首先,我們以鋸齒形模式遍歷矩陣:

JPEG。 壓縮演算法

我們得到一個包含數字的一維數組。 我們看到裡面有很多零,可以去掉。 為此,我們輸入 1 個零,並在其後輸入一個數字,表示它們在序列中的編號,而不是許多零的序列。 這樣你就可以重置為整個陣列大小的 1/3。 然後我們簡單地使用霍夫曼方法壓縮這個陣列並將其寫入檔案本身。

在哪裡使用

到處。 與 PNG 一樣,JPEG 用於相機、作業系統(如公司標誌、應用程式圖示、縮圖)以及需要有效儲存影像的所有可能領域。

產量

目前,有關 JPEG 的知識僅對教育目的有價值,因為它已經隨處可見並被大量人員優化,但科學的花崗岩仍然很美味。

來源

維基百科上有關 YCbCr 的文章
維基百科有關 JPEG 的文章
Pikabu 帖子中有關 PrEP 的一些信息
維基百科關於 PrEP 的文章

來源: www.habr.com

添加評論