c 数据压缩算法_CCSDS图像压缩算法之我见(一)
點擊上方藍字關注我們!
CCSDS圖像壓縮算法之我見CCSDS:Consultative Committee for Space Data System,國際空間數據系統咨詢委員會,于1982年NASA發起組織,至今已經定義了許多空間數據系統的協議規范和標準,如空地通信協議等一系列標準和規范。
? ? ?今天主要給大家介紹CCSDS發布的圖像壓縮算法。
CCSDS指定的深空探測圖像的壓縮標準從1997年提出第一個建議到2005年11月發布推薦標準,CCSDS圖像壓縮算法不斷從壓縮效率和算法復雜度上進行改進,對比JPEG2000, CCSDS圖像壓縮算法更適用于硬件實現,實現的復雜度更低,且專門面向遙感圖像幅寬及bit深度的優化支持,如支持從4bits到16bits的比特位面深度,支持無損和有損,支持以幀方式和非幀方式(如行推掃)處理輸入圖像,使得該算法更適用于深空探測及對地觀測。
? ? ?下面給大家詳細的分享下CCSDS圖像壓縮算法,整個算法的處理和JPEG2000類似,算法處理流程如下所示:
1.?? 9/7小波變換
Tips:小波變換
電子工程類的同學們應該都知道,信號分析分為時域分析和頻域分析兩種(圖像的時域和頻域處理也非常有意思,如果感興趣的話推薦大家看下經典的岡薩雷斯版數字圖像處理課本)。這里有一個非常牛逼的人給出一個非常牛逼的公式,拉普拉斯。這個公式(變換)牛逼的地方就在于把一個自變量是t(時間)的微分方程,轉換成了自變量是s(頻率)的傳遞函數,通過變換竟然改變了自變量。當將信號從時域轉換到頻域后我們這些搬磚的工程師就知道了信號中哪些頻率是有用的哪些頻率是沒用的,比如我們要調整一首歌曲中的低頻,高頻,中頻,這樣在頻域處理起來要比在時序簡單很多。
小波變換:下面簡單的從傅里葉變換->短時傅里葉變換->小波變換的順序來說明小波變換的由來和優點。
傅里葉變換有一個非常明顯的局限性,就是對非平穩過程的處理,假如存在一個信號是隨時間變換的非平穩信號,那么經過傅里葉變換后他們的頻域成分(分量)可能是一樣的,這樣你在做頻域分析的時候一定會懵逼。因為它只能得到一段信號總體上包含哪些頻率的成分,但是對各成分出現的時刻卻不知道,因此兩個時域相差很大的信號,可能頻譜是一樣的。
? ? ?但是現實中的信號基本上全部是非平穩過程的,我們在進行信號分析時不僅想知道信號的頻率域,還想知道各個頻率分量出現的時間以及信號頻率隨時間變換的情況,所以這個時候傅里葉變化的局限性就很明顯了。如下圖所示,兩個時域相差很大的信號,得到頻譜確實一樣的(其實頻率分量出現的時間是不一樣的)
這時就有人想到了數學中常用的分解逼近法,把整個時域過程分解成無數個等長的小過程,每個小過程近似平穩,再進行傅里葉變換,這樣不就知道了哪個時間點上出現了什么頻率,這個思想就是信號分析中另一個牛逼的思路-加窗。
但是這個方法也有個缺陷,那就是窗函數選多長?窗太窄會導致頻率分辨率差,窗太長時間分辨率會差。用一個有意思的概念解釋,量子力學中的海森堡不確定性(薛定諤的貓),就如同在量子力學中我們不能同時獲取一個粒子是自旋向上還是自旋向下,在信號分析中我們也不能同時獲取信號絕對精準的時刻和頻率,所以就沒法給出精準的窗函數。
? ? ? 這里就引出了小波變換,小波變換走了另一條路,把傅里葉變換中無線長的三角函數基換成了有限長的會衰減的小波基,這樣不僅能獲取頻率,還能定位到時間。
? ? ? 從上面公式可以看出,不同于傅里葉變換,變量只有頻率ω。小波變換有兩個變量,尺度α(Scale)和平移量τ(Translation)。尺度α控制小波函數的伸縮,平移量τ控制小波函數的平移。尺度α就對應與頻率,平移量τ就對應于時間。
? ? ? ?介紹一個特別經典的小波分析教程網站,感興趣的同學可以了解下
? ? ? http://users.rowan.edu/~polikar/WTtutorial.html
在CCSDS圖像壓縮標準中,使用二維、三層9/7離散小波變換實現圖像的頻域變換,將圖像數據進行去相關,將圖像高頻部分和低頻部分分開。
Tips:對于上面這句話,沒有學過圖像處理的先不要慌,給大家解釋下。
? ? ? 二維:所謂二維小波變換就是對一維小波變換的迭代應用,簡單來說就是先對圖像行進行一維小波變換,之后再對圖像列進行一維小波變換,如下如所示:
? ? ? ?三層:為了提升壓縮效率,標準中建議對二維小波進行三層變換,所謂三層變換其實就是對第一層留下的LL1子帶再進行一次二維小波變換,然后對得到的第二層LL2子帶再做一次小波變換,最終得到二維三層小波變換。
CCSDS給出了兩組小波變換系數,分別是浮點系數和整數系數,便于后續實現,我們僅關心整數系數,整數系數如下,其中D為高頻分量,C為低頻分量:
注意上面公式中那個不是中括號,是向下取整的意思。
劃重點,在實現算法前,第一步也是最重要的一步就是優化算法,優化的思路有兩個,一個是速度和面積,一個是便于實現。舉個例子來說明下,如上面的其中一個公式,如下所示:
? ? ? 如果直接實現,那么需要需要計算3次加法、1次減法、三次乘法以及三次除法,對于硬件語言來說,實現除法一般難度較大且比較消耗資源。所以我們想辦法對公式進行化簡合并,看能不能消除除法。
經過化簡后我們可以看到,公式中僅剩2的整數次冪,以及加減法,這樣在硬件實現中可以通過左移和右移來實現乘法和除法,而剩下的加法和減法就比較容易實現了。
多插一嘴,圖像轉換到頻域后,被分為高頻分量和低頻分量,簡單來理解就是整體和細節,所以在有損壓縮時,我們通過犧牲圖像的細節來達到壓縮數據量的目的,所以在后續的編碼過程中,也是先進行低頻系數編碼再進行高頻系數編碼(截斷)。
? ? ? 再介紹一個后面會用到知識,比特平面分層。還是通過上面的細節和輪廓來解釋。比如一個灰度圖,每個像素點的量化位寬是8bit,如下所示:
? ? ? ?如上圖所示,圖像像素中越低的bit平面表示的是圖像的細節,越高的bit平面表示的圖像的輪廓,假如用最粗暴的辦法在時域壓縮圖像,那我們肯定丟棄的圖像的細節信息,留下圖像的輪廓,比如將每個像素點的低3位都寫成0,這樣一來圖像就有大量的冗余信息,其實就達到了壓縮的目的。
? ? ? 如果還是不好理解的話,可以看下下面這個數字86431,如果丟棄掉十位和個位,變成86400,這樣雖然這個數字丟棄了細節,但是它的數量級86400還在,不影響它要表達的數據的量級。但是如果丟棄掉萬,那么剩下的數字和之前相比就會影響到要描述大小了。
2.位平面編碼
在CCSDS標準中,位平面編碼是對小波變換后得到的小波系數進行編碼處理。對于小波系數,按照重要性劃分,低頻區域大于高頻區域,高位面大于低位面。首先位平面編碼按照位面位平面的重要性以從最高位到最低位的順序進行編碼以及輸出,先進行低頻系數編碼,再進行高頻系數編碼。
? ? ? 小波變換后的系數圖像結構如下圖所示:
小波變換后的圖像首先被劃分為若干個圖像段Segment,每個Segment是S個連續圖像塊Block組成的圖像片段,其中16≤S≤220,下圖中為小波變換圖像用不同顏色標定的4個圖像片段。每個segment被依次獨立編碼,解碼時每個segment被獨立解碼,解碼不受鄰近segment解碼程度的影響。
? ? ? ?這里再進一步解釋下,CCSDS編碼處理的單位是段(Segment),其大小定義在32x32和8192x8192之間。對于同一幅圖像來說,段劃分的越大,則重建(解壓縮)的圖像質量越好,段劃分的越小,則運算時需要的緩存空間越小。每個段由固定大小8x8的塊組成,每個塊是位平面編碼處理的基本單元,一個塊含有64個小波系數。這64個小波系數中,包含1個直流系數和63個交流系數。如下圖所示:
? ? ? ?上圖中每個塊可以分成DC coefficient、parents、children和grandchildren。一個直流系數對應三個parents,以每個parent為根節點形成一個三級四叉樹,對應四個children和16個grandchildren。圖像塊的坐標對應關系如下表所示:
在每個段中,每16個塊組成一個群(gaggle),CCSDS圖像壓縮算法以群為單位完成一個段的編碼。最后一個群可能不足16個塊,而是以群長度對16取模后的值。
? ? ? 總結下上述編碼劃分,段->群->塊。一個塊有64個小波系數,一個群由16個塊組成,一個段由若干個群組成。
整個位平面編碼順序步驟如下所示:
段頭編碼
初始化直流系數編碼
交流系數比特深度編碼
比特平面b=BitDepthAC-1編碼
比特平面b=BitDepthAC-2編碼
……
比特平面b=0編碼
本期到此就結束啦,下期我們再聊壓縮的最核心部分---編碼過程
總結
以上是生活随笔為你收集整理的c 数据压缩算法_CCSDS图像压缩算法之我见(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 设计出python_Python: 实际
- 下一篇: python快速入门神器 知乎_pyth