當前位置:首頁 » 操作系統 » cb演算法推薦

cb演算法推薦

發布時間: 2022-05-29 04:46:21

A. c語言題目

還是只能給思維了,其實知道核思維,也能很快寫出來的。
輸入是str,len是長度,而str new目測是返回值。可初始化為空數組。
然後核心演算法是這樣的,for循環比較,如果可以調用字元串比較函數,就是strcmp()就比較簡單,就可以簡化為數字那樣的排序,可以用套任何一種排序演算法,冒泡,選擇,都行。
如果不想調用函數怎麼辦呢,首先你看見排序的依據是,比較首字母,lwz,當zhang,zhao前3個同時,比較n和o,所以o排在後面。
如何實現呢,首先第兩層循環是一樣的。默認是冒泡吧
for(int i=0;i<len-1;i++) len是4
{for(int j=0;j<len-1-i;j++)
{ for(k=0;k<str[j][].length&&str[j][k]==str[j+1][k];k++) ;//空語句,就是找到,不同的那個字母,比如zhao和zhang,跳出時k是3,是那個n或o的位置。
if(str[j][k]>str[j+1][k]) {//交換str[j][] 和str[j+1][]}//可以用strcpy函數。
}
}
這題目應該是可以使用字元串函數的。不對的話請批評指正,and寫的不太好看。原諒一下吧/

B. 速度退模糊演算法在什麼地方最成功

天氣雷達(SA,CB)觀測的台風以及強對流風暴天氣過程的資料質量控制。
速度退模糊演算法本質上是根據連續性原則將每個速度初猜值與它的周圍的相鄰速度值相比較,如果一個速度初猜值與它的周圍值顯著不同,則該演算法試圖用另一個可能的值替換那個速度初猜值。
速度退模糊演算法為基本和導出產品箅法提供盡可能好的基本速度數據。其中特別重要的是中氣旋和TVS(龍卷渦旋特徵)演算法,它們需要退模糊數據。沒有速度退模糊演算法,不能識別大於Vmax的速度。該演算法特別設計成能保存諸如陣風鋒、風暴頂輻散、中氣旋和TVS等重要特徵。

C. CBOF非互動式隨機數生成演算法是指什麼

非互動式隨機數生成演算法是指無需用戶提供額外自定義信息參與隨機數種子生成的演算法。這在分布式存儲應用各種可以起到隱私保護和公平的作用。

D. 單純形法Cb相等選哪個

選哪一個都可以,結果都會是一樣的,所以建議挑選化最簡矩陣相對容易的那一列。
Cb就是目標方程中的相對應得c,如70是maxZ中X1前面的系數,30是maxZ中X2的系數,B-1是對應的可行基B的逆矩陣,aj就是對應約束方程中的系數。
單純形法是求解線性規劃問題最常用、最有效的演算法之一。單純形法最早由GeorgeDantzig於1947年提出,近70年來,雖有許多變形體已經開發,但卻保持著同樣的基本觀念。如果線性規劃問題的最優解存在,則一定可以在其可行區域的頂點中找到。
基於此,單純形法的基本思路是:先找出可行域的一個頂點,據一定規則判斷其是否最優;若否,則轉換到與之相鄰的另一頂點,並使目標函數值更優;如此下去,直到找到某最優解為止。

E. 現今的圖像壓縮演算法有哪些急...

淺談圖像壓縮演算法

余科亮

本文僅討論靜止圖像的壓縮基本演算法,圖像壓縮的目的在於以較少的數據來
表示圖像以節約存儲費用,或者傳輸時間和費用。
JPEG壓縮演算法可以用失真的壓縮方式來處理圖像,但失真的程度卻是肉眼所
無法辯認的。這也就是為什麼JPEG會有如此滿意的壓縮比例的原因。
下面主要討論,JPEG基本壓縮法。
一.JPEG壓縮過程

JPEG壓縮分四個步驟實現:
1.顏色模式轉換及采樣;
2.DCT變換;
3.量化;
4.編碼。

二.1.顏色模式轉換及采樣

RGB色彩系統是我們最常用的表示顏色的方式。JPEG採用的是YCbCr色彩系統。
想要用JPEG基本壓縮法處理全彩色圖像,得先把RGB顏色模式圖像數據,轉換為
YCbCr顏色模式的數據。Y代表亮度,Cb和Cr則代表色度、飽和度。通過下列計算
公式可完成數據轉換。
Y=0.2990R+0.5870G+0.1140B
Cb=-0.1687R-0.3313G+0.5000B+128
Cr=0.5000R-0.4187G-0.0813B+128
人類的眼晴對低頻的數據比對高頻的數據具有更高的敏感度,事實上,人類
的眼睛對亮度的改變也比對色彩的改變要敏感得多,也就是說Y成份的數據是比較
重要的。既然Cb成份和Cr成份的數據比較相對不重要,就可以只取部分數據來處
理。以增加壓縮的比例。JPEG通常有兩種采樣方式:YUV411和YUV422,它們所代
表的意義是Y、Cb和Cr三個成份的數據取樣比例。

2.DCT變換

DCT變換的全稱是離散餘弦變換(Discrete Cosine Transform),是指將一組
光強數據轉換成頻率數據,以便得知強度變化的情形。若對高頻的數據做些修飾,
再轉回原來形式的數據時,顯然與原始數據有些差異,但是人類的眼睛卻是不容
易辨認出來。
壓縮時,將原始圖像數據分成8*8數據單元矩陣,例如亮度值的第一個矩陣內
容如下:

JPEG將整個亮度矩陣與色度Cb矩陣,飽和度Cr矩陣,視為一個基本單元稱作
MCU。每個MCU所包含的矩陣數量不得超過10個。例如,行和列采樣的比例皆為4:
2:2,則每個MCU將包含四個亮度矩陣,一個色度矩陣及一個飽和度矩陣。
當圖像數據分成一個8*8矩陣後,還必須將每個數值減去128,然後一一代入
DCT變換公式中,即可達到DCT變換的目的。圖像數據值必須減去128,是因為DCT
轉換公式所接受的數字范圍是在-128到+127之間。
DCT變換公式:

x,y代表圖像數據矩陣內某個數值的坐標位置
f(x,y)代表圖像數據矩陣內的數個數值
u,v代表DCT變換後矩陣內某個數值的坐標位置
F(u,v)代表DCT變換後矩陣內的某個數值
u=0 且 v=0 c(u)c(v)=1/1.414
u>0 或 v>0 c(u)c(v)=1
經過DCT變換後的矩陣數據自然數為頻率系數,這些系數以F(0,0)的值最
大,稱為DC,其餘的63個頻率系數則多半是一些接近於0的正負浮點數,一概稱
之為AC。
3、量化
圖像數據轉換為頻率系數後,還得接受一項量化程序,才能進入編碼階段。
量化階段需要兩個8*8矩陣數據,一個是專門處理亮度的頻率系數,另一個則是
針對色度的頻率系數,將頻率系數除以量化矩陣的值,取得與商數最近的整數,
即完成量化。
當頻率系數經過量化後,將頻率系數由浮點數轉變為整數,這才便於執行最
後的編碼。不過,經過量化階段後,所有數據只保留整數近似值,也就再度損失
了一些數據內容,JPEG提供的量化表如下:

4、編碼
Huffman編碼無專利權問題,成為JPEG最常用的編碼方式,Huffman編碼通常
是以完整的MCU來進行的。
編碼時,每個矩陣數據的DC值與63個AC值,將分別使用不同的Huffman編碼
表,而亮度與色度也需要不同的Huffman編碼表,所以一共需要四個編碼表,才
能順利地完成JPEG編碼工作。
DC編碼
DC是彩採用差值脈沖編碼調制的差值編碼法,也就是在同一個圖像分量中取
得每個DC值與前一個DC值的差值來編碼。DC採用差值脈沖編碼的主要原因是由於
在連續色調的圖像中,其差值多半比原值小,對差值進行編碼所需的位數,會比
對原值進行編碼所需的位數少許多。例如差值為5,它的二進製表示值為101,如
果差值為-5,則先改為正整數5,再將其二進制轉換成1的補數即可。所謂1的補
數,就是將每個Bit若值為0,便改成1;Bit為1,則變成0。差值5應保留的位數
為3,下表即列出差值所應保留的Bit數與差值內容的對照。

在差值前端另外加入一些差值的霍夫曼碼值,例如亮度差值為5(101)的位
數為3,則霍夫曼碼值應該是100,兩者連接在一起即為100101。下列兩份表格分
別是亮度和色度DC差值的編碼表。根據這兩份表格內容,即可為DC差值加上霍夫
曼碼值,完成DC的編碼工作。

AC編碼
AC編碼方式與DC略有不同,在AC編碼之前,首先得將63個AC值按Zig-zag排
序,即按照下圖箭頭所指示的順序串聯起來。

63個AC值排列好的,將AC系數轉換成中間符號,中間符號表示為RRRR/SSSS,
RRRR是指第非零的AC之前,其值為0的AC個數,SSSS是指AC值所需的位數,AC系
數的范圍與SSSS的對應關系與DC差值Bits數與差值內容對照表相似。
如果連續為0的AC個數大於15,則用15/0來表示連續的16個0,15/0稱為ZRL
(Zero Rum Length),而(0/0)稱為EOB(Enel of Block)用來表示其後所
剩餘的AC系數皆等於0,以中間符號值作為索引值,從相應的AC編碼表中找出適
當的霍夫曼碼值,再與AC值相連即可。
例如某一組亮度的中間符為5/3,AC值為4,首先以5/3為索引值,從亮度AC
的Huffman編碼表中找到1111111110011110霍夫曼碼值,於是加上原來100(4)
即是用來取[5,4]的Huffman編碼1111111110011110100,[5,4]表示AC值為4的
前面有5個零。
由於亮度AC,色度AC霍夫曼編碼表比較長,在此省略去,有興趣者可參閱相
關書籍。
實現上述四個步驟,即完成一幅圖像的JPEG壓縮。

參考資料
[1] 林福宗 《圖像文件格式(上)——Windows 編程》,清華大學出版社,
1996年
[2] 李振輝、李仁各編著,《探索圖像文件的奧秘》,清華大學出版社,1996年
[3] 黎洪松、成實譯《JPEG靜止數據壓縮標准》,學苑出版社,1996年

F. 單純形法cb是啥

Cb就是目標方程中的相對應得c,如70是maxZ中X1前面的系數,30是maxZ中X2的系數.B-1是對應的可行基B的逆矩陣.aj就是對應約束方程中的系數。

單純形法是求解線性規劃問題最常用、最有效的演算法之一。單純形法最早由George Dantzig於1947年提出,近70年來,雖有許多變形體已經開發,但卻保持著同樣的基本觀念。如果線性規劃問題的最優解存在,則一定可以在其可行區域的頂點中找到。

基於此,單純形法的基本思路是:先找出可行域的一個頂點,據一定規則判斷其是否最優;若否,則轉換到與之相鄰的另一頂點,並使目標函數值更優;如此下去,直到找到某最優解為止。

基本單純形法:

單純形法的基本想法是從線性規劃可行集的某一個頂點出發,沿著使目標函數值下降的方向尋求下一個頂點,面頂點個數是有限的,所以,只要這個線性規劃有最優解,那麼通過有限步迭代後,必可求出最優解。

為了用迭代法求出線性規劃的最優解,需要解決以下三個問題:

1.最優解判別准則,即迭代終止的判別標准。

2.換基運算,即從一個基可行解迭代出另一個基可行解的方法。

3.進基列的選擇,即選擇合適的列以進行換基運算,可以使目標函數值有較大下降。

G. GDP的三種計算方法比較各有什麼優缺點

這三種方法分別從生產,收入,支出方面計算的 各有各有的特別,原則上三者應該相等

H. 常用數據校驗方法有哪些

奇偶校驗」。內存中最小的單位是比特,也稱為「位」,位有隻有兩種狀態分別以1和0來標示,每8個連續的比特叫做一個位元組(byte)。不帶奇偶校驗的內存每個位元組只有8位,如果其某一位存儲了錯誤的值,就會導致其存儲的相應數據發生變化,進而導致應用程序發生錯誤。而奇偶校驗就是在每一位元組(8位)之外又增加了一位作為錯誤檢測位。在某位元組中存儲數據之後,在其8個位上存儲的數據是固定的,因為位只能有兩種狀態1或0,假設存儲的數據用位標示為1、1、 1、0、0、1、0、1,那麼把每個位相加(1+1+1+0+0+1+0+1=5),結果是奇數,那麼在校驗位定義為1,反之為0。當CPU讀取存儲的數據時,它會再次把前8位中存儲的數據相加,計算結果是否與校驗位相一致。從而一定程度上能檢測出內存錯誤,奇偶校驗只能檢測出錯誤而無法對其進行修正,同時雖然雙位同時發生錯誤的概率相當低,但奇偶校驗卻無法檢測出雙位錯誤。

MD5的全稱是Message-Digest Algorithm 5,在90年代初由MIT的計算機科學實驗室和RSA Data Security Inc 發明,由 MD2/MD3/MD4 發展而來的。MD5的實際應用是對一段Message(位元組串)產生fingerprint(指紋),可以防止被「篡改」。舉個例子,天天安全網提供下載的MD5校驗值軟體WinMD5.zip,其MD5值是,但你下載該軟體後計算MD5 發現其值卻是,那說明該ZIP已經被他人修改過,那還用不用該軟體那你可自己琢磨著看啦。

MD5廣泛用於加密和解密技術上,在很多操作系統中,用戶的密碼是以MD5值(或類似的其它演算法)的方式保存的,用戶Login的時候,系統是把用戶輸入的密碼計算成MD5值,然後再去和系統中保存的MD5值進行比較,來驗證該用戶的合法性。

MD5校驗值軟體WinMD5.zip漢化版,使用極其簡單,運行該軟體後,把需要計算MD5值的文件用滑鼠拖到正在處理的框里邊,下面將直接顯示其MD5值以及所測試的文件名稱,可以保留多個文件測試的MD5值,選定所需要復制的MD5值,用CTRL+C就可以復制到其它地方了。
參考資料:http://..com/question/3933661.html

CRC演算法原理及C語言實現 -來自(我愛單片機)

摘 要 本文從理論上推導出CRC演算法實現原理,給出三種分別適應不同計算機或微控制器硬體環境的C語言程序。讀者更能根據本演算法原理,用不同的語言編寫出獨特風格更加實用的CRC計算程序。
關鍵詞 CRC 演算法 C語言
1 引言
循環冗餘碼CRC檢驗技術廣泛應用於測控及通信領域。CRC計算可以靠專用的硬體來實現,但是對於低成本的微控制器系統,在沒有硬體支持下實現CRC檢驗,關鍵的問題就是如何通過軟體來完成CRC計算,也就是CRC演算法的問題。
這里將提供三種演算法,它們稍有不同,一種適用於程序空間十分苛刻但CRC計算速度要求不高的微控制器系統,另一種適用於程序空間較大且CRC計算速度要求較高的計算機或微控制器系統,最後一種是適用於程序空間不太大,且CRC計算速度又不可以太慢的微控制器系統。
2 CRC簡介
CRC 校驗的基本思想是利用線性編碼理論,在發送端根據要傳送的k位二進制碼序列,以一定的規則產生一個校驗用的監督碼(既CRC碼)r位,並附在信息後邊,構成一個新的二進制碼序列數共(k+r)位,最後發送出去。在接收端,則根據信息碼和CRC碼之間所遵循的規則進行檢驗,以確定傳送中是否出錯。
16位的CRC碼產生的規則是先將要發送的二進制序列數左移16位(既乘以 )後,再除以一個多項式,最後所得到的余數既是CRC碼,如式(2-1)式所示,其中B(X)表示n位的二進制序列數,G(X)為多項式,Q(X)為整數,R(X)是余數(既CRC碼)。
(2-1)
求CRC 碼所採用模2加減運演算法則,既是不帶進位和借位的按位加減,這種加減運算實際上就是邏輯上的異或運算,加法和減法等價,乘法和除法運算與普通代數式的乘除法運算是一樣,符合同樣的規律。生成CRC碼的多項式如下,其中CRC-16和CRC-CCITT產生16位的CRC碼,而CRC-32則產生的是32位的CRC碼。本文不討論32位的CRC演算法,有興趣的朋友可以根據本文的思路自己去推導計算方法。
CRC-16:(美國二進制同步系統中採用)
CRC-CCITT:(由歐洲CCITT推薦)
CRC-32:

接收方將接收到的二進制序列數(包括信息碼和CRC碼)除以多項式,如果余數為0,則說明傳輸中無錯誤發生,否則說明傳輸有誤,關於其原理這里不再多述。用軟體計算CRC碼時,接收方可以將接收到的信息碼求CRC碼,比較結果和接收到的CRC碼是否相同。

3 按位計算CRC
對於一個二進制序列數可以表示為式(3-1):
(3-1)
求此二進制序列數的CRC碼時,先乘以 後(既左移16位),再除以多項式G(X),所得的余數既是所要求的CRC碼。如式(3-2)所示:
(3-2)
可以設: (3-3)
其中 為整數, 為16位二進制余數。將式(3-3)代入式(3-2)得:

(3-4)
再設: (3-5)
其中 為整數, 為16位二進制余數,將式(3-5)代入式(3-4),如上類推,最後得到:
(3-6)
根據CRC的定義,很顯然,十六位二進制數 既是我們要求的CRC碼。
式(3 -5)是編程計算CRC的關鍵,它說明計算本位後的CRC碼等於上一位CRC碼乘以2後除以多項式,所得的余數再加上本位值除以多項式所得的余數。由此不難理解下面求CRC碼的C語言程序。*ptr指向發送緩沖區的首位元組,len是要發送的總位元組數,0x1021與多項式有關。
[code]
unsigned int cal_crc(unsigned char *ptr, unsigned char len) {
unsigned char i;
unsigned int crc=0;
while(len--!=0) {
for(i=0x80; i!=0; i/=2) {
if((crc&0x8000)!=0) {crc*=2; crc^=0x1021;} /* 余式CRC乘以2再求CRC */
else crc*=2;
if((*ptr&i)!=0) crc^=0x1021; /* 再加上本位的CRC */
}
ptr++;
}
return(crc);
}
[code]
按位計算CRC雖然代碼簡單,所佔用的內存比較少,但其最大的缺點就是一位一位地計算會佔用很多的處理器處理時間,尤其在高速通訊的場合,這個缺點更是不可容忍。因此下面再介紹一種按位元組查錶快速計算CRC的方法。
4 按位元組計算CRC
不難理解,對於一個二進制序列數可以按位元組表示為式(4-1),其中 為一個位元組(共8位)。
(4-1)
求此二進制序列數的CRC碼時,先乘以 後(既左移16位),再除以多項式G(X),所得的余數既是所要求的CRC碼。如式(4-2)所示:
(4-2)
可以設: (4-3)
其中 為整數, 為16位二進制余數。將式(4-3)代入式(4-2)得:
(4-4)
因為:
(4-5)
其中 是 的高八位, 是 的低八位。將式(4-5)代入式(4-4),經整理後得:
(4-6)
再設: (4-7)
其中 為整數, 為16位二進制余數。將式(4-7)代入式(4-6),如上類推,最後得:
(4-
很顯然,十六位二進制數 既是我們要求的CRC碼。
式(4 -7)是編寫按位元組計算CRC程序的關鍵,它說明計算本位元組後的CRC碼等於上一位元組余式CRC碼的低8位左移8位後,再加上上一位元組CRC右移8位(也既取高8位)和本位元組之和後所求得的CRC碼,如果我們把8位二進制序列數的CRC全部計算出來,放如一個表裡,採用查表法,可以大大提高計算速度。由此不難理解下面按位元組求CRC碼的C語言程序。*ptr指向發送緩沖區的首位元組,len是要發送的總位元組數,CRC余式表是按0x11021多項式求出的。
[code]
unsigned int cal_crc(unsigned char *ptr, unsigned char len) {
unsigned int crc;
unsigned char da;
unsigned int crc_ta[256]={ /* CRC余式表 */
0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
0x 1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,
0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,
0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,
0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,
0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,
0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,
0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,
0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,
0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,
0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,
0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,
0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,
0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,
0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,
0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,
0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,
0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,
0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,
0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,
0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,
0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,
0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,
0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,
0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0
};

crc=0;
while(len--!=0) {
da=(uchar) (crc/256); /* 以8位二進制數的形式暫存CRC的高8位 */
crc<<=8; /* 左移8位,相當於CRC的低8位乘以 */
crc^=crc_ta[da^*ptr]; /* 高8位和當前位元組相加後再查表求CRC ,再加上以前的CRC */
ptr++;
}
return(crc);
}
很顯然,按位元組求CRC時,由於採用了查表法,大大提高了計算速度。但對於廣泛運用的8位微處理器,代碼空間有限,對於要求256個CRC余式表(共512位元組的內存)已經顯得捉襟見肘了,但CRC的計算速度又不可以太慢,因此再介紹下面一種按半位元組求CRC的演算法。
5 按半位元組計算CRC
同樣道理,對於一個二進制序列數可以按位元組表示為式(5-1),其中 為半個位元組(共4位)。
(5-1)
求此二進制序列數的CRC碼時,先乘以 後(既左移16位),再除以多項式G(X),所得的余數既是所要求的CRC碼。如式(4-2)所示:
(5-2)
可以設: (5-3)
其中 為整數, 為16位二進制余數。將式(5-3)代入式(5-2)得:
(5-4)
因為:
(5-5)
其中 是 的高4位, 是 的低12位。將式(5-5)代入式(5-4),經整理後得:
(5-6)
再設: (5-7)
其中 為整數, 為16位二進制余數。將式(5-7)代入式(5-6),如上類推,最後得:
(5-
很顯然,十六位二進制數 既是我們要求的CRC碼。
式(5 -7)是編寫按位元組計算CRC程序的關鍵,它說明計算本位元組後的CRC碼等於上一位元組CRC碼的低12位左移4位後,再加上上一位元組余式CRC右移4位(也既取高4位)和本位元組之和後所求得的CRC碼,如果我們把4位二進制序列數的CRC全部計算出來,放在一個表裡,採用查表法,每個位元組算兩次(半位元組算一次),可以在速度和內存空間取得均衡。由此不難理解下面按半位元組求CRC碼的C語言程序。*ptr指向發送緩沖區的首位元組,len是要發送的總位元組數,CRC余式表是按0x11021多項式求出的。
unsigned cal_crc(unsigned char *ptr, unsigned char len) {
unsigned int crc;
unsigned char da;
unsigned int crc_ta[16]={ /* CRC余式表 */
0x0000,0x1021,0x2042,0x3063,0x4084,0x50a5,0x60c6,0x70e7,
0x8108,0x9129,0xa14a,0xb16b,0xc18c,0xd1ad,0xe1ce,0xf1ef,
}

crc=0;
while(len--!=0) {
da=((uchar)(crc/256))/16; /* 暫存CRC的高四位 */
crc<<=4; /* CRC右移4位,相當於取CRC的低12位)*/
crc^=crc_ta[da^(*ptr/16)]; /* CRC的高4位和本位元組的前半位元組相加後查表計算CRC,
然後加上上一次CRC的余數 */
da=((uchar)(crc/256))/16; /* 暫存CRC的高4位 */
crc<<=4; /* CRC右移4位, 相當於CRC的低12位) */
crc^=crc_ta[da^(*ptr&0x0f)]; /* CRC的高4位和本位元組的後半位元組相加後查表計算CRC,
然後再加上上一次CRC的余數 */
ptr++;
}
return(crc);
}
[code]
5 結束語
以上介紹的三種求CRC的程序,按位求法速度較慢,但佔用最小的內存空間;按位元組查表求CRC的方法速度較快,但佔用較大的內存;按半位元組查表求CRC的方法是前兩者的均衡,即不會佔用太多的內存,同時速度又不至於太慢,比較適合8位小內存的單片機的應用場合。以上所給的C程序可以根據各微處理器編譯器的特點作相應的改變,比如把CRC余式表放到程序存儲區內等。[/code]

hjzgq 回復於:2003-05-15 14:12:51
CRC32演算法學習筆記以及如何用java實現 出自:csdn bootcool 2002年10月19日 23:11 CRC32演算法學習筆記以及如何用java實現

CRC32演算法學習筆記以及如何用java實現

一:說明

論壇上關於CRC32校驗演算法的詳細介紹不多。前幾天偶爾看到Ross N. Williams的文章,總算把CRC32演算法的來龍去脈搞清楚了。本來想把原文翻譯出來,但是時間參促,只好把自己的一些學習心得寫出。這樣大家可以更快的了解CRC32的主要思想。由於水平有限,還懇請大家指正。原文可以訪問:http://www.repairfaq.org/filipg/LINK/F_crc_v31.html 。

二:基本概念及相關介紹

2.1 什麼是CRC

在遠距離數據通信中,為確保高效而無差錯地傳送數據,必須對數據進行校驗即差錯控制。循環冗餘校驗CRC(Cyclic Rendancy Check/Code)是對一個傳送數據塊進行校驗,是一種高效的差錯控制方法。

CRC校驗採用多項式編碼方法。多項式乘除法運算過程與普通代數多項式的乘除法相同。多項式的加減法運算以2為模,加減時不進,錯位,如同邏輯異或運算。

2.2 CRC的運算規則

CRC加法運算規則:0+0=0

0+1=1

1+0=1

1+1=0 (注意:沒有進位)

CRC減法運算規則:

0-0=0

0-1=1

1-0=1

1-1=0

CRC乘法運算規則:

0*0=0

0*1=0

1*0=0

1*1=1

CRC除法運算規則:

1100001010 (注意:我們並不關心商是多少。)

_______________

10011 11010110110000

10011,,.,,....

-----,,.,,....

10011,.,,....

10011,.,,....

-----,.,,....

00001.,,....

00000.,,....

-----.,,....

00010,,....

00000,,....

-----,,....

00101,....

00000,....

-----,....

01011....

00000....

-----....

10110...

10011...

-----...

01010..

00000..

-----..

10100.

10011.

-----.

01110

00000

-----

1110 = 余數

2.3 如何生成CRC校驗碼

(1) 設G(X)為W階,在數據塊末尾添加W個0,使數據塊為M+ W位,則相應的多項式為XrM(X);

(2) 以2為模,用對應於G(X)的位串去除對應於XrM(X)的位串,求得余數位串;

(3) 以2為模,從對應於XrM(X)的位串中減去余數位串,結果就是為數據塊生成的帶足夠校驗信息的CRC校驗碼位串。

2.4 可能我們會問那如何選擇G(x)

可以說選擇G(x)不是一件很容易的事。一般我們都使用已經被大量的數據,時間檢驗過的,正確的,高效的,生成多項式。一般有以下這些:

16 bits: (16,12,5,0) [X25 standard]

(16,15,2,0) ["CRC-16"]

32 bits: (32,26,23,22,16,12,11,10,8,7,5,4,2,1,0) [Ethernet]

三: 如何用軟體實現CRC演算法

現在我們主要問題就是如何實現CRC校驗,編碼和解碼。用硬體實現目前是不可能的,我們主要考慮用軟體實現的方法。

以下是對作者的原文的翻譯:

我們假設有一個4 bits的寄存器,通過反復的移位和進行CRC的除法,最終該寄存器中的值就是我們所要求的余數。

3 2 1 0 Bits

+---+---+---+---+

Pop <-- | | | | | <----- Augmented message(已加0擴張的原始數據)

+---+---+---+---+

1 0 1 1 1 = The Poly

(注意: The augmented message is the message followed by W zero bits.)

依據這個模型,我們得到了一個最最簡單的演算法:

把register中的值置0.

把原始的數據後添加r個0.

While (還有剩餘沒有處理的數據)

Begin

把register中的值左移一位,讀入一個新的數據並置於register的0 bit的位置。

If (如果上一步的左移操作中的移出的一位是1)

register = register XOR Poly.

End

現在的register中的值就是我們要求的crc余數。

我的學習筆記:

可為什麼要這樣作呢?我們從下面的實例來說明:

1100001010

_______________

10011 11010110110000

10011,,.,,....

-----,,.,,....

-》 10011,.,,....

10011,.,,....

-----,.,,....

-》 00001.,,....

00000.,,....

-----.,,....

00010,,....

00000,,....

-----,,....

00101,....

00000,....

我們知道G(x)的最高位一定是1,而商1還是商0是由被除數的最高位決定的。而我們並不關心商究竟是多少,我們關心的是余數。例如上例中的G(x)有5 位。我們可以看到每一步作除法運算所得的余數其實就是被除數的最高位後的四位於G(x)的後四位XOR而得到的。那被除數的最高位有什麼用呢?我們從打記號的兩個不同的余數就知道原因了。當被除數的最高位是1時,商1然後把最高位以後的四位於G(x)的後四位XOR得到余數;如果最高位是0,商0然後把被除數的最高位以後的四位於G(x)的後四位XOR得到余數,而我們發現其實這個余數就是原來被除數最高位以後的四位的值。也就是說如果最高位是0就不需要作XOR的運算了。到這我們總算知道了為什麼先前要這樣建立模型,而演算法的原理也就清楚了。

以下是對作者的原文的翻譯:

可是這樣實現的演算法卻是非常的低效。為了加快它的速度,我們使它一次能處理大於4 bit的數據。也就是我們想要實現的32 bit的CRC校驗。我們還是假設有和原來一樣的一個4 "bit"的register。不過它的每一位是一個8 bit的位元組。

3 2 1 0 Bytes

+----+----+----+----+

Pop <-- | | | | | <----- Augmented message

+----+----+----+----+

1<------32 bits------> (暗含了一個最高位的「1」)

根據同樣的原理我們可以得到如下的演算法:

While (還有剩餘沒有處理的數據)

Begin

檢查register頭位元組,並取得它的值

求不同偏移處多項式的和

register左移一個位元組,最右處存入新讀入的一個位元組

把register的值和多項式的和進行XOR運算

End

我的學習筆記:

可是為什麼要這樣作呢? 同樣我們還是以一個簡單的例子說明問題:

假設有這樣的一些值:

當前register中的值: 01001101

4 bit應該被移出的值:1011

生成多項式為: 101011100

Top Register

---- --------

1011 01001101

1010 11100 + (CRC XOR)

-------------

0001 10101101

首4 bits 不為0說明沒有除盡,要繼續除:

0001 10101101

1 01011100 + (CRC XOR)

-------------

0000 11110001

^^^^

首4 bits 全0說明不用繼續除了。

那按照演算法的意思作又會有什麼樣的結果呢?

1010 11100

1 01011100+

-------------

1011 10111100

1011 10111100

1011 01001101+

-------------

0000 11110001

現在我們看到了這樣一個事實,那就是這樣作的結果和上面的結果是一致的。這也說明了演算法中為什麼要先把多項式的值按不同的偏移值求和,然後在和 register進行異或運算的原因了。另外我們也可以看到,每一個頭位元組對應一個值。比如上例中:1011,對應01001101。那麼對於 32 bits 的CRC 頭位元組,依據我們的模型。頭8 bit就該有 2^8個,即有256個值與它對應。於是我們可以預先建立一個表然後,編碼時只要取出輸入數據的頭一個位元組然後從表中查找對應的值即可。這樣就可以大大提高編碼的速度了。

+----+----+----+----+

+-----< | | | | | <----- Augmented message

| +----+----+----+----+

| ^

| |

| XOR

| |

| 0+----+----+----+----+

v +----+----+----+----+

| +----+----+----+----+

| +----+----+----+----+

| +----+----+----+----+

| +----+----+----+----+

| +----+----+----+----+

+-----> +----+----+----+----+

+----+----+----+----+

+----+----+----+----+

+----+----+----+----+

+----+----+----+----+

255+----+----+----+----+

以下是對作者的原文的翻譯:

上面的演算法可以進一步優化為:

1:register左移一個位元組,從原始數據中讀入一個新的位元組.

2:利用剛從register移出的位元組作為下標定位 table 中的一個32位的值

3:把這個值XOR到register中。

4:如果還有未處理的數據則回到第一步繼續執行。

用C可以寫成這樣:

r=0;

while (len--)
r = ((r << | p*++) ^ t[(r >> 24) & 0xFF];

可是這一演算法是針對已經用0擴展了的原始數據而言的。所以最後還要加入這樣的一個循環,把W個0加入原始數據。

我的學習筆記:

注意不是在預處理時先加入W個0,而是在上面演算法描述的循環後加入這樣的處理。

for (i=0; i<W/4; i++)
r = (r << ^ t[(r >> 24) & 0xFF];
所以是W/4是因為若有W個0,因為我們以位元組(8位)為單位的,所以是W/4個0 位元組。注意不是循環w/8次
以下是對作者的原文的翻譯:
1:對於尾部的w/4個0位元組,事實上它們的作用只是確保所有的原始數據都已被送入register,並且被演算法處理。
2:如果register中的初始值是0,那麼開始的4次循環,作用只是把原始數據的頭4個位元組送入寄存器。(這要結合table表的生成來看)。就算 register的初始值不是0,開始的4次循環也只是把原始數據的頭4個位元組把它們和register的一些常量XOR,然後送入register中。

3A xor B) xor C = A xor (B xor C)

總上所述,原來的演算法可以改為:

+-----<Message (non augmented)
|
v 3 2 1 0 Bytes
| +----+----+----+----+
XOR----<| | | | |
| +----+----+----+----+
| ^
| |
| XOR
| |
| 0+----+----+----+----+
v +----+----+----+----+
| +----+----+----+----+
| +----+----+----+----+
| +----+----+----+----+
| +----+----+----+----+
| +----+----+----+----+
+----->+----+----+----+----+
+----+----+----+----+
+----+----+----+----+
+----+----+----+----+
+----+----+----+----+
255+----+----+----+----+

演算法:

1:register左移一個位元組,從原始數據中讀入一個新的位元組.

2:利用剛從register移出的位元組和讀入的新位元組XOR從而產生定位下標,從table中取得相應的值。

3:把該值XOR到register中

4:如果還有未處理的數據則回到第一步繼續執行。

我的學習筆記:

對這一演算法我還是不太清楚,或許和XOR的性質有關,懇請大家指出為什麼?

謝謝。

到這,我們對CRC32的演算法原理和思想已經基本搞清了。下章,我想著重根據演算法思想用java語言實現。

hjzgq 回復於:2003-05-15 14:14:51
數學演算法一向都是密碼加密的核心,但在一般的軟路加密中,它似乎並不太為人們所關心,因為大多數時候軟體加密本身實現的都是一種編程上的技巧。但近幾年來隨著序列號加密程序的普及,數學演算法在軟體加密中的比重似乎是越來越大了。

我們先來看看在網路上大行其道的序列號加密的工作原理。當用戶從網路上下載某個Shareware -- 共享軟體後,一般都有使用時間上的限制,當過了共享軟體的試用期後,你必須到這個軟體的公司去注冊後方能繼續使用。注冊過程一般是用戶把自己的私人信息(一般主要指名字)連同信用卡號碼告訴給軟體公司,軟體公司會根據用戶的信息計算出一個序列碼出來,在用戶得到這個序列碼後,按照注冊需要的步驟在軟體中輸入注冊信息和注冊碼,其注冊信息的合法性由軟體驗證通過後,軟體就會取消掉本身的各種限制。這種加密實現起來比較簡單,不需要額外的成本,用戶購買也非常方便,在網上的軟體80%都是以這種方式來保護的。

我們可以注意到軟體驗證序列號的合法性過程,其實就是驗證用戶名與序列號之間的換算關系是否正確的過程。其驗證最基本的有兩種,一種是按用戶輸入的姓名來生成注冊碼,再同用戶輸入的注冊碼相比較,公式表示如下:

序列號 = F(用戶名稱)

I. 基本圖像分析

grayscale image---->灰度圖像的意思

了解了圖像原理之後,我們就介紹分別有哪些圖像的種類,而這些圖像又以檔案的形式儲存在硬碟裡面,或者傳輸於網路之上.
關於檔案格式的最主要考量就是壓縮的方法,我們介紹壓縮的分類與應用上的考量.
數點陣圖像的像素 (1/2)
這是一份所謂 320 x 200 的圖,它的「寬度」(Width) 有 320 像素 (pixels),「高度」 (Height) 有 200 條線 (lines).
先解釋像素 (pixel).一張像這個小丑圖的數點陣圖像,其實是由一堆小粒小粒的色綵排出來的.
每一小粒色彩代表一個單一的顏色,這些不同的顏色湊在一起,被我們看到,就在腦袋裡產生了意義,因而認出來這是一個化了妝的小丑.
每一小粒色彩,用一個,兩個,或三個數來紀錄,稱為一個「像素」.
數點陣圖像的像素 (2/2)
所謂 320 x 200 的圖,就是寬有 320 個像素,高有 200條線 的圖,想像那些像素排成一個矩形,總共有 64,000 個像素.
230 x 200 的像素矩形太大了,所以我們故意把它縮小成一張 40 x 25 的圖.
如果覺得它太小了看不見,可以放大八倍 (寬和高各放大 8 倍) 來看看.
256 色圖
縮小的小丑圖是一張『256 色』圖,寬有 40 個像素,高有 25 個像素.每個像素用一個介於 1 和 256 之間的數表示.
256 色圖
『256 色』圖的像素代表的不是色彩,而是色彩的編號.以這張小丑圖為例,它一共只用到 81 種不同的顏色.
灰階圖 (1/2)
現在展示一張灰階的小丑圖.它的寬度是 320,高度是 200,也就是仍然有 64,000 個像素,但是此時是個『灰階』圖,每個像素就直接紀錄那個位置的灰色亮度.
我們可以觀察,這張『灰階』圖的像素數值與『256 色』圖的像素數值相同,電腦只是將像素的數值解釋成『亮度』,就造成了這張圖.
灰階圖 (2/2)
『灰階』圖不需要另外儲存色盤,每個像素直接紀錄那個位置的灰色亮度.因為電腦知道,譬如說 64 號亮度的 RGB 亮度就是 (64, 64, 64).為了能夠列出像素的數值,我們還是只看那張縮小的黑白版小丑圖 .
高彩圖
所謂『高彩』圖就是同一張圖裡面可以顯示不超過 65,536 種不同的顏色.很顯然地,像小丑圖這種總共只有 64,000 個像素的圖,不太可能用到這麼多不同的顏色.『高彩』圖的每個像素要用兩個數表示,每個數都介於 0 和 255 之間.
…..
全彩圖
所謂的『全彩』圖就是同一張圖裡面可以顯示所有可能的色彩,也就是 255 x 255 x 255 共約一千六百萬色.很顯然地,像小丑圖這種總共只有 64,000 個像素的圖,根本不可能用到這麼多不同的顏色 (每個像素只代表一個顏色).

圖像的『資料量』
所謂圖像的『資料量』就是一張數點陣圖像在記憶體內所佔有的空間.
資料量越大的圖像,通常在螢幕上看起來越大,色彩也越豐富,但是它佔用的記憶體就越多.
視覺上我們認為數點陣圖像有兩個維度:寬 (Width) 和高 (Height).
現在要接受一個新的概念:數點陣圖像其實有三個維度:除了寬度和高度之外,還有『深度』或者『厚度』.
而數點陣圖像的資料量,就是這三個維度的乘積,也就是體積.
數點陣圖像的深度
決定圖像資料量的第三個維度就是選用的色彩豐富程度,術語稱作深度 (Depth).
其實深度就是每個像素代表幾個數的意思.色彩最單調的就是『灰階』圖,它的深度是 1.
比『灰階』圖多一點點色彩的是『256 色』圖,它的深度理論上也是 1,因為每個像素只代表一個數:色盤上的編號.
但是因為含有色盤的關系,經驗上我們就說其深度是 1.01.這是一個我不打算講清楚細節的地方.
『高彩』圖的深度是 2,『全彩』圖的深度是 3.
圖像的資料量
一張數點陣圖像的資料量,就是上述寬,高,深所形成的立方體體積,而單位是 Byte (『字元』或『位元組』).電腦的術語中,稱 1024 Byte 為一個『千』Byte,記做 KB (kilo-byte);又稱 1024 個 KB,或者大約一百萬個 Byte 為 MB (mega-byte).
以一張 320 x 200 的『灰階』圖為例,其資料量就是 320 * 200 * 1 = 64,000 byte 也就是 62.5KB.
以一張 320 x 200 的『全彩』圖為例,其資料量就是 320 * 200 * 3 = 192000 byte 也就是 187.5KB.
檔案與壓縮
在這張圖像,軟體和檔案之間的關系示意圖上,我們看到電腦以『檔案』的形式儲存數點陣圖像於磁碟機內,或者傳輸數點陣圖像於網際網路上.
負責儲存或傳輸的是作業系統 (OS),例如 MS-Windows 98, ME, XP 之類的.
但是負責展現圖像的軟體,例如 MS-IE,檔案總管,ACDsee 或 PhotoImpact 之類的,卻要負責把檔案內容轉換成像素的數值,若是遇到『256 色』圖,還要處理色盤.
壓縮比
檔案通常不會一五一十地儲存像素 (和色盤) 所對應的數值,而是儲存經過壓縮的像素數值.
壓縮的過程其實是按照一種數學函數,把像素的數值按照函數規則映射到另一種數值.
我們使用電腦,應該已經知道每個檔案的性質之中,有所謂的『檔案大小』,也是用 Byte 作單位來計量.
壓縮之後的數點陣圖像通常會變得比較小,也就是說檔案大小應該會小於圖像的資料量.變小的比率就是『壓縮比』.
無失真(Lossless)壓縮與破壞性(Losssy)壓縮 (1/2)
無失真壓縮與破壞性壓縮 (2/2)
圖片格式的壓縮法 (1/2)
圖片格式的壓縮法 (2/2)
圖像的呈現
在這個可愛的動畫裡面,我們提示:是監視器『跑去拿』VRAM 裡面的指示,而不是電腦將指示從 VRAM 『送給』監視器.監視器每隔一小段時間就去電腦裡面拿 VRAM 裡面的指示,然後按照只是在螢幕上掃射各種不同的顏色.因為它掃得很快,我們的眼睛因為視覺暫留的關系,就覺得那個畫面是靜止的.
像素和光點
像素和光點之間的對應,正常的時候是 1 對 1,也就是一個像素就對應一粒光點.讓我們重溫縮小版的小丑圖,當像素與光點是正常地 1:1 的時候,實在是很小,看不見.如果有必要的話,軟體可以讓一個像素對應更多粒光點,例如 1:64.這就是『強迫放大』一張圖像的效果.雖然圖像的畫面是放大了,不過一點也沒有變得比較清楚.
所謂監視器的『解析度』就是每列有幾個光點,一共有幾列光點.例如 800 x 600 的解析度就是在監視器上,每列有 800 個光點,一共 600 列.
影像媒體
影像原理
影像格式
數點陣圖像導論
圖片JPEG影像類型討論
圖形壓縮,解壓縮探討JPEG 原理
圖片JPEG影像類型討論 (1/3)
目前影像壓縮的方法有很多種,基本上可以分為「無失真」及「有失真」兩類.例如我們常見的PCX ,GIF ,TIFF ,及TGA 等格式就是屬於無失真的影像壓縮格式.
它們利用傳統檔案的壓縮原理及技術來處理影像壓縮,所以壓縮前的原始影像與壓縮後還原的結果絲毫不差.
至於我們所熟知的 JPEG (Joint Photographic Coding Expert Group) 則是屬於有失真的影像壓縮格式.
圖片JPEG影像類型討論 (2/3)
JPEG 由國際標准組織(International Organization for Standardization ,簡稱ISO) 和國際電話電報諮詢委員會( International Telegraph and Telephone Consultative Committee ,簡稱CCITT) 所建立的一個數位影像壓縮標准,主要是用於靜態影像壓縮方面.
JPEC 採用可失真(Lossy) 編碼法的概念,利用數位餘弦轉換法(Discrete Cosine Transform,簡稱DCT) 將影像資料中較不重要的部份去除,僅保留重要的資訊,以達到高壓縮率的目的.
雖然被JPEC 處理後的影像會有失真的現象,但由於JPEG 的失真比例可以利用參數來加以控制;一般而言,當壓縮率( 即壓縮過後的體積除以原有資料量的結果) 在5% ~15% 之間時,JPEC 依然能保證其適當的影像品質,這是一般無失真壓縮法所作不到的.
圖片JPEG影像類型討論 (3/3)
我們將以下圖的陽明山風景為例,利用不同的JPEC 壓縮參數(PHOTOIMPACT 5.0 漸進式 1024 X 768)來壓縮它,其壓縮的結果如圖二和圖三.圖二的影像品質與原圖十分接近,而壓縮率已達65% ;至於圖三,其壓縮率為25% ,壓縮效果良好,但此時影像品質已經有明顯的失真了.
JPEG100 原圖100%_ 671K
JPEG65 壓縮65%_ 341K
JPEG25 壓縮25% 261K
JPEG原理 (1/3)
JPEG所根據的原理是:人的眼睛對影像中亮度的變化最為敏感,遠遠超過對顏色變化的感覺,所以,JPEG儲存的,並不是一點一點的顏色,而是亮度及顏色的"變化率".藉著變化速率的曲線的還原,來重現大部分的影像,尤其是影像的"感覺".
對大部分JPEG型態的壓縮來說,第一步要先將RGB轉換成亮度與色度,最常見的是CCIR601格式,也就是所謂Y,Cb,,Cr格式,Y代表亮度,Cb代表藍色色度,Cr代表紅色色度( 也可用U代表Cb, V代表Cr,即所謂YUV格式),轉換公式如下:
Y = 0.299R + 0.587G + 0.114B
Cb = 0.1687R – 0.3313G + 0.5B
Cr = 0.5R – 0.4187G – 0.0813B
這是一個不會失真的轉換,Y,Cb,Cr還是可以完全轉換回R,G,B的.
JPEG原理 (2/3)
由於人眼對亮度遠比對色度敏感,所以在壓縮和重建影像時,可以用份量較多的Y,而減少Cb 及Cr的份量.
轉換後的數值,仍然是一個圖點一個圖點的格式.必須將相鄰近的點合並,透過DCT(Discrete Cosine transform)轉換,將點資料轉換成"變化速率"的曲線資料,再將這曲線數位化(這就就是造成JPEG失真所在的地方) .
數位化時所用的系數,決定了資料流失量的多寡,及影像品質的好壞,這些被數位化後的資料,還可以再用Huffman或其他編碼方式,予以壓縮,存成JPEG檔案.還原的步驟剛好逆其道而行.
首先,將JPEG資料解壓縮,變成變化速率數位曲線,然後使用逆向的DCT轉換,重建影像.原本一些低階的位元,可能無法重現,都用0加以補足.
JPEG原理 (3/3)
由於Y,Cb,Cr的重要性不同,JPEG允許三者各自賦予不同的份量.例如:以一個2x2點矩陣(共4個圖點)來說,Y值最好有4個(共有4個圖點),但Cb,Cr各自只記錄一個(平均值),這樣一來,原本在RGB模式,需要4x3=12 bytes的資料,現在只需要4+1+1=6 bytes,無形中節省了50%的空間,但影響影像品質並沒有太多.
致於DCT,其實是有點類似傅立葉轉換,將原本屬於振幅強度的資料陣列,轉換成強度變化頻率的資料陣列.
JPEG使用線性數位化,也就是每一個DCT轉換值,都被一個不同的數位化系數去除,再四拾五入到一個整數,以儲存起來.在這個過程中,變化率陣列的每一個元素,將會視其頻率大小,除以一個不同的系數.
對人眼來說,比較緩慢的變化,會比快速變化更被注意.這個過程會把資料的長度大幅降低.所以變化率越大的元素,壓縮比越大.這也就是JPEG對於不規則影像( 如電視畫面,照片等)比較有利的地方.
影像媒體
影像原理
影像格式
數點陣圖像導論
圖片JPEG影像類型討論
圖形壓縮,解壓縮探討JPEG 原理
圖形壓縮,解壓縮探討JPEG 原理
JPEG是一種對彩色或灰階之類連續色調圖形作壓縮和解壓縮的標准.
這個標準是由ISO/IEC JTC1/SC29 WG10所訂定.JPEG可應用在許多如研討畫圖片,彩色電傳,影像資料庫,桌上出版系統,多媒體及醫療等的靜態影像的壓縮之上.
JPEG最基本的概念就是將影像的一個區塊從空間域轉換為頻率域.一般而言影像高頻部份的量會比低頻部份要小得多.
而由於人們的眼睛對空間高頻的部份較不敏感,因此高頻部份就可以用較大量化處理的方式來產生較為粗略的影像來表示,由於較粗略的影像需要較少的位元,於是可以大幅度地減少要儲存或通訊的資訊量,而縮減後的資訊影像也的確可以為人們的視覺感官所接受.
影像壓縮原理
資料的壓縮方法可分為無損壓縮 (lossless compression) 與略損壓縮(lossy compression)兩類.
對於資料本身在壓縮後再還原必須保持原貌的需求上,必須使用無損壓縮,無損壓縮有不得失真的限制,因此壓縮效果有限.對於文數字,程式等資料型態適用.
影像資料的一個特性是空間冗餘(Spatial Rendancy).
一般來說,在同一張畫面上必有一些共通特性(Correlation),也許是色彩上的,也許是幾何上的,或是其它特徵值得到的.
所謂的空間冗餘去除,就是要識別出畫面中重要的元素,並移除重復且較無影響的元素的動作.
影像壓縮方法概說 (1/2)
首先介紹一種基本的壓縮方法: 稱為變動長度編碼法(Run Length Encoding,簡稱RLE).
其原理是把資料中重復多次的內容,記錄其內容細節與出現約次數.例如: ABCDEABCDEABCDEABODE,我們可記錄ABCDE出現4次,兩項資訊,是不是比直接記錄重復的ABCDE要精簡呢
變動長度編碼法的演演算法相當簡單,除了可以直接應用外也可以與其他壓縮方法搭配.
但變動長度編碼法不一定能達到壓縮的效果,有時候遇到重復性很低的資料,壓過的大小可能不減反增.
影像壓縮方法概說 (2/2)
In order to understand the correlation between pixels in an image and hence decide which data to eliminate mathematical transforms are used.
目前使用在影像壓縮的最普及數學轉換為離散餘弦轉換 (DCT,Discrete Cosine Transform) .
DCT是用來分析影像資料中較不重要的部分,然後用量化(Quantization)方法將其去除,僅保留重要資訊,來達到高壓縮的效果,
而其失真比例可以利用量化參數來加以控制.此方法用於JPEG格式之影像,當壓縮比在5% ~ 15%間時,依然能保證其適當的影像品質.此一壓縮方法的發展,讓影像媒體的儲存與應用更加地方便.
JPEG Compression with Different Quality
Original
QF=20
QF=50
QF=30
QF=80
QF=10
原圖與壓縮圖比較
原圖與壓縮圖比較 cont'd
原圖與壓縮圖比較 cont'd
原圖與壓縮圖比較 cont'd
原圖與壓縮圖比較 cont'd
原圖與壓縮圖比較 cont'd
Subjective View of Titanic
Baseline JPEG Encoding
Convert to
8x8 block
Subtract
128 in pixel
DCT
Transform
Quantize
Zigzag/
RLC
Entropy
Encode
DPCM
Encode
DC coefficient
AC Range: -1023 ~ 1023
DC Range: 0 ~ 2048
JPEG 編碼及解碼器
8X8
像素
區塊
FDCT
編碼資料流
JPEG
語法
產生器
無失真壓縮
霍夫曼編碼
失真壓縮
量化處理
斜向
掃描
量化表
霍夫曼
編碼表
FDCT:Forward Discrete Transform(正離散餘弦轉換)
8X8
像素
區塊
IDCT
編碼資料流
JPEG
語法
產生器
無失真壓縮
霍夫曼編碼
反量化
斜向
掃描
量化表
霍夫曼
編碼表
IDCT:Inverse Discrete Transform(逆離散餘弦轉換)
JPEG編碼方式
為了因應不同的通訊及儲存狀況下之應用,JPEG提供二四種不同的編碼方式:
1,循序模式 (Sequential mode)
2,漸進模式(Progressive mode)
3,層模式(Hierarchical mode)
4,無失真模式(Losslessmode)
1,循序模式(Sequential mode)
循序模式編碼的方式將影像以掃瞄方式由左至右由上而下作編碼,這個循序模式的編碼架構簡單而有效率,對大部份的應用程式是相當合宜的,架構僅對資料作單一次處理的方式作影像編碼的工作,也就是所謂的循序編碼的模式了.這種方式對每個輸入資料提供8位元的解析度.
Sequential Coding Example
Sequential Coding Example
2,漸進模式(Progressive mode)
影像的建立無論是採取從模糊的低頻影像到清晰的高頻影像 (即頻譜選擇 方式),或是自最大有效位元到最小有效位元的建立方式(即連續近似法), 漸進模式的編碼都對影像作多重掃描來作處理.以頻譜選擇方式為例,影 像以DCT轉換到頻率域,而一些頻寬可立即從DCT系數得到,由於只執行一次DCT,因此在這樣的方式下只有一種的空間解析度.漸進模式對於在頻寬受到限制的頻道上作影像傳輸相當有用,使用者可以先看到粗略的影像,再決定是否需要最終的影像.
漸進模式解壓縮後影像呈現的方式,先出現模糊的低頻影像,而後再顯現清晰的高頻影像.這種的編碼方式滿足了許多應用程式漸進呈現顯示,算術編碼以及對解析度 (如12位元)的較高需求,算術編碼法提供了比Huffman編碼法有5-10%更好的壓縮.
另外此模式也對循序編碼和八位元的解析度提供了支援.
Progressive Coding Example
Progressive Coding Example
3,階層模式(Hierarchical mode)
階層模式的編碼方式乃是將影像以低空間解析度的影像先作編碼,再以此低解析度影像為基礎對較高解析度影像與低解析度影像問的差異作編碼以得到較高解析度的編碼影像.
相同一個影像可以以階層模式作好幾種不同解析度的編碼,階層模式可以同時滿足各種具有不同容量的設備上,使得即使低價的設備也可以將此一多解析度的影像作解碼後得到其所能達到的最佳品質.
相較之下.漸進模式只能採用單一解析度作影像的重建與顯現,階層模式的確為各種不同的設備提供了更佳的強性與解析度.
Hierarchical Coding Example
4,無失真模式 (Lossless Mode)
所謂的無失真表示了此模式可以將影像原原本本地將影像還原重建回來.
為了重建時能得到和原來完全一樣的影像,在無失真模式下並沒有使用DCT,也因此無失真模式的壓縮率比使用DCT作壓縮處理的失真方式要低得多.
這種模式一般只用在一些如重要的醫療影像等對影像有無失真需求的場合之中,而各個像素的數值從二位元到十六位元都可以.
另外這種的處理模式對循序編碼也提供支援,使用者可選擇Huffman編碼或算術編碼的方式作處理.
Lossless Coding
Predictor
Entropy Encoder
Huffman
Table
Source Image
Compressed Data
Lossless encoder
亮度與色度 (1/2)
雖然JPEG並未對色彩空間作規劃,但大部份的JPEG應用程式都不用RGB的表示方式.而以YCbCr來表示;另外,也由於人的視力系統對色度的敏銳度比較不高 .
因此以 YCbCr 色度的方式來表示可以再做一次作取樣(Subsampling) 來減低資訊量,這也是普遍使用YCbCr.另一個重要的理由.如下圖所示的.
4:4:4格式代表 YCbCr 原來完整的資訊.而色度表示法可以再次取樣以4:2:2或4:2:0格式來表達;4:2:2格式將原本的資訊旦減少為三分之二.
而4:2:0格式則可以將資訊三減少為一半.雖然色度的資訊量減少了.但對人的視覺神經而言卻僅僅感受到微小的差別而已.
亮度與色度 (2/2)
離散餘弦轉換
為了說明執行離散餘弦轉換 (DCT: Discrete Cosine Transform)的影響,我們將以自一張圖取下的一個小區塊 (8X8像素)的亮度資料,並將之轉換成空間頻率域,而後再自每個像素值中減去128以期每個像素都可以符合在DCT演演算法中的8位元運算范圍.經過轉換後的二維 (2D)系數如下所示,這個2D頻率域的橫軸以fx表示而縱軸以fy來表示;左上角代表DC的系數值 -80,低頻部份包含了區塊的大部份能量.而對人眼較不敏感的高頻部份,則通常含有較低的能量.
0
0
0
-2
-4
0
8
0
-2
-2
0
0
0
6
0
12
0
0
-2
0
-4
6
8
-2
0
-2
4
10
-6
-2
0
8
-2
4
4
-4
-12
0
-4
10
2
0
0
0
12
8
-8
24
0
-2
-2
2
6
-6
4
-80
量化 (1/2)
以下所列為 JPEG所建議的量化(Quantization)矩陣,以期能對每秒 30個 720X576像素畫面的 CCIR-601 標准作影像的處理與顯示.
這個矩陣的目的是在對亮度(Luminance)是作量化處理,至於色度(Chrominance)系數則還有另一個矩陣做處理.
99
103
100
112
98
95
92
72
101
120
121
103
87
78
64
49
92
113
104
81
64
55
35
24
77
103
109
68
56
37
22
18
62
80
87
51
29
22
17
14
56
69
57
40
24
16
13
14
55
60
58
26
19
14
12
12
61
51
40
24
16
10
11
16
量化 (2/2)
在亮度系數的量化方面,每個 2D DCT 系數除以相對的量化矩陣的值,在四捨五入後得到如下的量化後 DCT 系數:
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
1
0
0
0
0
-1
0
0
1
0
0
0
0
1
1
-1
2
0
0
0
0
0
0
0
-5
舉例來說,DC系數 -80除以其所相對應值16後得到量化值 -5.注意量化後區塊高頻部份出現許多零值,代表人類視覺系統對高頻部份並不敏感.由於四捨五入的部份並不能在解碼時重現,因此這個步驟將是個失真的過程.
斜向掃描 (Zigzag Scanning) (1/2)
區塊在量化之後,只有低頻的部份有非零值,為了能進一步地減少儲存空間與通訊容量的大小.
盡可能地將零值放在一起,使得處理時能以幾個零來表示而非個別的處理每個零.
因此運用如下圖的方式做斜向掃描 (zigzag scan),這種斜向掃描的掃描線乃是沿著空間頻率大小增加的方向作掃描的.
使得許多的零可以被串接在一起,達到原來的期望.
斜向掃描(2/2)
對量化後系數作斜向掃描的情形,斜向掃描僅針對AC系數部份作處理.
也就是跳過左上角DC系數的部份,至於DC系數的部分則另行以下圖的方式與其所相鄰的區塊作掃描.
字流長度與霍夫曼編碼法
掃描完成後,接下來的工作便運用字流長度 (Run length)與霍夫曼(Huffman)編碼法混用的方式,以期使得位元的數量能夠達到最佳化的目的.首先自斜向掃描處理取得序列的AC系數,如上例得到以下數列:0,2,1,-1,0,0,1,0,1,1,0,0,1,0,0,0,-1,0,0,-1,..,0,而後字流長度或稱為變動長度(Variable length)編碼對這個序列作編碼以更進一步地降低所需的位元數,編碼的數值所得到的是由零值的數目按著非零值的數所構成,而得到如下的編碼序列格式:
(字流中零值的數目,下個非零值的數)
因此,如上面的例子就可以編碼成:(1,2) ,(0,1) , (0,-1) , (2,1) , (1,1) , (0,1),(0,1),(2,1),(3,-1),End of Block (EOB) 來表示;而後再以霍夫曼編碼減少為了要代表字流長度編碼的位元數.
霍夫曼編碼是依統計所推論出來讓最常用的碼以最少的位元數來表示,JPEG為亮度與色度的DC及AC的霍夫曼編碼提供了一個表格以為處理之需;另外在作階層模式或無失真模式編碼時,也可藉以算術編碼表的運用來取代霍夫曼編碼表.

熱點內容
jmeter腳本調試 發布:2024-05-02 15:21:45 瀏覽:326
安卓微信數據怎麼傳到新手機 發布:2024-05-02 15:17:19 瀏覽:631
伺服器搭建備案 發布:2024-05-02 15:17:10 瀏覽:719
王者榮耀伺服器為什麼崩潰 發布:2024-05-02 15:03:23 瀏覽:965
android立方體 發布:2024-05-02 15:00:06 瀏覽:61
手機存儲的音樂刪除了怎麼辦 發布:2024-05-02 14:55:00 瀏覽:379
方舟如何運行伺服器 發布:2024-05-02 14:47:45 瀏覽:772
如何創作抖音模板腳本 發布:2024-05-02 14:42:36 瀏覽:856
ftp被動模式下載 發布:2024-05-02 14:33:25 瀏覽:314
教堂電影院ftp 發布:2024-05-02 14:32:35 瀏覽:482