matlab两个力的合成与分解,[转帖]小波图像分解与合成(例子) - Matlab讨论区 - 振动论坛 动力学,噪声 -......
% 該函數是根據對所輸入的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];
總結
以上是生活随笔為你收集整理的matlab两个力的合成与分解,[转帖]小波图像分解与合成(例子) - Matlab讨论区 - 振动论坛 动力学,噪声 -......的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: STM32F103C6T6初步学习
- 下一篇: matlab人脸追踪,求大神帮助我这个菜