天天看點

Matlab 圖像幾何變換 雙線性插值

本文是matlab圖像幾何變換中的一個執行個體 —— 縮放變換 + 雙線性插值

1. 圖像變換的原理:先确定映射關系 再 進行映射插值

2. 雙線性插值時注意:邊緣點的處理,否則會超過原圖像索引報錯

function new_img = zoom_bilinear(filename,s_x,s_y)
% 圖像縮放變換 雙線性插值
% 輸入:
%       img 灰白圖像(彩色要多一個color次元或轉化為灰階圖)
%       s_x  x方向上的比例系數
%       s_y  y方向上的比例系數
% 輸出:
%       縮放後的新圖像
%% 雙線性插值注意點:
 % 雙線性插值需要注意對圖像四個邊緣的處理,否則會超出矩陣索引,因為映射矩陣
 % 中有x+1 y+1,是以圖像下邊緣 和 右邊緣 處理時很容易超出原圖矩陣索引
 %%
img = imread(filename);
img = rgb2gray(img);
[m,n] = size(img);
row = round(m * s_x);
col = round(n * s_y);
new_img = ones(row,col);
T1 = [s_x,0,0;0,s_y,0;0,0,1];   % 對應的比例系數矩陣
for i=1:row
    for j=1:col 
        p = floor([i,j,1]*T1^-1); % 由P_new = P_old*T 可得:P_old = P_new*(T^-1)
        x = p(1); % 把p裡面元素指派給x y,便于後續了解
        y = p(2);
        q = [i,j,1]*T1^-1;
        u = q(1) - x; % 計算出水準方向權重
        v = q(2) - y; % 計算豎直方向權重
        if x == 0   % 防止x,y等于0,找不到矩陣索引報錯。屬于對圖像左 上邊緣的處理
            x = x+1;
        end
        if y == 0
            y = y+1;
        end
        % 本例對圖像右邊緣及下邊緣用最近鄰插值計算
        if x>0 && x<= m-1 && y>0 && y<= n-1
            new_img(i,j) = u*v*img(x,y)+(1-u)*v*img(x+1,y)+u*(1-v)*img(x,y+1)+(1-u)*(1-v)*img(x+1,y+1);
        else
            new_img(i,j) = img(x,y);
        end
    end
end

% 顯示原圖
figure(1);
imshow(img,[]);title('原圖');
% 顯示縮放後的圖
figure(2);
imshow(new_img,[]);title('雙線性');

end
           

參考文獻:https://blog.csdn.net/Effend/article/details/82870144

          https://blog.csdn.net/MrCharles/article/details/53965933

繼續閱讀