圖像縮放

最鄰近插值

和matlab自帶函數完全一樣。

function nI = Nearest_Neighbor(I, ratio)

% 將原圖像 I 以 1:ratio 的倍率縮放得到目標圖像 nI
% 插值方法爲 最臨近插值

[n m mm] = size(I);
new_n = round(n * ratio);
new_m = round(m * ratio);
nI = zeros(new_n, new_m, mm, 'uint8');

for i = 1 : new_n
    for j = 1  : new_m
        x = (j-0.5) / new_m * m + 0.5;
        y = (i-0.5) / new_n * n + 0.5;
        nI(i, j, :) = I(round(y), round(x), :);
    end
end

雙線性插值

和matlab自帶函數有最多爲1的誤差,感覺是由於matlab進行了優化,沒有進行浮點數運算導致的誤差。

function nI = Bilinear_Interpolation(I, ratio)

% 將原圖像 I 以 1:ratio 的倍率縮放得到目標圖像 nI
% 插值方法爲 雙線性插值

[n m mm] = size(I);
new_n = round(n * ratio);
new_m = round(m * ratio);
nI = zeros(new_n, new_m, mm, 'uint8');

I = [I(1,:,:); I; I(end,:,:)];
I = [I(:,1,:), I, I(:,end,:)];
I = double(I);

for i = 1 : new_n
    for j = 1  : new_m
        x = (j-0.5) / new_m * m + 1.5;
        y = (i-0.5) / new_n * n + 1.5;
        r1 = floor(y); r2 = ceil(y);
        c1 = floor(x); c2 = ceil(x);
        Q11 = I(r1, c1, :); Q12 = I(r1, c2, :);
        Q21 = I(r2, c1, :); Q22 = I(r2, c2, :);
        R1 = Q11 + (Q12-Q11)*(x-c1);
        R2 = Q21 + (Q22-Q21)*(x-c1);
        nI(i, j, :) = uint8(R1 + (R2-R1)*(y-r1));
    end
end

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章