实验要求:实现一个图像缩放函数,可以对输入图像进行任意倍数的缩放;
1.采用双线性插值进行重采样;
2.X,Y方向的缩放倍数参函数参数的形式传入;
3.可以只考虑输入图像为3通道,8位深度的情况;
4.不能调用图像处理库的缩放函数来完成;
RGB = imread('H:/数字图像处理/ipe_data/009.jpg'); R = RGB(:,:,1); G = RGB(:,:,2); B = RGB(:,:,3); [nrows,ncols,ncoms]=size(RGB); % Next line is the scale-factor,the range is 1.0-9.0 K1 = str2double(inputdlg('请输入行缩放倍数', 'INPUT scale factor', 1, {'0.5'}));%行默认变为原来的0.5倍 K2 = str2double(inputdlg('请输入列缩放倍数', 'INPUT scale factor', 1, {'0.4'}));%列默认变为原来的0.4倍 width = K1 * ncols; height = K2 * nrows; OUT = uint8(zeros(height,width,ncoms)); RR = uint8(zeros(height,width)); GG = uint8(zeros(height,width)); BB = uint8(zeros(height,width)); % width scalor and height scalor widthScale = ncols/width; heightScale = nrows/height; % bilinear interpolate for y = 1:height for x =1:width % this index range is to avoid exceeding the permitted matrix index xx = x * widthScale; % xx and yy are the source ordinate,while x and y are the destinate ordinate yy = y * heightScale; if (xx <= 1) xx = 1; end if (xx > ncols-1) xx = ncols-1; end if (yy <= 1) yy = 1; end if (yy > nrows-1) yy = nrows-1; end if (xx/double(uint16(xx)) == 1.0) && (yy/double(uint16(yy)) == 1.0) % if a and b is integer,then J(x,y) <- I(x,y) RR(y,x) = R(int16(yy),int16(xx)); GG(y,x) = G(int16(yy),int16(xx)); BB(y,x) = B(int16(yy),int16(xx)); else % a or b is not integer a = double(uint16(yy)); % (a,b) is the base-dot b = double(uint16(xx)); r11 = double(R(a,b)); r12 = double(R(a,b+1)); r21 = double(R(a+1,b)); r22 = double(R(a+1,b+1)); RR(y,x) = uint8( (b+1-xx) * ((yy-a)*r21 + (a+1-yy)*r11) + (xx-b) * ((yy-a)*r22 +(a+1-yy) * r12) ); g11 = double(G(a,b)); g12 = double(G(a,b+1)); g21 = double(G(a+1,b)); g22 = double(G(a+1,b+1)); GG(y,x) = uint8( (b+1-xx) * ((yy-a)*g21 + (a+1-yy)*g11) + (xx-b) * ((yy-a)*g22 +(a+1-yy) * g12) ); b11 = double(B(a,b)); b12 = double(B(a,b+1)); b21 = double(B(a+1,b)); b22 = double(B(a+1,b+1)); BB(y,x) = uint8( (b+1-xx) * ((yy-a)*b21 + (a+1-yy)*b11) + (xx-b) * ((yy-a)*b22 +(a+1-yy) * b12) ); end end end OUT(:,:,1) = RR; OUT(:,:,2) = GG; OUT(:,:,3) = BB; imshow(RGB),title('原图'); figure; imshow(OUT),title('修改图');