function imblizoom=imblizoom( original,zmf )
% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %
%-----------------双线性插值法缩放矩阵或图像---------------------
% Input:
% original:原始图像图像文件名或矩阵(整数值(0~255))
% zmf:缩放因子,即缩放的倍数
% Output:
% original: 原始图像矩阵
% new_img: 缩放后的图像矩阵
% Usage:
% [original,new_img] = imblizoom('ImageFileName',zmf)
% 对图像I进行zmf倍的缩放
% Or:
% [original,new_img] = imblizoom(I,zmf)
% 对矩阵I进行zmf倍的缩放
% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %
%% Step1 对数据进行预处理
if ~exist('original','var') || isempty(original)
error('输入图像 I未定义或为空!');
end
if ~exist('zmf','var') || isempty(zmf) || numel(zmf) ~= 1
error('位移矢量 zmf未定义或为空或 zmf中的元素超过2!');
end
if isstr(original)
[original,M] = imread(original);
end
if zmf <= 0
error('缩放倍数 zmf的值应该大于0!');
end
%% Step2 通过原始图像和缩放因子得到新图像的大小,并创建新图像
[height,width,channel] = size(original);
new_height = round(height*zmf); % 计算缩放后的图像高度,最近取整
new_width = round(width*zmf); % 计算缩放后的图像宽度,最近取整
new_img = zeros(new_height,new_width,channel); % 创建新图像
%% Step3 扩展原始矩阵I边缘
img_scale = zeros(height+2,width+2,channel); % 为了边界点考虑的
img_scale(2:height+1,2:width+1,:) = original;
% % ========================================================
% 为4周各添加的一行或列做值的初始化
% % =========================================================
% 为扩展而来的各边赋值
img_scale(1,2:width+1,:) = original(1,:,:);
img_scale(height+2,2:width+1,:) = original(height,:,:);
img_scale(2:height+1,1,:) = original(:,1,:);
img_scale(2:height+1,width+2,:) = original(:,width,:);
% 用原图的4个顶点为扩展而来的4个顶点赋值
img_scale(1,1,:) = original(1,1,:);
img_scale(1,width+2,:) = original(1,width,:);
img_scale(height+2,1,:) = original(height,1,:);
img_scale(height+2,width+2,:) = original(height,width,:);
%% ============================================================
% Step4 由新图像的某个像素(zi,zj)映射到原始图像(ii,jj)处, 并在原始
% 图像的(ii,jj)位置利用其周围4个像素点进行插值得到(ii,jj)处的像素值
% % ====================================================================
for zj = 1:new_width % 对图像进行按列逐元素扫描
for zi = 1:new_height
% (zi,zj)表示在新图中的坐标,(ii,jj)表示在原图中的坐标
% 注意:(ii,jj)不一定是整数
ii = (zi-1)/zmf; jj = (zj-1)/zmf;
i = floor(ii); j = floor(jj); % 向下取整得到在原图中坐标的整数部分
u = ii - i; v = jj - j; % 得到在原图中坐标的小数部分
i = i + 1; j = j + 1;
new_img(zi,zj,:) = (1-u)*(1-v)*img_scale(i,j,:) + u*(1-v)*img_scale(i,j+1,:)...
+ (1-u)*v*img_scale(i+1,j,:) + u*v*img_scale(i+1,j+1,:);
end
end
new_img = uint8(new_img);
figure;
imshow(new_img);
imwrite(new_img,'C:\Users\10594\Desktop\new_filename_imblizoom.jpg');
end