1. 程式人生 > >雙線性插值(Matlab實現)

雙線性插值(Matlab實現)

、實現

1.  實驗平臺與資料

本演算法使用Matlab語言實現,實驗平臺為Windows 8 32位作業系統、4GB記憶體(可用為2.31GB)、Matlab2013b。

資料1: 大小為:256*256 的lena灰度影象,將使用實現的演算法對其進行2倍放大操作,如下圖1所示:


圖1 灰度影象lena.png

資料2:大小為:670*502 的彩色RGB影象,將使用實現的演算法對其進行2倍縮小操作,如下圖1所示:

圖2 彩色RGB影象he.jpeg

2.  實驗程式原始碼

imblizoom.m檔案原始碼

function [ ZI ] = imblizoom( I,zmf )

%----------------------雙線性插值法縮放矩陣或影象---------------------------

% Input

%       I:影象檔名矩陣(整數值(0~255))

%       zmf:縮放因子,即縮放的倍數

% Output

%       縮放後的影象矩陣 ZI

% Usage:

%       ZI = SSELMHSIC('ImageFileName',zmf)

%       影象I進行zmf倍的縮放並顯示

%    Or:

%       ZI = SSELMHSIC(I,zmf)

%       矩陣I進行

zmf倍的縮放並顯示

%    ...

%-------------------------------------------------------------------

    %%%%    Authors:   Zhi Liu

    %%%%    XiDian University Student

    %%%%    EMAIL:     [email protected]

    %%%%    DATE:      16-12-2013

%% Step1 對資料進行預處理

if ~exist('I','var') || isempty(I)

    error('

輸入影象 I未定義為空');

end

if ~exist('zmf','var') || isempty(zmf) || numel(zmf) ~= 1

     error('位移向量 zmf未定義為空 zmf中的元素超過2');

end

if isstr(I)

    [I,M] = imread(I);

end

if zmf <= 0

     error('縮放倍數 zmf的值應該大於0');

end

%% Step2 通過原始影象和縮放因子得到新影象的大小並建立新影象。

[IH,IW,ID] = size(I);

ZIH = round(IH*zmf); 計算縮放後的影象高度最近取整

ZIW = round(IW*zmf); 計算縮放後的影象寬度最近取整

ZI = zeros(ZIH,ZIW,ID); 建立新影象

%% Step3 擴充套件矩陣I邊緣

IT = zeros(IH+2,IW+2,ID);

IT(2:IH+1,2:IW+1,:) = I;

IT(1,2:IW+1,:)=I(1,:,:);IT(IH+2,2:IW+1,:)=I(IH,:,:);

IT(2:IH+1,1,:)=I(:,1,:);IT(2:IH+1,IW+2,:)=I(:,IW,:);

IT(1,1,:) = I(1,1,:);IT(1,IW+2,:) = I(1,IW,:);

IT(IH+2,1,:) = I(IH,1,:);IT(IH+2,IW+2,:) = I(IH,IW,:);

%% Step4 由新影象的某個畫素zizj對映到原始影象(iijj)並插值。

for zj = 1:ZIW         對影象進行按列逐元素掃描

    for zi = 1:ZIH

        ii = (zi-1)/zmf; jj = (zj-1)/zmf;

        i = floor(ii); j = floor(jj); 向下取整

        u = ii - i; v = jj - j;

        i = i + 1; j = j + 1;

        ZI(zi,zj,:) = (1-u)*(1-v)*IT(i,j,:) +(1-u)*v*IT(i,j+1,:)...

                    + u*(1-v)*IT(i+1,j,:) +u*v*IT(i+1,j+1,:);

    end

end

ZI = uint8(ZI);

%% 以影象的形式顯示同現矩陣P

figure

imshow(I,M);

axis on

title(['原影象大小 ',num2str(IH),'*',num2str(IW),'*',num2str(ID),')']);

figure

imshow(ZI,M);

axis on

title(['縮放後的影象大小 ',num2str(ZIH),'*',num2str(ZIW),'*',num2str(ID)',')']);

end 

3.  實驗結果

1) 資料1

在命令視窗輸入imblizoom('lena.png', 2);回車後結果如下圖3和下圖4所示:


圖3 lena.png的執行結果1(原圖)


圖4 lena.png的執行結果2(放大2倍後的圖)

 2)資料2


圖5 he.jpeg執行結果1(原圖)


圖6 he.jpeg執行結果2(縮小2倍後的影象)

由圖3~圖6可知,程式正確無誤,放大縮小後的效果都很好。程式的用法及其它功能,請檢視程式碼註釋。