本文是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