山东大学 数字图像处理 实验二

实验2.1:图像缩放

实现一个图像缩放函数,可以对输入图像进行任意倍数的缩放;
采用双线性插值进行重采样;
X,Y方向的缩放倍数参函数参数的形式传入;
可以只考虑输入图像为3通道,8位深度的情况;
不能调用图像处理库的缩放函数来完成;

线性变换是根据长度比例来推断一个函数值,双线性变换只是增加了维度。变换过程大抵如何,首先根据缩放比例选择合适的矩阵容纳新图像,遍历新图像的每个坐标,根据比例找到此坐标在原图中对应的坐标,一般情况都不是整数,这里需要注意变换。然后以此坐标的上下左右4个点作为基准,根据双线性变换计算出此点的RGB值。需要注意的是,如何此点对应的点如果是边界的情况,就只需要做线性变换即可,在计算坐标过程中,需采用16位整数,8位的不足以表示所有坐标。

在这里插入图片描述
在这里插入图片描述

Code

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);

            

实验2.2:图像变形

记[x’, y’]=f([x, y])为像素坐标的一个映射,实现f所表示的图像形变。f的逆映射为:
在这里插入图片描述
提示:只需要找出原图与新图像的坐标对应关系既可以

结果图:
在这里插入图片描述

Code

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
发布了31 篇原创文章 · 获赞 0 · 访问量 325

猜你喜欢

转载自blog.csdn.net/qq_36360463/article/details/104208567