实现一个图像缩放函数,可以对输入图像进行任意倍数的缩放;
采用双线性插值进行重采样;
X,Y方向的缩放倍数参函数参数的形式传入;
可以只考虑输入图像为3通道,8位深度的情况;
不能调用图像处理库的缩放函数来完成;
线性变换是根据长度比例来推断一个函数值,双线性变换只是增加了维度。变换过程大抵如何,首先根据缩放比例选择合适的矩阵容纳新图像,遍历新图像的每个坐标,根据比例找到此坐标在原图中对应的坐标,一般情况都不是整数,这里需要注意变换。然后以此坐标的上下左右4个点作为基准,根据双线性变换计算出此点的RGB值。需要注意的是,如何此点对应的点如果是边界的情况,就只需要做线性变换即可,在计算坐标过程中,需采用16位整数,8位的不足以表示所有坐标。
function [newImg]=test2_1(img,a,b)
[m,n,~]=size(img);
newm=a*m;
newn=b*n;
newm=uint16(newm);
newn=uint16(newn);
newImg(1:newm,1:newn,:)=0;
img=double(img);
newImg=double(newImg);
disp(n);
for i=1:newm
for j=1:newn
x=double(i)/a;
y=double(j)/b;
if(x>m)
x=m;
end
if(y>n)
y=n;
end
if(y<1)
y=1;
end
if(x<1)
x=1;
end
x2=floor(x);
y2=floor(y);
if (x==1&&y==1)||(x==m&&y==n)||(x==1&&y==n)||(x==m&&y==1)
newImg(i,j,1)=img(x,y,1);
newImg(i,j,2)=img(x,y,2);
newImg(i,j,3)=img(x,y,3);
elseif (x==1||x==m)&&(y~=1||y~=n)
newImg(i,j,1)=img(x2,y2,1)-(img(x2,y2,1)-img(x2,y2+1,1))*(y2-y);
newImg(i,j,2)=img(x2,y2,2)-(img(x2,y2,2)-img(x2,y2+1,2))*(y2-y);
newImg(i,j,3)=img(x2,y2,3)-(img(x2,y2,3)-img(x2,y2+1,3))*(y2-y);
elseif (x~=1||x~=m)&&(y==1||y==n)
newImg(i,j,1)=img(x2,y2,1)-(img(x2,y2,1)-img(x2+1,y2,1))*(x2-x);
newImg(i,j,2)=img(x2,y2,2)-(img(x2,y2,2)-img(x2+1,y2,2))*(x2-x);
newImg(i,j,3)=img(x2,y2,3)-(img(x2,y2,3)-img(x2+1,y2,3))*(x2-x);
elseif x~=1&&x~=m&&y~=1&&y~=n
newImg(i,j,1)=(img(x2+1,y2,1)-img(x2,y2,1))*(x-x2)+(img(x2,y2+1,1)-img(x2,y2,1))*(y-y2)+(img(x2+1,y2+1,1)+img(x2,y2,1)-img(x2,y2+1,1)-img(x2+1,y2,1))*(x-x2)*(y-y2)+img(x2,y2,1);
newImg(i,j,2)=(img(x2+1,y2,2)-img(x2,y2,2))*(x-x2)+(img(x2,y2+1,2)-img(x2,y2,2))*(y-y2)+(img(x2+1,y2+1,2)+img(x2,y2,2)-img(x2,y2+1,2)-img(x2+1,y2,2))*(x-x2)*(y-y2)+img(x2,y2,2);
newImg(i,j,3)=(img(x2+1,y2,3)-img(x2,y2,3))*(x-x2)+(img(x2,y2+1,3)-img(x2,y2,3))*(y-y2)+(img(x2+1,y2+1,3)+img(x2,y2,3)-img(x2,y2+1,3)-img(x2+1,y2,3))*(x-x2)*(y-y2)+img(x2,y2,3);
%newImg(i,j,1)=img(x,y,1);
%newImg(i,j,2)=img(x,y,2);
%newImg(i,j,3)=img(x,y,3);
end
end
end
newImg=uint8(newImg);
img=uint8(img);
figure;imshow(img);
figure;imshow(newImg);
记[x’, y’]=f([x, y])为像素坐标的一个映射,实现f所表示的图像形变。f的逆映射为:
提示:只需要找出原图与新图像的坐标对应关系既可以
function test2_2(input_img)
I=input_img;
[width,height,~] = size(I);
output_img(1:width,1:height,:)=0;
for i = 1:width-1
for j = 1:height-1
tempx = (i-0.5*width)/(0.5*width);
tempy = (j-0.5*height)/(0.5*height);
r = sqrt(tempx^2 + tempy^2);
angle = (1-r)^2;
if r >= 1
x = tempx;
y = tempy;
else
x = cos(angle)*tempx - sin(angle)*tempy;
y = sin(angle)*tempx + cos(angle)*tempy;
end
old_x = uint16((x + 1)*0.5*width);
old_y = uint16((y + 1)*0.5*height);
output_img(i,j,1) = input_img(old_x,old_y,1);
output_img(i,j,2) = input_img(old_x,old_y,2);
output_img(i,j,3) = input_img(old_x,old_y,3);
end
end
output_img=uint8(output_img);
imshow(output_img);
end