图像编解码技术及应用.docx
《图像编解码技术及应用.docx》由会员分享,可在线阅读,更多相关《图像编解码技术及应用.docx(11页珍藏版)》请在冰豆网上搜索。
图像编解码技术及应用
图像编解码技术及应用
1.图像编解码技术概论:
在当前的图像压缩领域中常用的技术有:
BMP、EPS、GIF、JPG、PDF、PIC、PNG、PSD、TIF。
上述技术间的差异主要存在于图像编解码的算法不同,通过对算法的研究可以使我们更加容易的理解图像压缩的原理。
位图格式(BMP)是在DOS时代就出现的一种元老级文件格式,因此它是DOS和WINDOWS操作系统上的标准的WINGDOWS点阵图像格式,以此文件格式存储时,采用一种非破坏性的RLE压缩,不会省略任何图像的细部信息。
EPS是最常见的线条稿共享文件格式,它是以PostScript语言为开发基础,所以EPS文件能够同时兼容矢量和点阵图形,所有的排版或图像处理软件如PageMaker或Illustrator等,都提供了读入或置入EPS格式文件的能力,而且RGB和CMYK对象也可以保有各自的原始的色彩模式。
GIF应该是在网络上最常见的一种压缩文件格式,它的英文全名GraphicInterchangeformat,当初研发的目的是为了最小化电缆上的传输,因此能采用LZW方式进行压缩,但可显示的颜色范围只局限于256索引色,目前所采用的GIF图形共有两种格式:
87a和89a,常见于网页上建议的小动画制作,其中GIF89a还可提供透明色效果,点阵图形,灰度图形或者索引颜色模式皆可存储为此种文件格式
JPG跟GIF一样为网络上最常见道的图像格式,其英文正式名称为JointPhotographicExpertsGroup,它是以全彩模式进行显示色彩,是目前最有效率的一种压缩格式,常用于照片或连续色调的显示,而且没有GIF去掉图像细部信息的缺点,但需要注意的是此类图像需要自行设置压缩程度,在打开时JPG图像会自动解压缩,不过要注意的是JPG采用的压缩是破坏性的压缩,因此会在一定程度上减损图像本身的品质。
PDF是Adobe公司近几年权力推行的一种文件格式,它已PostLevel2语言为其开发基础,同时可显示矢量及点阵的数码图形,同时还具有文件搜寻及网上预览的功能,即所谓电子化文件的观念,我们只要利用PageMaker或Illustrator设计完成一个出版文件,并以PDF格式输出便可发送出去,不会有分色、装订和印刷的烦恼,而且可适用相当多的平台,如Macintosh、Windows、UNIX以及DOS。
PDF文件的浏览器为AcrobatReader。
PIC是苹果(Macintosh)操作系统的标准文件格式,以QuickDraw显示语言为开发基础,是少数可以同时支持矢量和点阵的图像类型,利用Macintosh色彩上的优势,PIC可以支持任何颜色深度,尺寸及分辨率,甚至可支持到32位的图像。
PNG是由GIF衍生出来的一种新的图像格式,似乎有取代GIF的趋势,同样适用于网页图像显示,同时采用非破坏性的压缩方式来缩减文件大小,在传输时亦可以渐次的方式将接收到的图像显示出来,不必苦等数据传输完毕后才能一窥全貌。
PSD是Photoshop中的标准文件格式,是Adobe公司为Photoshop量身定做的定制格式,也是唯一支持Photoshop所有功能的文件类型,包括图层、通道、路径等,在存储时会进行非破坏性压缩以减少存储空间,打开时速度也较其他格式快些,在作品未定稿前强烈建议以此种文件格式存储,以便日后修改。
TIF是由Aldus公司早期所研发的一种文件格式,至今仍然是图像文件的主流格式之一,同时横跨苹果(Macintosh)和个人电脑(PC)两大操作系统平台,可以说是跨平台操作的标准文件格式,而且也广泛支持图像打印的规格,如分色的处理功能,它所使用的是一种LZW的非破坏性压缩。
遗憾的是不支持矢量图形。
2.BMP、GIF、JPEG图像编解码详解:
一、行程长度压缩
原理是将一扫描行中的颜色值相同的相邻像素用一个计数值和那些像素的颜色值来代替。
例如:
aaabccccccddeee,则可用3a1b6c2d3e来代替。
对于拥有大面积,相同颜色区域的图像,用RLE压缩方法非常有效。
由RLE原理派生出许多具体行程压缩方法:
1.PCX行程压缩方法:
该算法实际上是位映射格式到压缩格式的转换算法,该算法对于连续出现1次的字节Ch,若Ch>0xc0则压缩时在该字节前加上0xc1,否则直接输出Ch,对于连续出现N次的字节Ch,则压缩成0xc0+N,Ch这两个字节,因而N最大只能为ff-c0=3fh(十进制为63),当N大于63时,则需分多次压缩。
2.BI_RLE8压缩方法:
在WINDOWS的位图文件中采用了这种压缩方法。
该压缩方法编码也是以两个字节为基本单位。
其中第一个字节规定了用第二个字节指定的颜色重复次数。
如编码0504表示从当前位置开始连续显示5个颜色值为04的像素。
当第二个字节为零时第二个字节有特殊含义:
0表示行末;1表示图末;2转义后面2个字节,这两个字节分别表示下一像素相对于当前位置的水平位移和垂直位移。
这种压缩方法所能压缩的图像像素位数最大为8位(256色)图像。
3.BI_RLE压缩方法:
该方法也用于WINDOWS位图文件中,它与BI_RLE8编码类似,唯一不同是:
BI_RLE4的一个字节包含了两个像素的颜色,因此,它只能压缩的颜色数不超过16的图像。
因而这种压缩应用范围有限。
4.紧缩位压缩方法(Packbits):
该方法是用于Apple公司的Macintosh机上的位图数据压缩方法,TIFF规范中使用了这种方法,这种压缩方法与BI_RLE8压缩方法相似,如1c1c1c2132325648压缩为:
831c2181325648,显而易见,这种压缩方法最好情况是每连续128个字节相同,这128个字节可压缩为一个数值7f。
这种方法还是非常有效的。
二、霍夫曼编码压缩:
也是一种常用的压缩方法。
是1952年为文本文件建立的,其基本原理是频繁使用的数据用较短的代码代替,很少使用的数据用较长的代码代替,每个数据的代码各不相同。
这些代码都是二进制码,且码的长度是可变的。
如:
有一个原始数据序列,ABACCDAA则编码为A(0),B(10),C(110),(D111),压缩后为010*********。
产生霍夫曼编码需要对原始数据扫描两遍,第一遍扫描要精确地统计出原始数据中的每个值出现的频率,第二遍是建立霍夫曼树并进行编码,由于需要建立二叉树并遍历二叉树生成编码,因此数据压缩和还原速度都较慢,但简单有效,因而得到广泛的应用。
三、LZW压缩方法
LZW压缩技术比其它大多数压缩技术都复杂,压缩效率也较高。
其基本原理是把每一个第一次出现的字符串用一个数值来编码,在还原程序中再将这个数值还成原来的字符串,如用数值0x100代替字符串"abccddeee"这样每当出现该字符串时,都用0x100代替,起到了压缩的作用。
至于0x100与字符串的对应关系则是在压缩过程中动态生成的,而且这种对应关系是隐含在压缩数据中,随着解压缩的进行这张编码表会从压缩数据中逐步得到恢复,后面的压缩数据再根据前面数据产生的对应关系产生更多的对应关系。
直到压缩文件结束为止。
LZW是可逆的,所有信息全部保留。
四、算术压缩方法
算术压缩与霍夫曼编码压缩方法类似,只不过它比霍夫曼编码更加有效。
算术压缩适合于由相同的重复序列组成的文件,算术压缩接近压缩的理论极限。
这种方法,是将不同的序列映像到0到1之间的区域内,该区域表示成可变精度(位数)的二进制小数,越不常见的数据要的精度越高(更多的位数),这种方法比较复杂,因而不太常用。
五、JPEG(联合摄影专家组JointPhotographicExprertsGroup)
JPEG标准与其它的标准不同,它定义了不兼容的编码方法,在它最常用的模式中,它是带失真的,一个从JPEG文件恢复出来的图像与原始图像总是不同的,但有损压缩重建后的图像常常比原始图像的效果更好。
JPEG的另一个显著的特点是它的压缩比例相当高,原图像大小与压缩后的图像大小相比,比例可以从1%到80~90%不等。
这种方法效果也好,适合多媒体系统。
介绍完了压缩算法,我们来简要介绍一下三种位图格式的异同和它们之间的相互转换。
2.1BMP:
图象文件就是描绘了一幅图象的计算机磁盘文件。
形成数字图象数据后,将其存储在计算机里的方法有2种,即位映射和向量处理方式。
我们这里主要讨论的是位图。
不同图象软件几乎都用各种的方法处理图象,图象格式也多种多样,它主要包括文件识别头和图象数据。
文件识别头用来让计算机判断是哪种文件格式,图象数据包含了整个对图象描绘相关数据,包括调色板、位图映象等。
根据压缩算法不同,映象方式也不同,下面简要介绍一下压缩算法。
位图文件头:
包含BMP图象文件的类型、显示内容等信息。
typedefstructtagBITMAPFILEHEADER{
WORDbfType;// 位图文件的类型,必须为BM
DWORDbfSize;// 位图文件的大小,以字节为单位
WORDbfReserved1;// 位图文件保留字,必须为0
WORDbfReserved2;// 位图文件保留字,必须为0
DWORDbfOffBits;//位图数据的起始位置,以相对于位图文件头的偏移量表示
}BITMAPFILEHEADER;
0x0000H-0x0001H 2BYTES文件标识 基本上就是'BM'
0x0002H-0x0005H 4BYTES表示整个文件的大小 字节顺序是否固定little_Endianorbig_Endian?
0x0006H-0x0009H 4BYTES保留 必须设置为0
0x000AH-0x000DH 4BYTES位图数据的偏移量 从文件开始计算
位图信息数据结构由BITMAPINFOHEADER和RGBQUAD两个数据结构组成
接下来为位图信息头:
typedefstructtagBITMAPINFOHEADER{
DWORDbiSize;// 本结构所占用字节数
LONGbiWidth;// 位图的宽度,以像素为单位
LONGbiHeight;// 位图的高度,以像素为单位
WORDbiPlanes;// 目标设备的级别,必须为1
WORDbiBitCount// 每个像素所需的位数,必须是1(双色),
// 4(16色),8(256色)或24(真彩色)之一
DWORDbiCompression;//位图压缩类型,必须是0(不压缩),// 1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)之一
DWORDbiSizeImage;// 位图的大小,以字节为单位
LONGbiXPelsPerMeter;// 位图水平分辨率,每米像素数
LONGbiYPelsPerMeter;// 位图垂直分辨率,每米像素数
DWORDbiClrUsed;// 位图实际使用的颜色表中的颜色数
DWORDbiClrImportant;// 位图显示过程中重要的颜色数
}BITMAPINFOHEADER;
其中BITMAPINFOHEADER数据结构包含了有关BMP图象的宽、高、压缩方法等信息。
0x000EH-0x0011H 4BYTES位图信息头的长度大小整个结构的大小,可能会增加字段,所以需要读取该值
0x0012H-0x0015H 4BYTES位图宽度 单位像素
0x0016H-0x0019H 4BYTES位图高度 单位像素
还有另一个用处,就是指明该图像是倒向的位图,还是正向的位图。
如果该值是一个正数,图像是倒向的,如果该值是一个负数,图像是正向的。
当高度值是一个负数时(正向图像)图像将不能被压缩,压缩方式不能是BI_RLE8或BI_RLE4。
0x001AH-0x001BH 2BYTES位图的位面数 总是1
0x001CH-0x001DH 2BYTES每个像素的位数 值为148162432
0x001EH-0x0021H 4BYTES压缩方式
([0]不压缩BI_RGB[1]RLE-8压缩,8位RLE压缩BI_RLE8每个象素8比特的RLE压缩编码,压缩格式由2字节组成[2]RLE-4压缩,4位RLE压缩BI_RLE4每个象素4比特的RLE压缩编码,压缩格式由2字节组成[3]Bitfields位域存放方式BI_BITFILEDS每个象素的比特由指定的掩码决定)
0x0022H-0x0024H 4BYTES位图数据大小 必须是4的整数倍,说明图象的大小,以字节为单位。
当用BI_RGB格式时,可设置为0。
0x0026H-0x0029H 4BYTES水平分辨率对于设备无关图,设置成为0
0x002AH-0x002DH 4BYTES垂直分辨率 对于设备无关图,设置成为0
typedefstructtagRGBQUAD{
BYTErgbBlue;// 蓝色的亮度(值范围为0-255)
BYTErgbGreen;// 绿色的亮度(值范围为0-255)
BYTErgbRed;// 红色的亮度(值范围为0-255)
BYTErgbReserved;// 保留,必须为0
} RGBQUAD;
0x002EH-0x0031H 4BYTES使用的颜色数说明位图实际使用的颜色表中的颜色索引数,设为0的话,则说明使用所有调色板项,如果有调色板,则大小等于2^VALUE(0x001CH-0x001DH)16位及以上位图不使用颜色表。
0x0032H-0x0035H 4BYTES重要的颜色数指定重要的颜色数,一般设置为0,表示所有的颜色一样重要如果设置的不等于0或者颜色数,就只有这么多值
数据结构RGBQUAD定义一种颜色。
位图阵列:
位图阵列记录了图象的每一个象素值。
从图象的左下角开始逐行扫描图象。
从左到右,从上到下,将图象的象素值逐一记录下来,这些记录象素值的字节组成了位图阵列。
位图阵列数据的存储格式有压缩和非压缩两种格式。
1.非压缩格式位图中的每一个点的象素值对应与位图阵列的若干位,而位图阵列的若干位由图象的高度、宽度及图象的颜色数决定。
2.压缩格式在bmp格式文件中,Windows支持BI-RLE8和BI-RLE4两种压缩类型的存储格式。
图象数据:
BMP图象数据的存储顺序是由下而上(图象上下颠倒存储),而图象的宽度(以字节为单位)必须是4的倍数。
如果不足4的倍数必须补足。
虽然BMP图象数据有BI_RLE8和BI_RLE4两种压缩格式,但是使用很少。
BI_RLE8和BI_RLE4(RunLength压缩):
二者的差别在于前者以8位为一个处理单位,后者以4位为一个处理单位。
解压缩时,每次读取2字节数据(BYTE1 , BYTE2)
BYTE1!
=0x0BYTE1为数据重复值,将BYTE2重复BYTE1次
BYTE1=0x00,BYTE2=0x00表示此扫描线结束(endofline)BYTE1=0x00,BYTE2=0x01表示文档结束(end of file)BYTE1=0x00,BYTE2=0x02坐标位移指示,表示后面两个字节分别是指下一个像素位置与目前像素位置的水平和垂直位移数值。
BYTE1=0x00,BYTE2=0x03~0xFFBYTE2为数据读取值。
连续读取BYTE2个字节的数据,而BYTE2必须是2的整数倍,否则必须补足。
例:
一段压缩数据(BI_RLE8)如下:
0x030x040x050x060x000x030x450x560x670x000x020x780x000x020x050x010x020x780x000x000x040x1E0x000x01
BYTE1BYTE2
0x030x040x040x040x04
0x050x060x060x060x060x060x06
0x000x03(0x450x560x670x00)0x450x560x67
0x020x780x780x78
0x000x02(0x050x01)右移5点,下移一点
0x020x780x780x78
0x000x00Endofline
0x040x1E0x1E0x1E0x1E0x1E
0x000x01Endoffile
一段压缩数据(BI_RLE4)如下:
0x030x040x050x060x000x030x450x600x040x630x030x780x000x020x050x010x030x780x000x000x050xD40x000x010x030x040x000x040x000x050x060x000x060x000x060x000x000x03(0x450x60)0x040x050x060x040x630x060x030x060x030x030x780x070x080x070x000x02(0x050x01)右移5点,下移一点0x030x780x070x080x070x000x00Endofline0x050xD40x0D0x050x0D0x050x0D0x000x01Endoffile
紧跟在彩色表之后的是图象数据字节阵列。
图象的每一扫描行由表示图象象素的连续的字节组成,每一行的字节数取决于图象的颜色数目和用象素表示的图象宽度。
扫描行是由底向上存储的,这就是说,阵列中的第一个字节表示位图左下角的象素,而最后一个字节表示位图右上角的象素。
(只针对与倒向DIB,如果是正向DIB,则扫描行是由顶向下存储的),倒向DIB的原点在图像的左下角,
而正向DIB的原点在图像的左上角。
同时,每一扫描行的字节数必需是4的整倍数,也就是DWORD对齐的。
如果你想确保图像的扫描行DWORD对齐,可使用下面的代码:
(((width*biBitCount)+31)>>5)<<2
起始地址为:
(如果该部分存在的话)
sizeof(第一部分)+sizeof(第二部分)
读取位图文件的时候第一部分应该不变,需要根据第二部分的0x000EH-0x0011H的值
大小来确定第二部分的数据大小。
整个区域的大小:
N*4BYTES 4个字节依次表示BGRA,编程中是RGBA这里是little_Endian
具体大小依赖很多数值
起始地址为:
VALUE(0x000AH-0x000DH)
整个区域的大小:
具体每个像素的表示方法,依赖0x001CH-0x001DH每个像素的位数
0x001EH-0x0021H压缩方式
0x002EH-0x0031H颜色表大小
0x001CH-0x001DH每个像素的位数
biBitCount=1表示位图最多有两种颜色,缺省情况下是黑色和白色,你也可以自己定义这两种颜色。
图像信息头装调色板中将有两个调色板项,称为索引0和索引1。
图象数据阵列中的每一位表示一个象素。
如果一个位是0,显示时就使用索引0的RGB值,如果位是1,则使用索引1的RGB值。
biBitCount=4表示位图最多有16种颜色。
每个象素用4位表示,并用这4位作为彩色表的表项来查找该象素的颜色。
例如,如果位图中的第一个字节为0x1F,它表示有两个象素,第一象素的颜色就在彩色表的第2表项中查找,而第二个象素的颜色就在彩色表的第16表项中查找。
此时,调色板中缺省情况下会有16个RGB项。
对应于索引0到索引15。
biBitCount=8表示位图最多有256种颜色。
每个象素用8位表示,并用这8位作为彩色表的表项来查找该象素的颜色。
例如,如果位图中的第一个字节为0x1F,这个象素的颜色就在彩色表的第32表项中查找。
此时,缺省情况下,调色板中会有256个RGB项,对应于索引0到索引255。
biBitCount=16表示位图最多有2^16种颜色。
每个色素用16位(2个字节)表示。
这种格式叫作高彩色,或叫增强型16位色,或64K色。
它的情况比较复杂,当biCompression成员的值是BI_RGB时,它没有调色板。
16位中,最低的5位表示蓝色分量,中间的5位表示绿色分量,高的5位表示红色分量,一共占用了15位,最高的一位保留,设为0。
这种格式也被称作55516位位图。
如果biCompression成员的值是BI_BITFIELDS,那么情况就复杂了,首先是原来调色板的位置被三个DWORD变量占据,称为红、绿、蓝掩码。
分别用于描述红、绿、蓝分量在16位中所占的位置。
在Windows95(或98)中,系统可接受两种格式的位域:
555和565,在555格式下,红、绿、蓝的掩码分别是:
0x7C00、0x03E0、0x001F,而在565格式下,它们则分别为:
0xF800、0x07E0、0x001F。
你在读取一个像素之后,可以分别用掩码“与”上像素值,从而提取出想要的颜色分量(当然还要再经过适当的左右移操作)。
在NT系统中,则没有格式限制,只不过要求掩码之间不能有重叠。
biBitCount=24表示位图最多有2^24种颜色。
这种位图没有调色板,在位数组中,每3个字节代表一个象素,分别对应于颜色R、G、B。
biBitCount=32表示位图最多有2^32种颜色。
这种位图的结构与16位位图结构非常类似,当biCompression成员的值是BI_RGB时,它也没有调色板,32位中有24位用于存放RGB值,顺序是:
最高位—保留,红8位、绿8位、蓝8位。
这种格式也被成为88832位图。
如果biCompression成员的值是BI_BITFIELDS时,原来调色板的位置将被三个DWORD变量占据,成为红、绿、蓝掩码,分别用于描述红、绿、蓝分量在32位中所占的位置。
在Windows95(or98)中,系统只接受888格式,也就是说三个掩码的值将只能是:
0xFF0000、0xFF00、0xFF。
而在NT系统中,你只要注意使掩码之间不产生重叠就行。
(注:
这种图像格式比较规整,因为它是DWORD对齐的,所以在内存中进行图像处理时可进行汇编级的代码优化(简单))。
0x002EH-0x0031H 4BYTES使用的颜色数
指定实际使用的颜色数目。
如果设置成0,