1. 程式人生 > 實用技巧 >Matlab實現imresize函式功能

Matlab實現imresize函式功能

影象放縮

演算法分析

  1. 根據放縮倍數,開闢一個新矩陣存放放縮後的影象
  2. 利用雙線性插值公式, 計算新影象中的每個點映射回原影象中的灰度值(注意邊界處理)

雙線性插值程式碼

function outputimg = my_imresize(A,n)
%  A 是影象矩陣,n是放縮的倍數
% 返回值outputimg是一個放縮後的影象矩陣

if n <= 0
    error('縮放倍數n的值應該大於0!');
end

%四捨五入計算放大後圖像矩陣
[H,W,CH] = size(A);
DH = round(H * n);
DW = round(W * n);
outputimg = zeros(DH,DW,CH);

%利用雙線性插值公式,從新矩陣映射回原影象
for di = 1:DH
    for dj = 1:DW
        ii = di / n;jj = dj / n;
        i = floor(ii);j = floor(jj);
        u = ii - i;v = jj - j;
        i = i + 1;j = j + 1;
        %邊界處理
        if (i < 1)
            i = 1;
        end
        if (j < 1)
            j = 1;
        end
        if((i + 1) > H)
            i = H - 1;
        end
        if((j + 1) > W);
            j = W -1;
        end
        %線性插值公式
        outputimg(di,dj,:) = (1 - u) * (1 - v) * A(i,j,:) + (1 - u) * v * A(i,j + 1,:) 
        + u * (1 - v) * A(i + 1,j,:) + u * v * A(i + 1,j + 1,:);
    end
end

 %轉化成uint8才能正常顯示
outputimg = uint8(outputimg); 

實驗結果

灰度圖放大2倍

%呼叫示例:
A = imread('cameraman.tif');
B = my_imresize(A,2);
figure,imshow(A),title('原圖');
figure,imshow(B),title('放大兩倍後的影象');


彩色圖縮小1/2

 % 呼叫示例:
 A = imread('pears.png');
 B = my_imresize(A,0.5);
 figure,imshow(A),title('原圖');
 figure,imshow(B),title('縮小1/2後的影象');

實驗分析

  • 計算新的影象在原圖上對應的位置,而不是原圖對應到新圖的位置

  • 為這些位置賦相應的灰度值,考慮求得的位置是整數或者不是整數。原影象中只有整數點座標的畫素值,但是放縮後的影象的座標包含小數,像(66.7,66.7)這個位置在原影象中是不存在的,這時候可以採用插值來給這個位置賦值,所以實際是將放大後的影象矩陣,壓縮到原圖中找到值

  • 對邊界越界的處理,當超過邊界的座標都變成邊界座標

  • 輸出要記得將資料型別改為uint8

  • 彩色影象可以看成三張單通道的灰度圖的組合,每一個通道都和灰度影象的放縮同樣處理,在Matlab中可以直接用以下形式:A(i,j,:) 處理