EZW举例如何对256256灰度图象进行ezw编码Word格式文档下载.docx
- 文档编号:16285275
- 上传时间:2022-11-22
- 格式:DOCX
- 页数:14
- 大小:20.12KB
EZW举例如何对256256灰度图象进行ezw编码Word格式文档下载.docx
《EZW举例如何对256256灰度图象进行ezw编码Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《EZW举例如何对256256灰度图象进行ezw编码Word格式文档下载.docx(14页珍藏版)》请在冰豆网上搜索。
{//如果放入的比特为是1,统计1的个数;
反之统计0的个数
if(bit=='
1'
)
{output_byte|=mask;
ones++;
}
elsezeroes++;
mask>
>
=1;
if(mask==0)
{fwrite(&
output_byte,sizeof(output_byte),1,ezw_file);
output_byte=0;
mask=0x80;
}}/**Putsdominant-passandsubordinate-passcodesintheoutputstream.*/
voidoutput_code(intcode)
{//对于一个已经量化且编码后的数据,来判断它的类型。
其类型有6种,正如在头文件中定
义的那样
switch(code)
{caseZERO:
put_bit('
0'
);
//如果是二进制数0,则输出一个比特位,值不变#ifdefdebugprintf("
0"
#endifbreak;
caseONE:
//如果是二进制数1,则输出一个比特位,值不变#ifdefdebugprintf("
1"
casePOS:
//如果是正大系数,则按顺序输出两个比特位,值依次为0,1
#ifdefdebugprintf("
p"
#endif
break;
caseNEG:
//如果是负大系数,则按顺序输出两个比特位,值依次为1,1
n"
#endifbreak;
caseZTR:
//如果是零树根,则按顺序输出两个比特位,值依次为0,0
#ifdefdebug
printf("
t"
#endif
caseIZ:
//如果是孤独零,则按顺序输出两个比特位,值依次为1,0
z"
}}
/**Returnsthelargestvalueinadescendancetree.*/
element_typemax_descendant(matrix_2d*m,intx,inty)
{inti,j,min_x,max_x,min_y,max_y;
//max为函数输出值element_typetemp,max;
//假如是第一个节点,返回矩阵得元素最大值
if((x==0)&
&
(y==0))
{temp=m->
m[0][0];
m->
m[0][0]=min_element_type;
max=matrix_2d_abs_max(m);
m[0][0]=temp;
}
//否则,扫描继续
else
{min_x=x<
<
1;
min_y=y<
max_x=(x+1)<
max_y=(y+1)<
//整幅图像扫描完毕仍没有结构,退出
if((min_x==m->
col)||(min_y==m->
row))
{return(0);
//初始化最大值
max=0;
while((max_y<
=m->
row)&
(max_x<
col))
{//扫描进行
for(i=min_y;
i<
max_y;
i++)
{for(j=min_x;
j<
max_x;
j++)
{temp=abs(m->
m[i][j]);
if(temp>
max)max=temp;
}}
//起始点坐标值左移1位后,继续
min_x<
max_x<
min_y<
max_y<
}}//返回最大值return(max);
/**Returns1ifdescendancetreeisazerotree.*/
charzerotree(matrix_2d*m,intx,inty,intthreshold)
element_typetemp,max;
charstop;
stop=0;
{//将当前系数放入缓存区
temp=m->
//取矩阵中元素的最大绝对值
//如果最大值大于当前阈值,停止
if(max>
=threshold)stop=1;
//如果不是矩阵的第一个元素,坐标值将左移1位
{//横坐标最小值左移1位min_x=x<
//纵坐标最小值左移1位min_y=y<
//横坐标最大值左移1位max_x=(x+1)<
//纵坐标最大值左移1位max_y=(y+1)<
//如果扫描起始点坐标值超过图像的边界坐标值,返回真值
{return
(1);
}max=0;
{//逐个系数扫描
{temp=abs(m->
//如果出现大系数,停止
=threshold)
{stop=1;
break;
if(stop==1)break;
//坐标值再左移1位,//循环仍在继续
if(stop==1)return(0);
//返回真值return
(1);
/**Returnsadominant-passcodefromthealphabet[POS,NEG,ZTR,IZ].*/
intcode(matrix_2d*m,intx,inty,element_typethreshold){element_typetemp;
//将欲处理的数据暂存到一块区域
m[y][x];
//如果该小波系数的幅值大于当前阈值,则是大系数(但是不知道正负)
if(abs(temp)>
{//如果它大于0,则返回为POS(即"
正大系数"
=0)return(POS);
else//否则返回为NEG("
负大系数"
)return(NEG);
//如果它的幅值小于当前阈值,则是小系数(但不知道是否"
零树根"
{//如果零树判断为真,则返回ZTR("
if(zerotree(m,x,y,threshold)==1)return(ZTR);
//否则返回IZ("
孤独零"
)elsereturn(IZ);
/**Appendsavaluetothesubordinatelist.*/voidto_sub_list(element_typevalue)
{list_typed;
//仅仅往树添加系数的幅度值的大小,系数的符号已经编码
d.x=abs(value);
d.y=0;
append_to_list(d);
}/**BuildsadominantpassEZW-elementfromamatrixelementandathreshold.*/
voidprocess_element(matrix_2d*m,element_typethreshold,ezw_element*s)
{//将小波数据,系数坐标和量化阈值作为输入,进行编码(即符号化)
s->
code=code(m,s->
x,s->
y,threshold);
//假如编码为大系数(无论正负),将编码放入子表中
if((s->
code==POS)||(s->
code==NEG))
{to_sub_list(m->
m[s->
y][s->
x]);
//编码位置复位m->
x]=0;
/**Performsonecompletedominantpass.Dominant-pass-codesaresenttothe
*outputstreamandthesubordinatelistisupdated.*/voiddominant_pass(matrix_2d*m,element_typethreshold){ezw_elements;
intmin_x,max_x,min_y,max_y;
//将当前扫描位置移至example[0][0]处,并进行判断、量化
s.x=0;
s.y=0;
//将该系数与当前阈值进行比较,符号化process_element(m,threshold,&
s);
//将上一步的结果进行输出编码output_code(s.code);
//对example[1][0],example[0][1],example[1][1]进行判断、量化s.x=1;
//将上一步的结果放到扫描序列中put_in_fifo(s);
s.x=0;
s.y=1;
s.x=1;
//从扫描序列中取出一个系数s=get_from_fifo();
//假如序列为空,直接将其送输出编码
if(fifo_empty==0)output_code(s.code);
while(fifo_empty==0)
{//如果当前编码不为ZTR,则将当前扫描移至下一频段
if(s.code!
=ZTR)
{//横坐标最小值左移1位,即加倍min_x=s.x<
//横坐标最大值为最小值加1max_x=min_x+1;
//纵坐标最小值左移1位,即加倍min_y=s.y<
//纵坐标最大值为最小值加1max_y=min_y+1;
if((max_x<
col)&
(max_y<
{for(s.y=min_y;
s.y<
max_y+1;
s.y++)
{for(s.x=min_x;
s.x<
max_x+1;
s.x++)
{process_element(m,threshold,&
put_in_fifo(s);
}}}}
s=get_from_fifo();
}}/**Performsonesubordinatepass.*/
voidsubordinate_pass(element_typethreshold){list_typed;
//定义一颗零树
inti;
charfound;
if(threshold>
0)
{for(i=0;
list_length;
{d=get_list_element(i,&
found);
if(found==1)
{if((d.x&
threshold)!
=0)
output_code(ONE);
elseoutput_code(ZERO);
}}}}
/**EZW-codesmatrixm,returnsinitialthreshold.*/voidEZW_code(matrix_2d*m,element_typethreshold){while(threshold!
=0)//初始化量化阈值为0
{dominant_pass(m,threshold);
\n"
//将量化阈值右移1位,即数值为原来的1/2
//主表扫描结束后,阈值减半继续子表的扫描
subordinate_pass(threshold>
1);
//本次主表、子表扫描结束
//将量化阈值右移1位,即数值为原来的1/2threshold>
}}intEZW(void)
{printf("
//工作矩阵的高度为8
header.height=8;
//工作矩阵的宽度为8
header.width=8;
//创建一个用于运算的工作矩阵
M=matrix_2d_create(header.height,header.width);
if(M==NULL)
//如果工作矩阵分配不成功,退出
exit
(1);
//将实验小波系数转存到工作矩阵中
load_data(M);
#ifdefdebugmatrix_2d_write(M);
//准备编码后的数据流输出的文件
header.threshold=1<
(int)(floor(log10(matrix_2d_abs_max(M))/log10
(2)));
if((ezw_file=fopen("
out.ezw"
"
wb"
))==NULL)
Couldnotopenoutputfile.\n"
//如果输出文件没有打开,退出
};
//往输出文件中写入文件头fwrite(&
header,sizeof(header),1,ezw_file);
//进行EZW编码运算
zeroes=0;
//初始数据流中没有比特位,所以置0
ones=0;
//初始输出字节数为0
//最高位为1的标志位
mask=0x80;
//将工作矩阵作为输入,给定阈值进行编码
EZW_code(M,header.threshold);
//刷新输出区域
if(mask!
bits:
%d,%dzeroes,%dones.\n"
zeroes+ones,zeroes,ones);
//清除所有的临时文件和内存占用
fclose(ezw_file);
//释放工作矩阵所占的空间
matrix_2d_destroy(M);
//释放主表扫描过程中的临时数据
destroy_fifo();
//清除零树扫描过程中的临时数据
destroy_list();
//返回return0;
"
EZW.H"
//EZW编码器的头文件
#ifndef__EZW_H__
#define__EZW_H__
//这是一个数据格式的头文件,大家只需要知道它是用于程序中全部矩阵运算的完成即可#include"
//定义编码输出数据流存储的文件头格式
typedefstruct__ezw_file_header{intheight;
intwidth;
element_typethreshold;
}ezw_file_header;
//范例数据:
取自Shapiro的实验数据
constintexample[8][8]={
{63,-34,49,10,7,13,-12,7},
{-31,23,14,-13,3,4,6,-1},
{15,14,3,-12,5,-7,3,9},
{-9,-7,-14,8,4,-2,3,2},
{-5,9,-1,47,4,6,-2,2},
{3,0,-3,2,3,-2,0,4},
{2,-3,6,-4,3,6,3,6},
{5,11,5,6,0,3,-4,4}};
//定义小波系数量化的字符:
ZTR、POS、NEG和IZ
#defineZERO0//二进制数0
#defineONE1//二进制数1
#defineZTR2//二进制数00
#definePOS3//二进制数01
#defineNEG4//二进制数11
#defineIZ5//二进制数10
#endif/*__EZW_H__*/
/*EZW解码器
解码器数据扫描的方式:
数据平面的频段分布:
Subbanddistribution:
#definedebug#include"
#include"
#include<
matrix_2d*M;
//定义工作矩阵charerror;
//定义误差
FILE*ezw_file;
//已编码文件ezw_file_headerheader;
//文件头
longintpixels;
longintzeroes,ones;
unsignedcharinput_byte,mask;
voidshow_code(intcode)
{switch(code)
{caseZERO:
//如果编码为ZERO,则输出为0printf("
//如果编码为ONE,则输出为1printf("
//如果编码为POS,则输出为pprintf("
//如果编码为NEG,则输出为nprintf("
//如果编码为ZTR,则输出为tprintf("
//如果编码为IZ,则输出为zprintf("
}}//从一个输入流中读出一个比特位
charget_bit(void)
{charbit;
//定义读出的比特位存储空间
{//从文件中读出一个字节,存放在input_byte中
fread(&
input_byte,sizeof(input_byte),1,ezw_file);
//最高位标志}
//如果读出字节的最高位为0,则读出比特位的值为0
if((input_byte&
mask)==0)
{bit='
;
zeroes++;
//否则读出比特位的值为1
{bit='
ones++;
//最高标志位右移一位mask>
//返回当前判断的比特位的值return(bit);
}//从一个输入流中读出一个编码字节
intinput_code(intcount)
{
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- EZW 举例 如何 256256 灰度 图象 进行 编码