線性代數筆記33——基變換和圖像壓縮


 

  原文 | https://mp.weixin.qq.com/s/TXbcQoXw2HGkP3tnvKEpMQ

  基變換的一個重要應用是壓縮,圖像、視頻、音頻和其它一些數據都會因為基變換而得到更高效的壓縮存儲。線性變換可以脫離坐標系,而描述線性變換的矩陣卻要依賴於坐標系,因此選擇合適的基會更便於計算。

圖像的知識

灰度圖像

  由於景物各點的顏色及亮度不同,攝成的黑白照片上或電視重現的黑白圖像上各點呈現不同程度的灰色。把白色與黑色之間按對數關系分成若干級,稱為“灰度等級”。范圍一般從0到255,白色為255,黑色為0,故黑白圖片也稱灰度圖像,在醫學、圖像識別領域有很廣泛的用途。

  灰度使用黑色調表示物體,即用黑色為基准色,用不同飽和度的黑色來顯示圖像。每個灰度對象都具有從 0%(白色)到100%(黑色)的亮度值,下圖中每個方塊都代表了一個不同的亮度值:

  我們通常講的“黑白照片”是一種灰度圖像,它與計算機領域中的黑白照片不同,在計算機圖像領域中黑白圖像只有黑和白兩種顏色,而灰度圖像在黑色與白色之間還有許多級的顏色深度:

圖像存儲

  考慮一副515×512像素的灰度靜態圖像,它有28×28個像素,每個像素的灰度值是從0到255,用8bit空間存儲。可以用矩陣存儲數字圖像,每個元素都是一個像素點:

  我們也可以將一幅圖像當成一個有515×512個分量的向量:

  v是一個R512×512空間的向量,它的前512個分量是A的第一列,第二個512個分量是A的第二列。這樣一來,一個圖像就可以看作是一個向量(這里的意思是,在計算時,把一個二維數組轉換成一維數組處理,但存儲上未必使用一維數組)。如果圖像是彩色的,那么每個像素點都需要存儲三個數據(RGB),存儲空間將是灰度圖像的三倍。

圖像壓縮

  存儲圖像將會占據大量的空間,如果不進行壓縮,勢必會影響系統的加載或網絡傳輸效率。一種標准的圖像壓縮方式是JPEG(聯合圖像專家組,Join Photographic Experts Group),JPEG文件的擴展名為.jpg或.jpeg,它用有損壓縮方式去除冗余的圖像和彩色數據,在獲得極高的壓縮率的同時能展現十分豐富生動的圖像,即可以用較少的磁盤空間得到較好的圖片質量。

  現在有一個512×512灰度圖像,圖像的某一列像素可能是這樣的數值:

  可以用Pillow查看圖像的某一列:

 1 from PIL import Image
 2
 3 img = Image.open('cat.jpg')
 4 width, height = img.width, img.height
 5 px = img.load()
 6 for i in range(height):
 7     print(px[0, i])
 8
 9 img_gray = img.convert('L') # 灰度圖像轉換
10 px = img_gray.load()
11 for i in range(height):
12     print(px[0, i])
13 img_gray.show()

  換成彩色圖像也一樣,只不過向量的每個元素都變成了一個三元組,這里我們還是以簡單的灰度圖像為例。假設我們用一個向量存儲這個灰度圖像。在圖像壓縮前,采用的是向量的標准基,圖像是這這些標准基的線性組合:

  對於一個圖像來說,相鄰像素經常代表同一塊區域,比如貓咪的身體,因此灰度值是非常接近的甚至完全相同的。在一個極端情況下,比如圖像展示了一塊干凈的黑板,此時圖像的所有像素都相同,如果仍然使用標准基,則完全忽略了圖像的這一特性,此時一個更好的基是元素全為1的向量,僅通過這一個基向量就能完整地給出所有像素一致的圖像的信息。雖然在大多數實際情況下圖像的像素不是一致的,但這種處理思路仍然給了我們壓縮的可能。實際上我們經常用全1向量作為圖像的一個基向量,問題是,應該選擇哪些向量與它配合?

  下面是幾個常用的基向量:

  ±1交叉出現,可以處理黑白交叉的圖像,比如一個國際象棋的棋盤:

  一半是1,另一半是-1,可以處理一半明一半暗的圖像,比如日出和日落:

  這些基向量應該怎樣選擇呢?不同行業的人員有不同的選擇,比如電視行業的人員基於信號掃描的方式選擇基,電影行業的人員喜歡另一種,而對於JPEG來說,使用的是傅立葉基。

傅立葉基

  傅立葉基包括全1向量,電氣工程師稱之為DC向量。JPEG將一個圖像分解成多個8×8的塊,每個塊中的64個像素又被拆分成8個8×1的小塊,對每一個小塊進行基變換處理。

  實際上這組傅里葉基就是傅立葉矩陣的列向量:

  這里我們不過多地介紹傅立葉向量,只介紹JPEG壓縮圖像的原理。每一個8×8的塊有64個像素,這些像素可以存儲在一個64維向量中,這個向量有64個基向量,因此每一個塊都可以看作64個基向量的系數。

  JPEG的壓縮是在64維空間中利用傅立葉向量做基變換。對於每個8×8的塊來說,需要進行64次基變換,得到64個新系數。

  首先輸入信號p(8×8的像素塊,實際上被拆分成8個8×1的列向量),然后從標准基進行基變換,變成傅立葉基,從而得到新的系數c,這一步是無損的過程。接下來將進行壓縮,在壓縮過程中將丟失一些信息,是有損過程。通過設置閾值進行壓縮,超過閾值的認為是肉眼看不出區別的,即使丟掉也沒有太大關系。通過這種方法丟掉一部分基向量,得到一套新的系數 ,用新的系數乘以相應的傅立葉基並求和得到新的向量。

  最終用於求和的向量已經不是64個,而是去掉了丟掉的部分,可能只剩下兩三個,這就是壓縮。如果向量個數從64個減到了3個,壓縮比率是21:1。

  視頻文件可以看作一幅幅靜態圖像,壓縮每一幅,然后播放,但這不是一個好方法,因為沒有利用好視頻的性質。視頻是一系列連續的、高度相關的圖像,一幅圖像和下一幅非常接近。在時間和空間上,事物不會瞬間改變,通常是平滑地改變,可以根據前一個值預測出下一個值。我們可以存儲一幅基礎圖像,隨后只存儲下一幅圖像的修正部分。

小波(Wavelets)

  仍然以8×8的塊為例,它的小波基是8個由1,0,-1構成的正交向量:

  這是8維空間的8個向量,叫做小波。這組基有很多從1到-1的跳躍,實際上這只是小波的一個簡單選擇,還有很多更精細的選擇。這里要做的是基變換,就是將標准基下的向量p表示為小波基的線性組合,並求出線性組合的參數c:

  這是一個線性變換,W就是描述這個變換的矩陣,它以小波向量為列向量,稱為小波矩陣。

  我們的目的是求出小波變換后的輸出向量的坐標,即c = W-1P,一組性質很好的基能夠快速求得c的值,性質很好又是幾個意思?一是要能夠快速求逆,例如快速傅里葉變換,這里也存在小波變換,小波矩陣中的向量都是正交的,因此它的逆等於它的轉置,W-1 = WT;二是要有良好的壓縮率,只要少量基向量就能接近信號量,比如在扔掉w5的坐標后,只損失了少量的數值。

基變換

  A矩陣的列向量是一組新的基向量,x是舊基上的向量,x和新基向量坐標的關系是x = Ac。

  已知一個線性變換T:R8→R8,當輸入空間使用的一組基是v1,v2,…,v8時,線性變換對應的矩陣是A;對於輸出空間的另一組基u1,u2,…,u8來說,線性變換對應的矩陣是BAB之間有怎樣的聯系呢?首先要明確T是一個什么樣的變換,是一個旋轉還是一個投影,或者其它被指明的變換。AB描述的是同一個線性變換,只不過使用了不同的基,這兩個矩陣是相似矩陣,B = M-1AMM是基變換矩陣。

  

  關於如何使用傅立葉向量進行圖像壓縮,可以參考岡薩雷斯的《數字圖像處理》,寫的非常詳細。


  出處:微信公眾號 "我是8位的"

  本文以學習、研究和分享為主,如需轉載,請聯系本人,標明作者和出處,非商業用途! 

  掃描二維碼關注作者公眾號“我是8位的”


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM