原文 | 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來說,線性變換對應的矩陣是B,A和B之間有怎樣的聯系呢?首先要明確T是一個什么樣的變換,是一個旋轉還是一個投影,或者其它被指明的變換,A和B描述的是同一個線性變換,只不過使用了不同的基,這兩個矩陣是相似矩陣,B = M-1AM,M是基變換矩陣,
關于如何使用傅立葉向量進行影像壓縮,可以參考岡薩雷斯的《數字影像處理》,寫的非常詳細,
出處:微信公眾號 "我是8位的"
本文以學習、研究和分享為主,如需轉載,請聯系本人,標明作者和出處,非商業用途!
掃描二維碼關注作者公眾號“我是8位的”

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/100395.html
標籤:其他
上一篇:使用 Docker 和 Nginx 打造高性能的二維碼服務 (轉)
下一篇:vscode代碼自動補全失效
