function shrink_zoom_21(varargin)
% ----------------------------------------------------------------
% ------ Shrinking or zooming images by bilinear interpolation
% ------ treating a single image
%
% Copyright by: Zhiming Li, College of Science, Tianjin University
% or Center for Applied Mathematics fo Tianjin University
% Email: lizm@tju.edu.cn
% Date: 15 May, 2013
imname = '% F:\Workdata\images\001.bmp';
im = imread(imname);
[m n] = size(im); % for intensity image
% [m n h] = size(im); % for color image
switch nargin
case 1
ratio = varargin{1};
mm = round(m*ratio);
nn = round(n*ratio);
case 2
mm = varargin{1};
nn = varargin{2};
otherwise
error('INPUT variable are not suitable .');
end
newim = zeros(mm,nn); % for intensity image
% newim = zeros(mm,nn,h); % for color image
row = 1:(m-1)/(mm-1):m;
col = 1:(n-1)/(nn-1):n;
for i = 1:mm
for j = 1:nn
x = row(i); y = col(j);
fx = floor(x); cx = ceil(x); rx = round(x);
fy = floor(y); cy = ceil(y); ry = round(y);
if (abs(x-rx) < 1e-6) && (abs(y-ry) < 1e-6)
% newim(i,j) = im(rx,ry); % for intensity image
newim(i,j,:) = im(rx,ry,:); % for color image
else
tx = x - fx; ty = y - fy;
w1 = (1 - tx) * (1 - ty);
w2 = tx * (1 - ty);
w3 = (1 - tx) * ty ;
w4 = tx * ty ;
newim(i,j) = w1 * im(fx,fy) + w2 * im(cx,fy) + ...
w3 * im(fx,cy) + w4 * im(cx,cy); % for intensity image
% newim(i,j,:) = w1 * im(fx,fy,:) + w2 * im(cx,fy,:) + ...
% w3 * im(fx,cy,:) + w4 * im(cx,cy,:); % for color image
end
end
end
newim = uint8(newim);
imshow(newim);
imwrite(newim,'F:\Workdata\newimages\001.bmp');