收藏 分销(赏)

液位监测系统数据采集模块论文.doc

上传人:仙人****88 文档编号:9149938 上传时间:2025-03-15 格式:DOC 页数:38 大小:356KB 下载积分:10 金币
下载 相关 举报
液位监测系统数据采集模块论文.doc_第1页
第1页 / 共38页
液位监测系统数据采集模块论文.doc_第2页
第2页 / 共38页


点击查看更多>>
资源描述
毕业设计(论文) 第34页 毕业设计(论文) 设计(论文)题目:液位监测系统数据采集的设计与实现 学生姓名 专业班级 指导老师 系主任(院长)   5 月 24日 液位监测系统数据采集模块 摘 要 液位监测是针对液体并且遵循特定的步骤对水液体的液位高度进行信息采集,数据计算,结果分析,结果反馈的监测系统。数据采集是液位监测技术中非常重要的一部分,是液位监测系统所要实现的第一步。传统的数据采集方式一般是靠浮力计,变阻计等接触式测量设备来获取液位的信息。本文所讨论的数据采集技术与传统的方式有所不同,它依靠摄像头来捕获液位的图像信息,以linux操作系统及其开源技术为背景,通过对摄像头的图像捕获技术的探索分析来设计符合数据采集模块要求的具体实现。同时通过研究目前流行的图片压缩技术和多对一监测模型,整理出一套集数据压缩,传输,解压,识别,校正,显示为一体的实现方案。设计中使用JPEG格式来存储图像,通过具体实现展示出数据捕获技术和数据压缩技术在液位监测系统中所起到的重要作用。 关键词:数据采集,图像压缩,图像显示 The data collection module of water line surveillance system Abstract The water line surveillance system is a minitor system that ,objected to water and followed certain procedure, to do the operation such as capturing and calculating the information ,analies and return the result.The date collectin module is a very important to the water line surveillance system,and is the first procedure the minitor must do.The traditional approching method is relied on the touched-equipment such as float-instrument or resistance-instrument to capture the water line information.The main content of this design is discuss and implement the water line surveillance system. The main technical based on is Linux OS and its open source technology, through the video technology learn to design a specify the request from the data collection module. In the mean time through to study the present fashion image compression technology I turn out to summarize a schema that take compression and transmit and recognize and check right and show together. In the design I use the JPEG format to save image, and through that implement to show the great effect on water line surveillance by the data catch and data compression technology. Key word: data collection,image compression,image visual 目 录 液位监测系统数据采集模块 I 第1章 绪论 1 1.1 液位监测系统数据采集技术的发展 1 1.2 图像数据采集技术在嵌入式中的应用 2 第2章 数据采集的理论基础 4 2.1 图像编码 4 2.1.1 哈夫曼编码的原理 5 2.1.2 哈夫曼编码在图像压缩中的实现 6 2.2 算术编码 10 第3章 数据采集的设计实现 12 3.1 JPEG图像压缩过程分析 12 3.1.1 前向DCT变换 12 3.1.2 量化 13 3.1.3 哈夫曼编码 14 3.2 试验图像数据的获取 16 3.2.1 BMP图像的格式 17 3.2.2 BMP图像的翻转和精简图像文件的存储 20 3.3 JPEG图像压缩的实现 20 第4章 数据采集程序的安装与运行 23 4.1 内核的启动 23 4.2 程序的编译 23 4.3 程序的运行 23 小结 24 致谢 24 参考文献 25 附录A video 4 Linux 接口 26 1.ov511芯片的摄像头和的zc301芯片的摄像头: 26 2.ov511驱动加载 26 附录B zc301 驱动 27 1 zc301 驱动 27 2 Video4linux 27 第1章 绪论 1.1 液位监测系统数据采集技术的发展 传统的液位监测系统数据采集技术有浮力计式,变阻计式和杠杆式的。浮力式主要利用水体的浮力特性,水位的高低不同,浮力计在水面的上浮落差也就不同,通过这种落差的测量来得到水位的数据。变阻计式类似于浮力计式的,但是它不需要去测量浮动落差,它根据电力学的原理,将浮动的落差信息转化为电阻的信息,然后通过测量电流的大小来得到水位的高低[6]。杠杆式利用了水压的性质,一般来说,水位越高,在水底的水压压强越大,通过杠杆的性质在去测量水底的压强可是得到水位的高低。 近几十年,液位监测系统数据采集技术发展迅猛,采集技术已经由传统的接触式的浮力计式,电阻计式,杠杆计式发展到目前的超声波水位监测,控制电路水位监测,汽包水位监测,光纤传感器水位监测等方式。超声波水位监测系统主要利用了超声波的反射和波速的性质,由水面系统发出一段超声波,超声波穿透水体达到水底然后被反射回来,反射回来的超声波被液位监测系统接收到,液位监测系统在发送超声波时开始计算时间,当它接收到返回来的越起波后就停止计时,这样可以得到超声波到达水底然后反射回来的总时间,又因为超声波的波速是已知的,于是超声波所经过的路程可以计算出来,这样就得到了水位的高度[3]。 传统的液位监测数据采集技术具有设计简单,成本低的优点,它们的缺点是计算数据不精确,容易损坏,突发情况反馈不及时,安全性没有保障。 现代液位监测系统数据采集技术采用的是非接触式手段,利用高科技技术,如大规模集成电路,光纤电缆,超声波测距等,更加准确的测量出水位并非常及时的反馈给人们,甚至可以自动的对水位检测结果采取相应的措施,但是它们的缺点是所需的成本很高,对设备的质量和性能要求非常严格,操作起来需要专业的操作人员,发生问题不易修复。 为了消除传统的液位监测系统数据采集技术的缺点,吸收现代液位监测系统数据采集技术的优点,同时又能降低系统建设的成本,增加系统的可用性,独立性和稳定性,本设计创造性的使用图像捕获技术来实现液位数据的采集。图像数据采集技术采用了目前先进的图像获取和处理技术,使用廉价稳定的摄像头作为数据的采集设备,运用高效的图像压缩算法来处理图像,使用嵌入式设备作为软件载体,以达到数据采集的高效,精确,稳定,安全的目的。 液位监测系统图像数据采集技术的原理是,使用摄像头拍摄水位图片,采取恰当的曝光手段获得清晰的易处理的RGB颜色模式的BMP格式图片,然后对获得的BMP格式图片采用高效的压缩算法进行压缩处理,得到目前流行的JPEG格式的图像文件,最后把JPEG文件通过网络传输到PC监视机上进行解压运算,分析,比对以得到液位高度。 数据采集模块所需要的设备有zc301芯片的摄像头,装有arm9处理器的嵌入式板,小键盘,USB接口及USB连接线,PC机。选择zc301摄像头是因为zc301的摄像头性能优越,价格低廉,与linux操作系统兼容的比较好。使用arm9处理器是因为arm9处理器占据空间小,所需资源少,性能稳定,特别适合运行linux操作系统及其应用程序。 本设计实现了数据采集模块的主要功能,数据采集模块的主要功能是图片获取,图像压缩,图片传输,图片解压和图片显示。运行数据采集模块程序,它首先是打开zc301摄像头,进行必要的初始化参数,然后朝向液体表面进行拍摄,拍摄得到的是RGB颜色模式的BMP格式的图片,这是最原始的图片,它所占的空间比较大,它可以直接在屏上显示,但是不利于网络传输,因为它占太多的带宽。获得了BMP格式的图像之后数据采集程序会自动将它压缩成目前流行的JPEG格式的图片,压缩比为50:1,压缩生成的JPEG图片将被传输到PC监视机上进行分析研究。后面的第 2章着重讲述了图片的压缩算法。 1.2 图像数据采集技术在嵌入式中的应用 本设计采用linux嵌入式环境。Linux操作系统是Unix的克隆,是一个支持多用户, 多进程,多线程,实时性较好的功能强大而稳定的操作系统,它可以运行x86 PC,Sun Sparc,Digital Alpha,680x0,PowerPC, MIPS等平台上,在本设计中,它运行在arm9平台上。 嵌入式系统被定义为:以应用为中心、以计算机技术为基础、软件硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。   嵌入式系统是面向用户、面向产品、面向应用的,如果独立于应用自行发展,则会失去市场。嵌入式处理器的功耗、体积、成本、可靠性、速度、处理能力、电磁兼容性等方面均受到应用要求的制约,这些也是各个半导体厂商之间竞争的热点。嵌入式处理器的应用软件是实现嵌入式系统功能的关键。软件要求固化存储,软件代码要求高质量、高可靠性,系统软件(OS)的高实时性是基本要求。 本设计采用linux嵌入式环境是因为linux操作系统稳定可靠,arm9平台功能强大而设备精简,所占体积小,效率非常高。Linux内核版本为2.0.35,内自带了USB驱动,摄像头采用zc301摄像头,驱动需要自己载入。 本设计的系统流程是这样的,首先将u-boot引导程序烧入嵌入式开发板中,然后运行u-boot,把linux核引导进开发板中,整个过程通过PC机的超级终端minicom控制,PC机与开发板用一条并口线相连,linux 先引导完成,然后就启动linux,当操作系统把控制权交组用户后,用insmod命令动态加载设像头驱动程序,然后编写代码打开摄像头,拍摄图片数据,运行远程服务,对PC机的客户数据请求,服务端把图片数据输给PC机上的客户端,然后在PC机上对图片数据解码保存,需要时在LCD上显示出来。当需要观看动态效果,就要连续的播放图片到LCD显示器上。后面第3章着重讲述了数据采集的实现原理。附录中介绍了video for Linux(video 4 Linux)的接口,以及它的使用。 第2章 数据采集的理论基础 2.1 图像编码 本设计中的实现过程包括三部分: 第一部分为摄像头控制部分,主要工作是编写程序实现摄像头驱动的加载,摄像的打开,设置参数,初始化,读取摄像头芯片信息,然后是摄像头的拍摄,获取位图数据。 第二部分为图像压缩部分,主要工作是对摄像头获取的位图数据进行压缩,形成jpeg文件。 第三部分为图像的传输部分,主要工作是编写服务程序,给一台或多台用于监测图像的PC机提供图像数据传输服务。 系统的框架图如下: 摄像头 嵌入式板 PC机 BMP数据 JPEG数据 数据采集程序 数据传输服务 JPEG编码程序 JPEG解码程序 图2-1系统框架图 在本设计中,图像是以位图的方式被摄像头记录的。位图亦称为点阵图像或绘制图像,是由称作像素(图片元素)的单个点组成的。这些点可以进行不同的排列和染色以构成图样。当放大位图时,可以看见赖以构成整个图像的无数单个方块。 RGB是位图颜色的一种编码方法,用红、绿、蓝三原色的光学强度来表示一种颜色。这是最常见的位图编码方法,可以直接用于屏幕显示[4]。 但是由于摄像头刚拍摄出来的位图所占的储空间很大,不利用图片永久存储和网络传输,因为那样会占用太多的硬盘空间和网络带宽,于是我们必须对位图进行压缩,然后才存储和转输,等到要看图片的时候,再把压缩后的图片解压缩成位图。 目前对位图的压缩方式有很多,但是最流行且压缩效率最高的还是JPEG编码。而JPEG编码原理里面用到到了最重要的两种编码原理,一种是哈夫曼编码,另一种就是算术编码。 2.1.1 哈夫曼编码的原理 哈夫曼编码是压缩编码中常用的一种编码方,JPEG标准中基准模式采用的就是哈夫曼编码。 哈夫曼编码基于不同符号的概率分布,对出现次数较多的符号赋予较短的代码,出现次数较少的符号赋予较长的代码。这里,以一个例子说明如何赋予各个符号哈夫曼码值,即如何生成哈夫曼表。 假设将对由1,2,3,4,5,6,7,共7个数字组成的原信息进行哈夫曼编码,首先应对信息中各个数字出现的次数进行统计,得出各个数字的出现的相对概率。假设各个数据出现的次数如表2-1所示。 表2-1 7个数字的概率分布 数字 1 2 3 4 5 6 7 出现的次数 10 10 10 20 20 25 5 相对概率 0.1 0.1 0.1 0.2 0.2 0.25 0.05 根据表2-1生成哈夫曼树如图2-1所示。 具体的过程是这样的。先将所有的数字随意排列成一行构成7个最底层节点,首先将这一行中最小的两个概率值相加,0.1+0.05=0.15得到新的节点。这时拥有的概率值为0.2,0.2,0.2,0.1,0.1,0.15,0.25,再将这时最小的两个概率值相加,0.1+0.1=0.2得到新的节点。这时拥有的概率值为0.2,0.2,0.2,0.2,0.15,0.25,再将这时最小的两个概率值相加……,直到得到根节点,概率值为1.0为止。相加时,对于概率值相等的多个节点,可以任意选取。 除根节点外,设节点左面的分支为0,右边的分支为1(当然,也可以反 过来),对于各个数值的代码就是从根节点出发到最底层的节点所经过的分支的序列。如4的代码为00,7的码值为1011,通常将4和7称为码值(Code value),00和1011被称为相应的码字(Code word),所有码字和码值的对应关系如表2-2所示。进行压缩编码时,只要将原数字(码值)用码字代替即可。 如果概率统计十分不准确,则压缩效率会很低,甚至起不到压缩效果。 图2-3 由表2-1生成的哈夫曼树 将所有的码字和码值生成一个表,表达码字和码值的对应关系,称为哈夫曼表,为了整字节的输出码字,表中还要有各个码字的长度,例如JPEG标准中推荐的亮度信息直流系数的哈夫曼表如表2-3所示。 表2-2由图2-1得到的码字和码值的对应关系 码值 1 2 3 4 5 6 7 码字 1000 1001 1010 00 01 11 1011 哈夫曼表一般是事先确定的,(也可以在线实时调整)。本文以JPEG中的一个哈夫曼表(表2-3)为例,来说明如何实现哈夫曼编码,解码。 2.1.2 哈夫曼编码在图像压缩中的实现 在JPEG文件格式中,哈夫曼表以哈夫曼码字中位数相同的个数和所有的哈夫曼码值的形式存储,实际上是存储了一个哈夫曼树[5]。根据JPEG文件开始部分对于亮度信息所用的哈夫曼表(对应表2-3)说明字段的可以得到下面两 个数组: bits[17] = { 0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 }; huffval[] ={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; 表2-3 JPEG标注中推荐的亮度信息哈夫曼表 码值 码字的长度 码字 0 1 2 3 4 5 6 7 8 9 10 11 2 3 3 3 3 3 4 5 6 7 8 9 00 010 011 100 101 110 1110 11110 111110 1111110 11111110 111111110 这两个数组和上面那个表是对应的。bits[]数组中的元素除bits[0]外,bits[1],bits[2],bits[3],…bits[16]代表哈夫曼代码中长度为1,2,3…16的个数。huffval[]中的各个元素是按照哈夫曼代码长度递增的顺序相对应的哈夫曼值(Huffman value),也即被代表的信息,如果几个元素对应的哈夫曼代码长度相同,顺序可以交换。从这两个数组出发,看看是如何实现编码的。 首先,应该生成哈夫曼表。建立huffcode[],huffcode[],ehufco[],ehufsi[]四个整数型数组,此处它们的元素个数只要大于12即可。 第一步:得到huffsize[]。 int p,l,i,lastp; p = 0; for (l = 1; l <= 16; l++) { i = bits[l]; while (i--) huffsize[p++] = l; } huffsize[p] = 0; /*使huffsize[]最后一个元素为零,是为了后面生成huffcode[]时,能够跳出循环*/ lastp=p; /* lastp-1即是所有码值的个数,后面的程序要用到它*/ 这样, huffsize[]对12个哈夫曼码字的有效位的位数(单位是Bit)都有了记录,这主要使为了编码后输出码字时一定要知道码字的长度。 第二步得到huffcode[],它的各个元素是与huffsize[]各元素相对应的哈夫曼码字。 { int code,si; code = 0; si = huffsize[0]; p = 0; while (huffsize[p]) { while ( huffsize[p] == si) { huffcode[p++] = code; code++; } code <<= 1; si++; } } 从程序中可以看出,相邻的相同长度的哈夫曼码字彼此间差1。长度为si+1的代码中数值最小的代码,是长度为si的代码中数值最大的代码加1后并左移一位,这就能保证没有任何一个代码是另外一个代码的前缀,也就是说11,110这样的两个代码是不允许的。否则,解码时就会出现问题。 第三步得到ehufco[],ehufsi[]。 for (p = 0; p < lastp; p++) { i = huffval[p]; ehufco[i] = huffcode[p]; ehufsi[i] = huffsize[p]; } 很简单,这里只是将huffcode[],huffsize[]中的元素调整了顺序,赋予了ehufco[],ehufsi[],以val[]的元素为索引值。显然,这样调整后,哈夫曼编码的过程就是一个查表过程。下面看看哈夫曼编码及输出编码信息的过程,事先定义一结构体: struct save { int put_bits;/*记录目前缓存中的数据的位数*/ int put_buffer;/*输出缓存*/ } 两个成员应初始化为0,save在对整个信息源(比如一幅图像)进行哈夫曼编码的过程中有效。 哈夫曼码字往往不正好是整数个字节,而在存储时计算机中文件的存储是以字节为单位的,这里将以C语言程序为例说明如何将哈夫曼编码后的数据逐字节的输出。假设要对v(-1<v<12,且v是整数)进行编码,程序如下: { int code,size; code=huffcode[v];/*以v为缩影找到哈夫曼码字和码字的有效位数*/ size=huffsize[v]; register int put_buffer = code; register int put_bits = saved.put_bits; put_bits += size;/* 更新缓存中的数据的位数 */ put_buffer <<=24 - put_bits;/*将码字移到紧靠原有数据的位置*/ put_buffer |= saved.put_buffer;/*将码字和缓存中的旧有数据放在一起*/ while (put_bits >= 8) { int c = (int) ((put_buffer >> 16) & 0xFF); emit_byte(c);/*输出一个字节的数据 */ if (c == 0xFF) { emit_byte( 0); /*遵循JPEG规范,在编码数据0XFF后,加上0X00*/ } put_buffer <<= 8; put_bits -= 8; } saved.put_buffer = put_buffer; /*将未输出的数据保留*/ saved.put_bits = put_bits;/*记录未输出数据的位数*/ } 这里为哈夫曼码字的输出开辟了24bits的缓存(put_buffer的低24位),数据总是在缓存的最左端。每当缓存中的数据大于一个字节时,就调用emit_byte( )函数输出一个字节到输出缓存中。每次往24bits的缓存中送数据时,缓存中至少有24-7=17Bits的空间,故每次数据的长度不应超过17Bits。 以上面的程序为基础构成循环,就可以对大量数据编码。对所有数据进行编码后,强制code=0x7F, size=7,以使剩余在缓存中的数据输出。 最后,再讨论一下哈夫曼解码的问题。解码就是编码过程的逆过程,是不难理解的。解码前同样需要一些准备工作,bits[] ,huffval[],huffcode[]定义与前面一致。 建立两个整数型数组valoffset[] ,maxcode[],此处它们的元素个数只要大于17即可。valoffset[a] (-1<a<12)表示的是哈夫曼码字长度为a的当中数值最小的码字在huffval[]中的位置与代码值的差,这主要是为了快速找到代码代表的具体信息。maxcode[a] 表示的是哈夫曼码字长度为a的当中数值最大的码字。确定valoffset[] ,maxcode[]各个元素的程序如下: int p = 0,l; for (l = 1; l <= 16; l++) { if (bits[l]) { /*用长度为l的码字中,数值最小的码字在huffcode[]中的 索引减去码字的数值,这主要是为了查找的方便*/ valoffset[l] = p - huffcode[p]; p += bits[l]; maxcode[l] = huffcode[p-1];/*记录长度为l的码字中,数值最大的码字*/ } else { maxcode[l] = -1;/* -1表示没有长度为l的码字 */ } } maxcode[17] = 0xFFFFFL; /* 保证当数据有错时,程序能够正常退出*/ } 现在就可以进行解码了。 { int code_lenth,code,val; code_lenth=1; /*码字的长度肯定大于1*/ code=next_bit();/*先从压缩数据中取出一位数据*/ do { code =(code<<1) + next_bit(); code_lenth++; }while (code >maxcode[code_lenth]);/*判断出码字的长度*/ val=huffval[code+valoffset[code_lenth]];/*找到码字对应的码值*/ } 这里,next_bit()是一个函数,它负责从被压缩的数据中逐位(Bit)输入数据。先比较出code的确切长度,然后利用valoffset[code_lenth]迅速找到原始的信息。这样,对哈夫曼编码的编码、解码过程就分析完了。 2.2 算术编码 算术编码是一种编码效率大于哈夫曼编码方法的熵编码方法,在JPEG标准中,算术编码是作为一种扩展,在常见的JPEG图像中并不采用算术编码,但算术编码正得到越来越广泛的应用,在JPEG2000标准中,只采用了算术编码[1]。 算术编码(Arithmetic Coding)将数据变成一串码字,这串码字代表0至1之间的一个数。由于算术编码是用0~1间的数相加,而不是整数个码字的连接,对有些数据的编码并不增加整个压缩数据的长度。因为本设计采用的是哈夫曼编码,故算术编码这里不详细论述。 第3章 数据采集的设计实现 3.1 JPEG图像压缩过程分析 程序包中有四个重要源文件,start.c为主程序入口,capture.h定义了程序中要用到的各种类,capture.c 是拍摄图片和图片压缩的核心代码。下面将代码涉及的实现进行详细说明。 JPEG标准中规定了4种压缩模式:顺序编码(Sequential encoding),渐进编码(Progressive encoding),等级编码(Hierarchical encoding),无损编码(Lossless encoding)[7]。应用最为广泛的为基于DCT变换的顺序编码,也称之为基准模式(Baseline mode),其它几种模式都以此为基础。这里,采用了JPEG基准模式对图像进行压缩,在基准模式中,熵编码采用哈夫曼编码方法,图3-1是编码过程的图解。 图3-1 JPEG压缩过程 3.1.1 前向DCT变换 JPEG 里, 要对数据压缩, 先要做一次前向DCT(Forward cosine transform FDCT)变换,一次只对一个块(Block)进行变换。将原始图像数据视为空间的函数,),(yxfx为像素所处的行,为像素所处的列,u和对应频域空间的行和列,前向DCT变换的公式如式(3-1),DCT反变换的公式如式(3-2)。 3.1.2 量化 对于前面得到的64个空间频率振幅值按比例缩小,并取其最接近的整数值的处理过程称为量化。JPEG标准中推荐的量化表如表3-1。一共有64个元素,按照从上到下,从左到右的顺序与FDCT变换后的幅值对应,每一元素记为Q,u和对应行和列,量化公式为式(3-3),解码时反量化公式为式(3-4)。 JPEG标准中推荐的量化表如表3-1。依据心理视觉阀制作,对 8bit 的亮度和色度的图像的处理效果不错,当然可以使用任意的量化表。 表3-1 JPEG标准推荐的量化表 16, 11, 10, 16, 24, 40, 51, 61, 12, 12, 14, 19, 26, 58, 60, 55, 14, 13, 16, 24, 40, 57, 69, 56, 14, 17, 22, 29, 51, 87, 80, 62, 18, 22, 37, 56, 68, 109, 103, 77, 24, 35, 55, 64, 81, 104, 113, 92, 49, 64, 78, 87, 103, 121, 120, 101, 72, 92, 95, 98, 112, 100, 103, 99 由于量化的缘故,产生了信息损失。量化表中对应于和较小的元素数值较小,意味着对低频幅值的量化信息损失较小,相对的,u和较大时,数值也就较大了,意味着对高频幅值的量化信息损失较大。但事实上人眼对高空间频率远没有低频敏感,所以处理后的视觉损失很小。 3.1.3 哈夫曼编码 哈夫曼编码要分成3步来完成,1)按之字型的顺序(Zig-zag sequence)调整量化后的系数[24];2)将按之字型顺序排列的系数转化为中间符号(Intermediate symbol)序列[25];3)将中间符号中的一部分进行变长码字编码(Variable-lengths code coding)也就是哈夫曼编码,另一部分进行变长整数编码(Variable-lengths integer code),最终输出数据流。 先看第一步,由前面的叙述可以看出,经过FDCT和量化两个环节后,较高空间频率(对应较大的和)的系数很小,大部分为零,因此,按之字型的顺序调整系数的用意就是使为零的高空间频率系数能够连在一起,以利于游程编码(Run-length coding)。根据这一点,应使u和较小的系数排列在前面,之字形顺序如图3-2,图中ACij表示坐标为(i,j)的交流系数。 图 3-2之字型顺序 再看第二步。在这一步里,DC系数和AC系数是分开来处理的。由于DC系数是一块(Block)图像中像素值的平均值,相邻块之间的DC系数又很大的相关性,或者说往往相差不大,所以对相邻块的DC系数差值(DC Difference)进行编码,如图3-3所示。 紧接着将DIFF转变成中间符号: symbol-1 symbol-2 (SIZE) (AMPLITUDE) 图3-3 DC系数的编码 symbol-1是DIFF的有效位数(以二进制来计算),记为SIZE。如果DIFF为3,则symbol-1应为2。由于计算机中将负数存为反码或补码的形式,当DIFF为负数时,DIFF的有效位数为(-DIFF)的有效位数。前面提到,经过FDCT和量化两个环节后,对于8位的灰度图,此时的数值范围为[-210, 210-1],故DIFF的范围为[-211+1, 211-1],故对DIFF来说,SIZE取值范围为0~11。 symbol-2是DIFF的幅值,记为AMPLITUDE,如果DIFF=3,则symbol-2为3。 下面看一看哈夫曼编码的最后一步,对上一步产生的中间符号序列中symbol-1进行变长码字编码(Variable-lengths code coding VLC)也就是哈夫曼编码,对symbol-2进行变长整数编码(Variable-lengths integer code VLI),最终输出数据流。DC系数和AC系数的哈夫曼编码是分开的,在8位的灰度图像中,对于DC系数,symbol-1可以有12种取值,对于AC系数,symbol-1可以有162种取值,故它们采用的哈夫曼表不同。对于出现次数较多的symbol-1赋予较短的码字,出现次数较少的symbol-1赋予较长的码字,说它是变长码字编码是恰如其分的。对symbol-2进行变长整数编码实际就是省去非零数值的高位为零的那几位,表达一个非零的数,用它的有效位数个位就足够了,它的位数记录在symbol-1中的SIZE中。例如3,写成二进制数11就行了,没必要写成00000011。这里注意一点,在JPEG中,进行VLI编码时,数值为正,用原码表示,数值为负,用反码表示,例如-3,VLI编码后,变为00。 下面看一个对数据哈夫曼编码的实例。假设某原始图像的一块数据经FDCT和量化环节后,数据变为: 15 0 -1 0 0 0 0 0 -2 -1 0 0 0 0 0 0 -1 -1 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 上面的数据是按照从上到下,从左到右的顺序排列的。首先,按之字型的顺序(Zig-zag sequence)调整后的系数序列为: 15 0 -2 -1 -1 -1 0 0 -1 0 ···· 0 假设前一Block的DC系数为12,将系数转为中间符号的序列为: (2)(3), (1,2)(-2), (0,1)(-1), (0,1)(-1), (0,1)(-1), (2,1)(-1), (0,0) 对于DC系数的symbol-1(2),查哈夫曼表为011,对于AC系数的各symbol-1查哈夫曼表为: (0,0) 1010 (0,1) 00 (1,2) 11011 (2,1) 11100 对DC和AC系数的ymbol-2进行VLI编码为: (3) 11 (-2) 01 (为-2的反码) (-1) 0 则最终,整个输出的压缩数据为:0111111011010000000001110001010 3.2 试验图像数据的获取 进行压缩前,必须要有源图像,这里,选择了BMP图像作来获取图像数据,之所以选择BMP图像,一是它比较常见,图像格式较为简单;二是一般情况下不对存储的图像数据进行压缩(尽管BMP图像支持一定的图像压缩,但不常见)。整个步骤如下: 1)一幅BMP图像转成灰度图像。由于需要的是灰度图,因此,首先依据色彩空间转换公式把彩色图像转成灰度图像。 2)将图像进行翻转。前面提到,BMP图像存储图像数据时从下到上,从左到右,JPEG中是从上到下,从左到右的,故要对图像数据进行翻转,否则压缩后的图像在显示时是倒立的。 3)将图像存成一个简化的文件。由于只注重压缩方法的研究,因此为了编程的方便,再把把图像数据存储成结构较为简单的文件,文件中仅保留图像的宽度和高度及具体的图像数据。 4)以简化的图像文件作为输入,对图像进行压缩。压缩后的图像存成标准的JPEG文件格式。 5)选择不同的量化表对压缩效果进行比较,评价。 从BMP图像获取图像数据,了解BMP图像的格式是其关键。下面先对BMP图像的格式进行分析。 3.2.1 BMP图像的格式 BMP图像采用RGB(Red Green Blue)色彩模型,将各种颜色视为为红,绿,蓝(R,G,B)三个部分的组合。由于一幅图像中许多像素对应的颜色是相同的,BMP图像中采用了一个表:表中的每一行记录一种颜色的R,G,B值。这样,当表示一个象素的颜色时,只需要指出该颜色是在第几行,即该颜色在表中的索引值,这个表在BMP图像中称为调色板。有一种图,它的颜色数高达256×256×256种,也就是说包含上述提到的R,G,B颜色表示方法中所有的颜色,这种图叫做真彩色图(True Color)。真彩色图并不是说一幅图包含了所有的颜色,而是说它具有显示所有颜色的能力,即最多可以包含所有的颜色。表示真彩色图
展开阅读全文
开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 学术论文 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服