6 May 2010

matlab数字图像小波分解



小波的定义和原理随便找本书都有讲解,简言之,小波就是将信号X

分解为近似信号A(Approximate signal)和细节信号D(Details signal)的

过程.matlab中的小波工具箱内置了丰富的函数,让复杂的小波处理

变得非常简单.(鉴于数字图像都是2维,只记录下2维相关的函数)

分解过程如:


wfilters: 指定小波函数,有很多.具体help
wavedec2: N级二维小波分解
appcoef2: 获得指定级别的近似信号A
detcoef2: 获得指定级别的细节(高频)信号h,v,或者d.具体与第一个参数有关. (得到某个高频分量,注意和下一个函数区别)
wrcoef2: 利用某个高频分量重建图像(与原图像图等大小)

测试如下:
%% wavelet study demo
% xenoszhATgmail.com
% 2010-05-06

function waveletTest()

% get input image
[filename,pathname] = uigetfile('testPics\*.jpg;*.jpeg;*.bmp;*.png','Please pick up a picture:');
if ~filename
 disp('No input file.');
 return;
end
img = imread(strcat(pathname,filename));

% get grayscale image
img = rgb2gray(img); 

size(img)

% get wavelet decomposition filter coefficients, using haar function
[lod,hid] = wfilters('haar','d'); 

% 2 level wavelet decomposition
[c,s] = wavedec2(img,2,lod,hid);

% get 2nd level approximate signal
a2 = appcoef2(c,s,'haar',2);
% convert it convert it to uint8 image in [0 255]
a2 = double2uint8(a2);

% get 2nd level horizontal high frequency signal
h2 = detcoef2('h',c,s,2);
h2 = double2uint8(h2);

% get 2nd level vertical high frequency signal
v2 = detcoef2('v',c,s,2);
v2 = double2uint8(v2);

% get 2nd level digonal high frequency signal
d2 = detcoef2('d',c,s,2);
d2 = double2uint8(d2);

% compose 2nd level 
wave2 = [a2,h2;v2,d2];

% get 1st lavel horizontal high frequency signal
h1 = detcoef2('h',c,s,1);
h1 = double2uint8(h1);

% get 1st level vertical high frequency signal
v1 = detcoef2('v',c,s,1);
v1 = double2uint8(v1);

% get 1st level digonal high frequency signal
d1 = detcoef2('d',c,s,1);
d1 = double2uint8(d1);

% make sure they have the same size
wave2 = imresize(wave2,size(h1));

% compose 1st level (original size)
wave1 = [wave2, h1; v1, d1];

% show image
figure; imshow(img);

% show wavelet decomposition
figure; imshow(wave1);

end

%% sub function to convert double image to uint8 image
function uint8image = double2uint8(dblimage)
if nargin==1 && isa(dblimage,'double')
 uint8image = 255*(dblimage-min(min(dblimage)))/(max(max(dblimage))-min(min(dblimage)));
 uint8image = uint8(uint8image);
else
 error('input image must be double');
end
end



结果为:

No comments :

Post a Comment