多分辨率小波图像变换及系数提取
1.相关函数
wavedec2:多层二维离散小波变换函数
[C,S] = wavedec2(X,N,'wname')
[C,S] = wavedec2(X,N,Lo_D,Hi_D)
appcoef2:二维离散小波变换低频部分系数提取
A = appcoef2(C,S,'wname',N)
A = appcoef2(C,S,'wname')
A = appcoef2(C,S,Lo_R,Hi_R)
A = appcoef2(C,S,Lo_R,Hi_R,N)
detcoef2:二维离散小波变换高频部分系数提取
D = detcoef2(O,C,S,N)
2.matlab代码
clear;
clc;
X = imread('xiaci_128_128_B.bmp');
figure(1);
imshow(X,[]);title('原始图像');
%2级小波变换
N = 2;
[C,S] = wavedec2(X,N,'db1');
%计算大小
[sizeX,sizeY] = size(X);
size1X = sizeX/2;
size1Y = sizeY/2;
size2X = sizeX/4;
size2Y = sizeY/4;
%提取第2级小波系数
temp = C(1:size2X*size2Y);
cA2 = reshape(temp(1:size2X*size2Y),size2X,size2Y);
%cA2 = appcoef2(C,S,'db1',2);
%temp = C(size2X*size2Y:size2X*size2Y*2);
%cH2 = reshape(temp(1:size2X*size2Y),size2X,size2Y);
%temp = C(size2X*size2Y*2:size2X*size2Y*3);
%cV2 = reshape(temp(1:size2X*size2Y),size2X,size2Y);
%temp = C(size2X*size2Y*3:size2X*size2Y*4);
%cD2 = reshape(temp(1:size2X*size2Y),size2X,size2Y);
%[cH2,cV2,cD2] = detcoef2('all',C,S,2);
%提取第1级小波变换系数
temp = C(size1X*size1Y:size1X*size1Y*2);
cH1 = reshape(temp(1:size1X*size1Y),size1X,size1Y);
temp = C(size1X*size1Y*2:size1X*size1Y*3);
cV1 = reshape(temp(1:size1X*size1Y),size1X,size1Y);
temp = C(size1X*size1Y*3:size1X*size1Y*4);
cD1 = reshape(temp(1:size1X*size1Y),size1X,size1Y);
%[cH1,cV1,cD1] = detcoef2('all',C,S,1);
figure(2);
subplot(221);imshow(cA2,[]);title('cA2');
subplot(222);imshow(cH2,[]);title('cH2');
subplot(223);imshow(cV2,[]);title('cV2');
subplot(224);imshow(cD2,[]);title('cD2');
figure(3);
%subplot(221);imshow(cA1,[]);title('cA1');
subplot(222);imshow(cH1,[]);title('cH1');
subplot(223);imshow(cV1,[]);title('cV1');
subplot(224);imshow(cD1,[]);title('cD1');
%画分割线
[m,n]=size(X);
mm = zeros(m,n);
mm = [[cA2,cH2;cV2,cD2],cH1;cV1,cD1];
dim = 2;
for i=1:dim
m=m-mod(m,2);
n=n-mod(n,2);
mm(m/2,1:n)=255;
mm(1:m,n/2)=255;
m=m/2;
n=n/2;
end
figure(4);
imshow(mm,[]);title('二级分解图像');
3.处理结果
最后一幅分割图像中,第2级低频系数比较白,其他部分都比较黑,原因是cA2的数值比较大,还有的位置超过300的,而其他部分相对较小,因此放在一起显示的时候对比就比较明显了,目前还没有好的办法解决,如果强制把低频部分量化到0-255而其他部分不变,感觉不是很准确。
4.关于系数提取
若使用单层小波变换函数dwt2则小波变换系数直接保存在[cA,cV,cH,cD]中,若使用多层小波变换函数wavedec2则小波变换系数可以从变换结果[C,S]中进行分离,根据C的结构和S中保存的各级变换尺寸的大小从C中进行提取,C的结果为C = [ A(N) | H(N) | V(N) | D(N) | H(N-1) | V(N-1) | D(N-1) | ... | H(1) | V(1) | D(1) ],S是存储各层分解系数长度的,即第一行是A(N)的大小,第二行是H(N) | V(N) | D(N)的大小,第三行是H(N-1) | V(N-1) | D(N-1)的大小,倒数第二行是H(1) | V(1) | D(1)的大小,最后一行是X的大小;另一种方式是使用系数提取函数appcoef2和detcoef2,分别提取变换后的低频部分和高频部分系数。
小弟不才,如有不对的地方还请不吝指教!