|
mingmingtree 发表于 2012-4-9 09:23
好长,眼睛都看花了!
不过还是谢谢分享!! - % 该函数是根据对所输入的png格式的真彩图像、小波类型(db9或haar)
- % 和相应的阈值进行了三级非标准小波harr或db9的分解和重构,从而达到了对原图像的压缩处理的
- % 目的。它首先把通过原图像分离后的某颜色分量作为二维图像矩阵,通过调用自定义的二维离散
- % 小波变换函数mydwt2(),并依据指定的小波基函数'wavename'进行二维离散的行、列小波变换,
- % 得到了经变换后的相应颜色分量的近似分量% cA,水平细节分量cH,垂直细节分量cV,对角细节
- % 分量cD和中间分量cM,然后调用自定义的图像输出函数outrgb分别把中间分量以及cA、cH、cV、
- % cD合并后的图像阵进行R、G、B合成输出图像文件,其中某颜色分量的cA又做为下一级二维离散的
- % 行、列小波分解的输入图像阵,如此共完成三次。
- % 其次,把经过三级非标准小波分解后的各颜色分量的各级水平细节分量、垂直细节分量、对角细
- % 节分量矩阵通过调用自定义函数make_0()完成了相应矩阵元素数值小于阀值系数的个数统计,并
- % 对它们进行小于阀值系数元素置0处理,且把分量尽数返回,以便三级的非标准小波重构处理。
- % 最后,将返回得到的各颜色分量的第三级水平细节分量、垂直细节分量、对角细节分量矩阵和第
- % 三级分解后的近似分量作为参数,通过调用自定义的二维离散小波反变换函数myidwt2()进行二维
- % 离散的列、行重构,得到了经重构后的近似分量cA 和中间分量cM,把该中间分量cM以及近似分量
- % cA分别和经置0处理后第二级cH、cV、cD行列扩展,同时进行R、G、B合成,后调用自定义的图像
- % 输出函数outrgb()输出图像文件。其中各颜色分量的cA又做为下一级二维离散的列、行小波重构
- % 的输入图像阵,如此共完成三次。最终得到了压缩处理的图像文件。
- % 读入图像文件
- picchar=strcat(mypic,'.png')
- pic=imread(picchar);
- pic=double(pic);
- % 对原真彩图像进行R、G、B分离
- cAr0=pic(:,:,1);cAg0=pic(:,:,2);cAb0=pic(:,:,3);
- % 第1级非标准分解
- [cAr1,cHr1,cVr1,cDr1,cMr1] = mydwt2(cAr0,wavename);
- [cAg1,cHg1,cVg1,cDg1,cMg1] = mydwt2(cAg0,wavename);
- [cAb1,cHb1,cVb1,cDb1,cMb1] = mydwt2(cAb0,wavename);
- % 输出经第1级非标准分解后的图像文件
- outrgb(cMr1,cMg1,cMb1,wavename,threshold,'_1_row');
- outrgb(merge(cAr1,cHr1,cVr1,cDr1),merge(cAg1,cHg1,cVg1,cDg1),merge(cAb1,cHb1,...
- cVb1,cDb1),wavename,threshold,'_1_col');
- % 第2级非标准分解
- [cAr2,cHr2,cVr2,cDr2,cMr2] = mydwt2(cAr1,wavename);
- [cAg2,cHg2,cVg2,cDg2,cMg2] = mydwt2(cAg1,wavename);
- [cAb2,cHb2,cVb2,cDb2,cMb2] = mydwt2(cAb1,wavename);
- % 输出经第2级非标准分解后的图像文件
- outrgb(merge(cMr2,cHr1,cVr1,cDr1),merge(cMg2,cHg1,cVg1,cDg1),merge(cMb2,cHb1,...
- cVb1,cDb1),wavename,threshold,'_2_row');
- outrgb(merge(merge(cAr2,cHr2,cVr2,cDr2),cHr1,cVr1,cDr1),merge(merge(cAg2,cHg2,...
- cVg2,cDg2),cHg1,cVg1,cDg1),merge(merge(cAb2,cHb2,cVb2,cDb2),cHb1,cVb1,cDb1...
- ),wavename,threshold,'_2_col');
- % 第3级非标准分解
- [cAr3,cHr3,cVr3,cDr3,cMr3] = mydwt2(cAr2,wavename);
- [cAg3,cHg3,cVg3,cDg3,cMg3] = mydwt2(cAg2,wavename);
- [cAb3,cHb3,cVb3,cDb3,cMb3] = mydwt2(cAb2,wavename);
- % 输出经第2级非标准分解后的图像文件
- outrgb(merge(merge(cMr3,cHr2,cVr2,cDr2),cHr1,cVr1,cDr1),merge(merge(cMg3,cHg2,...
- cVg2,cDg2),cHg1,cVg1,cDg1),merge(merge(cMb3,cHb2,cVb2,cDb2),cHb1,cVb1,cDb1...
- ),wavename,threshold,'_3_row');
- outrgb(merge(merge(merge(cAr3,cHr3,cVr3,cDr3),cHr2,cVr2,cDr2),cHr1,cVr1,cDr1),...
- merge(merge(merge(cAg3,cHg3,cVg3,cDg3),cHg2,cVg2,cDg2),cHg1,cVg1,cDg1),...
- merge(merge(merge(cAb3,cHb3,cVb3,cDb3),cHb2,cVb2,cDb2),cHb1,cVb1,cDb1),...
- wavename,threshold,'_3_col');
- % 统计经过三级非标准小波分解后的各颜色分量的各级水平细节分量、垂直细节分量、对
- % 角细节分量的相应矩阵元素数值小于阀值系数的个数,并对它们进行小于阀值系数元素
- % 置0处理。
- zeronum=0;
- [cHr3,cVr3,cDr3,cHr2,cVr2,cDr2,cHr1,cVr1,cDr1,num_0]=make_0(cHr3,cVr3,cDr3,...
- cHr2,cVr2,cDr2,cHr1,cVr1,cDr1,threshold);
- zeronum=zeronum+num_0;
- [cHg3,cVg3,cDg3,cHg2,cVg2,cDg2,cHg1,cVg1,cDg1,num_0]=make_0(cHg3,cVg3,cDg3,...
- cHg2,cVg2,cDg2,cHg1,cVg1,cDg1,threshold);
- zeronum=zeronum+num_0;
- [cHb3,cVb3,cDb3,cHb2,cVb2,cDb2,cHb1,cVb1,cDb1,num_0]=make_0(cHb3,cVb3,cDb3,...
- cHb2,cVb2,cDb2,cHb1,cVb1,cDb1,threshold);
- zeronum=zeronum+num_0;
- % 把0的总数写入文本文件
- zerotxt=strcat(wavename,'_',threshold,'_','zero','.txt')
- csvwrite(zerotxt,zeronum);
- % 第1级非标准重构
- [cAr2,cMr3] = myidwt2(cAr3,cHr3,cVr3,cDr3,wavename);
- [cAg2,cMg3] = myidwt2(cAg3,cHg3,cVg3,cDg3,wavename);
- [cAb2,cMb3] = myidwt2(cAb3,cHb3,cVb3,cDb3,wavename);
- % 输出经第1级非标准重构后的图像文件
- outrgb(merge(merge(cMr3,cHr2,cVr2,cDr2),cHr1,cVr1,cDr1),merge(merge(cMg3,cHg2,...
- cVg2,cDg2),cHg1,cVg1,cDg1),merge(merge(cMb3,cHb2,cVb2,cDb2),cHb1,cVb1,cDb1...
- ),wavename,threshold,'_1_icol');
- outrgb(merge(merge(cAr2,cHr2,cVr2,cDr2),cHr1,cVr1,cDr1),merge(merge(cAg2,cHg2,...
- cVg2,cDg2),cHg1,cVg1,cDg1),merge(merge(cAb2,cHb2,cVb2,cDb2),cHb1,cVb1,cDb1...
- ),wavename,threshold,'_1_irow')
- % 第2级非标准重构
- [cAr1,cMr2] = myidwt2(cAr2,cHr2,cVr2,cDr2,wavename);
- [cAg1,cMg2] = myidwt2(cAg2,cHg2,cVg2,cDg2,wavename);
- [cAb1,cMb2] = myidwt2(cAb2,cHb2,cVb2,cDb2,wavename);
- % 输出经第2级非标准重构后的图像文件
- outrgb(merge(cMr2,cHr1,cVr1,cDr1),merge(cMg2,cHg1,cVg1,cDg1),merge(cMb2,cHb1,...
- cVb1,cDb1),wavename,threshold,'_2_icol');
- outrgb(merge(cAr1,cHr1,cVr1,cDr1),merge(cAg1,cHg1,cVg1,cDg1),merge(cAb1,cHb1,...
- cVb1,cDb1),wavename,threshold,'_2_irow');
- % 第3级非标准重构
- [cAr0,cMr1] = myidwt2(cAr1,cHr1,cVr1,cDr1,wavename);
- [cAg0,cMg1] = myidwt2(cAg1,cHg1,cVg1,cDg1,wavename);
- [cAb0,cMb1] = myidwt2(cAb1,cHb1,cVb1,cDb1,wavename);
- % 输出经第3级非标准重构后的图像文件,即最终图像文件
- outrgb(cMr1,cMg1,cMb1,wavename,threshold,'_3_icol');
- outrgb(cAr0,cAg0,cAb0,wavename,threshold,'_result');
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- function [cA,cH,cV,cD,cM]=mydwt2(mypic_RGB,wavename)
- %此函数是利用MATLAB工具箱提供的一维离散小波变换函数dwt()对传递进来的图像矩阵mypic_RGB
- % 进行相应的小波类型分解处理,其中参数wavename是小波类型。它借助于使用了指定的小波基函
- % 数'wavename' 的dwt()首先对图像矩阵进行行分解,而后进行列分解。生成了近似分量cA,水平
- % 细节分量cH,垂直细节分量cV,对角细节分量cD和中间分量cM
- % 变量初始化
- cA=[];cH=[];cV=[];cD=[];cM=[];cAm=[];cDm=[];
- % 进行逐行行分解变换
- % cA1,cD1为临时近似,细节分量,把两分量进行列数扩展合成为中间分量矩阵以便输出
- x=size(mypic_RGB);
- for i=1:x(1)
- [cA1,cD1]=dwt(mypic_RGB(i,:),wavename);
- cAm=[cAm;cA1];cDm=[cDm;cD1];
- end
- cM=[cAm,cDm];
- % 对两临时分量进行逐列列分解变换,最后生成近似分量cA,水平细节分量cH,垂直细节分量cV,对
- % 角细节分量cD
- cAm=cAm';cDm=cDm';
- x=size(cAm);
- for i=1:x(1)
- [cA1,cD1]=dwt(cAm(i,:),wavename);
- cA=[cA;cA1];cV=[cV;cD1];
- end
- x=size(cDm);
- for i=1:x(1)
- [cA1,cD1]=dwt(cDm(i,:),wavename);
- cH=[cH;cA1];cD=[cD;cD1];
- end
- % 转置矩阵
- cA=cA';cH=cH';cV=cV';cD=cD';
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- function [mypic_RGB,cM]=myidwt2(cA,cH,cV,cD,wavename)
- % 此函数实现了二维离散小波反变换,即重构。它是利用MATLAB工具箱所提供的一维离散小波反变
- % 换函数idwt()对传递进来的近似分量cA、水平细节分量cH、垂直细节分量cV和对角细节分量cD进
- % 行相应的小波类型重构处理,其中参数wavename是小波类型。它借助于使用了指定的小波基函数
- % 'wavename'的idwt()首先对四个分量矩阵进行列反变换,而后行反变换。重构出中间过程图像矩
- % 阵cM和原始图像矩阵mypic_RGB。
- cA1=[];cD1=[];
- % 进行逐列列重构变换,得到过程矩阵cA1、cD1,再对它们列数扩展合成为中间图阵cM
- cA=cA';cH=cH';cV=cV';cD=cD';
- mypic_RGB=[];
- x=size(cA);
- for i=1:x(1)
- temp=idwt(cA(i,:),cV(i,:),wavename);
- cA1=[cA1;temp];
- end
- x=size(cH);
- for i=1:x(1)
- temp=idwt(cH(i,:),cD(i,:),wavename);
- cD1=[cD1;temp];
- end
- cA1=cA1';
- cD1=cD1';
- cM=[cA1,cD1];
- % 对上述得到的分量cA1、cD1作为过程细节分量进行逐行行重构变换,得到图像矩阵mypic_RGB
- x=size(cA1);
- for i=1:x(1)
- temp=idwt(cA1(i,:),cD1(i,:),wavename);
- mypic_RGB=[mypic_RGB;temp];
- end
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- function []=outrgb(pic_R,pic_G,pic_B,wavename,threshold,level)
- % 该函数确定了图像在各像素位置上的红、绿、蓝的强度值组合。实现了R、G、B各分量组合后所
- % 成的真彩图像的文件输出
- temp=size(pic_R);
- pic=zeros(temp(1),temp(2),3);
- for i=1:temp(1);
- for j=1:temp(2);
- pic(i,j,1)=pic_R(i,j);
- pic(i,j,2)=pic_G(i,j);
- pic(i,j,3)=pic_B(i,j);
- end
- end
- %输出RGB图像,即真彩图像。
- imwrite(pic/255,strcat('pic','_',wavename,'_',threshold,level,'.png'));
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- function [cH3,cV3,cD3,cH2,cV2,cD2,cH1,cV1,cD1,count]...
- =make_0(cH3,cV3,cD3,cH2,cV2,cD2,cH1,cV1,cD1,threshold)
- % 该函数功能是本课程役计的关键,它完成了对经过三级非标准分解后各分量图矩阵中所有元素数
- % 值小于阀值的进行置0处理,为后面进行三级非标准重构原始图像从而实现图像压缩奠定了基础。
- % 输入经过非标准分解后颜色分量的各级的水平细节分量、垂直细节分量、对角细节分量和阀值
- % threshold其中数字表示非标准处理的级别。输出各分量图矩阵中所有元素数值小于阀值系数置
- % 0处理后所对应的各级的水平细节分量、垂直细节分量、对角细节分% 量,并统计它们系数为0个
- % 数count。
- threshold_num=str2num(threshold);
- count=0;
- % 借助临时分量对第三级非标准分解的水平细节分量、垂直细节分量、对角细节分量进行行、列数
- % 扩展合成cM_matrix3,并对数值小于阀值系数进行置0处理,并统计矩阵元素数值小于阀值系数的
- % 个数。
- cM_cA3=cD3
- cM_cA3=zeros(size(cM_cA3,1),size(cM_cA3,2));
- num=size(cM_cA3,1)*size(cM_cA3,2);
- cM_matrix3=[cM_cA3,cH3;cV3,cD3];
- cM_size=size(cM_matrix3);
- for i=1:cM_size(1)
- for j=1:cM_size(2)
- if abs(cM_matrix3(i,j))<=threshold_num
- count=count+1;
- cM_matrix3(i,j)=0;
- end
- end
- end
- % 对所合成的cM_matrix3重新分离出置0处理后的水平细节分量、垂直细节分量和对角细节分量,并
- % 精确了矩阵元素数值小于阀值系数的数目。
- cH3=cM_matrix3;cV3=cM_matrix3;cD3=cM_matrix3;
- cH3(1+size(cM_cA3,1):2*size(cM_cA3,1),:)=[];cH3(:,1:size(cM_cA3,2))=[];
- cV3(1:size(cM_cA3,1),:)=[];cV3(:,1+size(cM_cA3,2):2*size(cM_cA3,2))=[];
- cD3(1:size(cM_cA3,1),:)=[];cD3(:,1:size(cM_cA3,2))=[];
- count=count-num;
- % 借助临时分量对第二级非标准分解的水平细节分量、垂直细节分量、对角细节分量进行行、列数
- % 扩展合成cM_matrix2,并对数值小于阀值系数进行置0处理,并统计矩阵元素数值小于阀值系数的 % 个数。
- cM_cA2=cD2
- cM_cA2=zeros(size(cM_cA2,1),size(cM_cA2,2));
- num=size(cM_cA2,1)*size(cM_cA2,2);
- cM_matrix2=[cM_cA2,cH2;cV2,cD2];
- cM_size=size(cM_matrix2);
- for i=1:cM_size(1)
- for j=1:cM_size(2)
- if abs(cM_matrix2(i,j))<=threshold_num
- count=count+1;
- cM_matrix2(i,j)=0;
- end
- end
- end
- % 对所合成的cM_matrix2重新分离出置0处理后的水平细节分量、垂直细节分量和对角细节分量,并
- % 精确了矩阵元素数值小于阀值系数的数目。
- cH2=cM_matrix2;cV2=cM_matrix2;cD2=cM_matrix2;
- cH2(1+size(cM_cA2,1):2*size(cM_cA2,1),:)=[];cH2(:,1:size(cM_cA2,2))=[];
- cV2(1:size(cM_cA2,1),:)=[];cV2(:,1+size(cM_cA2,2):2*size(cM_cA2,2))=[];
- cD2(1:size(cM_cA2,1),:)=[];cD2(:,1:size(cM_cA2,2))=[];
- count=count-num;
- % 借助临时分量对第一级非标准分解的水平细节分量、垂直细节分量、对角细节分量进行行、列数
- % 扩展合成cM_matrix1,并对数值小于阀值系数的元素进行置0处理,且统计矩阵元素数值小于阀值
- % 系数的个数。
- cM_cA1=cD1
- cM_cA1=zeros(size(cM_cA1,1),size(cM_cA1,2));
- num=size(cM_cA1,1)*size(cM_cA1,2);
- cM_matrix1=[cM_cA1,cH1;cV1,cD1];
- cM_size=size(cM_matrix1);
- for i=1:cM_size(1)
- for j=1:cM_size(2)
- if abs(cM_matrix1(i,j))<=threshold_num
- count=count+1;
- cM_matrix1(i,j)=0;
- end
- end
- end
- % 对所合成的cM_matrix1重新分离出置0处理后的水平细节分量、垂直细节分量和对角细节分量,并
- % 精确了矩阵元素数值小于阀值系数的数目。
- cH1=cM_matrix1;cV1=cM_matrix1;cD1=cM_matrix1;
- cH1(1+size(cM_cA1,1):2*size(cM_cA1,1),:)=[];cH1(:,1:size(cM_cA1,2))=[];
- cV1(1:size(cM_cA1,1),:)=[];cV1(:,1+size(cM_cA1,2):2*size(cM_cA1,2))=[];
- cD1(1:size(cM_cA1,1),:)=[];cD1(:,1:size(cM_cA1,2))=[];
- count=count-num;
-
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- function pic=merge(cA,cH,cV,cD)
- % 该函数实现了对传入的四个参数矩阵cA,cH,cV,cD合并,其中cA,cH,cV,cD分别代表左上角、右上
- % 角、左下角、右下角矩阵,合并结果为输出矩阵pic
- % 取得四个参数矩阵行、列两维的最大分别值row_max和col_max
- temp1=size(cA);temp2=size(cH);temp3=size(cV);temp4=size(cD);
- row_max=max([temp1(1),temp2(1),temp3(1),temp4(1)]);
- col_max=max([temp1(2),temp2(2),temp3(2),temp4(2)]);
- % pic=zeros(2*row_max,2*col_max);
- % 与最大分别值row_max和col_max比较,对左上角矩阵扩展置0
- if temp1(1)<row_max|temp1(2)<col_max
- cA(row_max,col_max)=0;
- end
- % 与最大分别值row_max和col_max比较,对右上角矩阵扩展置0
- if temp2(1)<row_max|temp2(2)<col_max
- cH(row_max,col_max)=0;
- end
- % 与最大分别值row_max和col_max比较,对左下角矩阵扩展置0
- if temp3(1)<row_max|temp3(2)<col_max
- cV(row_max,col_max)=0;
- end
- % 与最大分别值row_max和col_max比较,对右下角矩阵扩展置0
- if temp4(1)<row_max|temp4(2)<col_max
- cD(row_max,col_max)=0;
- end
- % 合并左上角、右上角、左下角、右下角矩阵生成输出pic矩阵
- pic=[cA,cH;cV,cD];
复制代码 |
|