天天看点

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

继续阅读