1. 程式人生 > >MATLAB小波影象分解

MATLAB小波影象分解

上一篇文章中我們實現了小波的一維、二維訊號分解與重構,其中的二維訊號分解與重構,只要稍作修改,就可以實現影象的分解和重構了。修改的工作,主要是對影象訊號進行規範化處理、資料格式轉換和繪圖細節處理等。

       簡單起見,我們從黑白(灰度)影象的分解、重構說起,因為彩色影象的處理要複雜一點。在本文中,我們使用著名的Lena圖作為原始影象。

圖1

首先,為了實現影象的N層分解,對一幅m行n列的黑白影象,我們要對其進行規範化處理,使其能被2的N次方整除。以下的modmat() 函式實現此功能:

function y=modmat(x,dim)
% 函式 MODMAT() 對輸入矩陣x進行規範化,使其行列數均能被 2^dim 整除
% 輸入引數:x —— r*c 維矩陣;
%           dim —— 矩陣重構的維數
% 輸出引數:y —— rt*ct 維矩陣,mod(rt,2^dim)=0,mod(ct,2^dim)=0

[row,col]=size(x);          % 求出輸入矩陣的行列數row,col
rt=row - mod(row,2^dim);    % 將row,col分別減去本身模 2^dim 得到的數
ct=col - mod(col,2^dim);    % 所得的差為rt、ct,均能被 2^dim 整除
y=x(1:rt,1:ct);             % 輸出矩陣 y 為輸入矩陣 x 的 rt*ct 維子矩陣

然後,將規範化後的影象的資料格式由適合顯示影象的uint8格式轉換為適合數值處理的double格式,再呼叫二維小波分解函式進行影象分解,最後為了清晰地顯示分解影象的塔式結構,在影象的相應區域繪製若干分界線。具體程式如下:

function y=mywavedec2(x,dim)
% 函式 MYWAVEDEC2() 對輸入矩陣 x 進行 dim 層分解,得到相應的分解係數矩陣 y
% 輸入引數:x —— 輸入矩陣;
%           dim —— 分解層數。
% 輸出引數:y —— 分解係數矩陣。

x=modmat(x,dim);            % 首先規範化輸入矩陣,使其行列數均能被 2^dim 整除

subplot(121);imshow(x);title('原始影象');   % 畫出規範化後的源影象
[m,n]=size(x);              % 求出規範化矩陣x的行列數
xd=double(x);               % 將矩陣x的資料格式轉換為適合數值處理的double格式

for i=1:dim
    xd=modmat(xd,1);
    [dLL,dHL,dLH,dHH]=mydwt2(xd);   % 矩陣小波分解
    tmp=[dLL,dHL;dLH,dHH];          % 將分解係數存入快取矩陣
    xd=dLL;                         % 將快取矩陣左上角部分的子矩陣作為下一層分解的源矩陣
    [row,col]=size(tmp);            % 求出快取矩陣的行列數
    y(1:row,1:col)=tmp;             % 將快取矩陣存入輸出矩陣的相應行列
end

yd=uint8(y);            % 將輸出矩陣的資料格式轉換為適合顯示影象的uint8格式
for i=1:dim             % 對矩陣 yd 進行分界線處理,畫出分解影象的分界線
    m=m-mod(m,2);
    n=n-mod(n,2);
    yd(m/2,1:n)=255;
    yd(1:m,n/2)=255;
    m=m/2;n=n/2;
end
subplot(122);imshow(yd);title([ num2str(dim) ' 維小波分解影象']);

       上述的影象分解程式,其輸出資料是double格式的,以便作為重構程式的輸入。