当前位置:首页 » 操作系统 » 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的霍夫曼编码提供了一个表格以为处理之需;另外在作阶层模式或无失真模式编码时,也可借以算术编码表的运用来取代霍夫曼编码表.

热点内容
全名k歌安卓手机里面怎么录屏 发布:2024-05-17 14:40:07 浏览:180
常用数据库介绍 发布:2024-05-17 14:31:38 浏览:504
中孚存储介质信息消除工具 发布:2024-05-17 14:31:33 浏览:588
服务器访问ip如何调转主页 发布:2024-05-17 14:30:33 浏览:788
好玩的解压化妆小游戏 发布:2024-05-17 14:10:57 浏览:127
交通银行怎么登陆不了密码 发布:2024-05-17 13:54:48 浏览:543
安卓如何自动连接无线 发布:2024-05-17 13:53:51 浏览:262
python的urlparse 发布:2024-05-17 13:44:20 浏览:769
linux命令全称 发布:2024-05-17 12:07:54 浏览:110
ftpnas区别 发布:2024-05-17 12:06:18 浏览:949