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

 

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

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

圖像的知識

灰度圖像

  因爲景物各點的顏色及亮度不一樣,攝成的黑白照片上或電視重現的黑白圖像上各點呈現不一樣程度的灰色。把白色與黑色之間按對數關係分紅若干級,稱爲「灰度等級」。範圍通常從0到255,白色爲255,黑色爲0,故黑白圖片也稱灰度圖像,在醫學、圖像識別領域有很普遍的用途。網絡

  灰度使用黑色調錶示物體,即用黑色爲基準色,用不一樣飽和度的黑色來顯示圖像。每一個灰度對象都具備從 0%(白色)到100%(黑色)的亮度值,下圖中每一個方塊都表明了一個不一樣的亮度值:學習

  咱們一般講的「黑白照片」是一種灰度圖像,它與計算機領域中的黑白照片不一樣,在計算機圖像領域中黑白圖像只有黑和白兩種顏色,而灰度圖像在黑色與白色之間還有許多級的顏色深度:spa

圖像存儲

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

  咱們也能夠將一幅圖像當成一個有515×512個份量的向量:code

  v是一個R512×512空間的向量,它的前512個份量是A的第一列,第二個512個份量是A的第二列。這樣一來,一個圖像就能夠看做是一個向量(這裏的意思是,在計算時,把一個二維數組轉換成一維數組處理,但存儲上未必使用一維數組)。若是圖像是彩色的,那麼每一個像素點都須要存儲三個數據(RGB),存儲空間將是灰度圖像的三倍。視頻

圖像壓縮

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

  如今有一個512×512灰度圖像,圖像的某一列像素多是這樣的數值:blog

  能夠用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位的」

相關文章
相關標籤/搜索