激素六项怎样检查费用:[转帖]小波图像分解与合成(例子) - Matlab讨论区 - 振动论坛 动力学,噪声 -...

来源:百度文库 编辑:偶看新闻 时间:2024/04/30 21:29:44
转帖]小波图像分解与合成(例子)% 该函数是根据对所输入的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)cA(row_max,col_max)=0;
end
% 与最大分别值row_max和col_max比较,对右上角矩阵扩展置0
if temp2(1)cH(row_max,col_max)=0;
end
% 与最大分别值row_max和col_max比较,对左下角矩阵扩展置0
if temp3(1)cV(row_max,col_max)=0;
end
% 与最大分别值row_max和col_max比较,对右下角矩阵扩展置0
if temp4(1)cD(row_max,col_max)=0;
end
% 合并左上角、右上角、左下角、右下角矩阵生成输出pic矩阵
pic=[cA,cH;cV,cD];