MATLAB 图像几何变换

  • 实验目的

– 掌握图像几何变换的原理

– 掌握图像缩放的方法

– 掌握图像旋转的方法

– 掌握图像镜像的方法

– 掌握图像平移的方法

  • 实验原理
  • 图像缩放

图像的放大收缩,拿放大举例,就是拿更多的像素去表达原来的图像,但是图像整体不变,通俗一点就是,原来一个特征点,需要10个像素表示,放大就是现在我们用20个或者更多来表示这个特征点,填值的方法有很多,邻值插值,线性插值等。

2、图像旋转

图像的旋转就是将图像中的所有像素整体旋转,即本质就是对每个像素进行旋转。对一个像素进行旋转,可以看出向量的旋转,利用向量旋转公式,得到旋转矩阵。当然,旋转之后,虽然图像的大小的不会变化的,但是便于我们坐标的选取,我们会计算出一个新的坐标系,所以这里两个过程,两个坐标系中坐标的相互转换,得到两个转换矩阵,这样一来,对于一个像素点,只需要对它进行相应的矩阵操作即可得到旋转之后的点坐标。当然,对于一些得到的映射点不是整数的情况下,我们可以按照要求进行取整或者插值操作即可。

3、图像的水平和垂直镜像

对像素矩阵进行水平转置和对垂直方向进行线性变换。

4、图像的平移

改变图像的横纵坐标值

三、实验环境

    –Windows XP/ Windows 7

–Matlab 7.0.1/ Matlab R2008

四、实验内容与步骤

– 读取并显示一幅灰度图像(如果用的是彩色图像,可用rgb2gray()函数将彩色图像转换为灰度图像);

– 对原图像进行缩放操作,调整缩放参数,将图像缩放至不同大小,放大图像时分别采用最近邻插值法和双线性插值法进行插值,记录不同结果;

  1. 最近临插值法

function[Q] = sf(n)

P = imread('moon.tif');

figure,imshow(P);

title('原图像');

P = double(P);

Pkg=size(P);

Ph=Pkg(:,1);

Pw=Pkg(:,2);

Intw=round(Pw * n);

Inth=round(Ph * n);

Q=zeros(Inth,Intw);

for i=1:Inth

    for j=1:Intw

        x=round(i/n);

        y=round(j/n);

       

        if(x < 1)

            x = 1;

        end

        if(x > Ph)

            x = Ph;

        end

        if(y < 1)

            y = 1;

        end

        if(y > Pw)

            y = Pw;

        end

        Q(i,j)=P(x,y);

    end

end

figure,imshow(uint8(Q));

title(‘输出图像’);

end

MATLAB 图像几何变换_第1张图片

2、 双线性插值

在最近邻插值时,对于源图中坐标为浮点数的点,直接四舍五入取整带来了严重的失真。比如0.75直接取1,更科学的方法是,0.75距离1为0.25,距离0为0.75,按照距离的占比取相应点像素值的找比。

function A = imscale(B,S)   %定义缩放函数,B为源图像,A为目标图像,S为缩放倍数

[r,c] = size(B);

nr= round(r*S);             %根据放大倍数乘原行数的结果,取其四舍五入的值作为新的行

nc= round(c*S);             %根据放大倍数乘原列数的结果,取其四舍五入的值作为新的列

A = zeros(nr,nc);           %用新的行列生成目标图像矩阵

SB = zeros(r+1,c+1);        %新建一个矩阵SB,大小在B的基础上行列都加1

SB(2:r+1,2:c+1)=B;

SB(2:r+1,1)=B(:,1);

SB(1,2:c+1)=B(1,:);

SB(1,1)=B(1,1);

     for Ai=1:nr

        for Aj=1:nc

         Bi=(Ai-1)/S;        

         Bj=(Aj-1)/S;      

         i=fix(Bi);       

         j=fix(Bj);       

         u=Bi-i;           

         v=Bj-j;        

         i=i+1;           

         j=j+1;    

         A(Ai,Aj)=(1-u)*(1-v)*SB(i,j)+u*v*SB(i+1,j+1)+u*(1-v)*SB(i+1,j)+(1-u)*v*SB(i,j+1);

        end 

    end

end

I=imread('moon.tif');

figure,imshow(I);

Dst=imscale(I,1.5);        %调用imscale()函数

figure,imshow(uint8(Dst));

imwrite(Dst,'ims1.5.jpg'); 

– 对原图像进行旋转操作,调整角度参数,分别采用最近邻插值法和双线性插值法进行插值,记录不同结果;

将图像向左旋转45度:

img = imread('moon.tif');

figure;

imshow(img);

title('原图');

[row col ch] = size(img);

d = [row col]/2;

x = pi/4;

R = [cos(x), -sin(x)

    sin(x), cos(x)];

R = R';

cc = ceil(row*sin(x)+col*cos(x));   

rr = ceil(row*cos(x)+col*sin(x));

dd = [rr cc]/2;

img2 = uint8(zeros(rr,cc,ch));

for k = 1:ch

    for i = 1:rr

       for j = 1:cc

          p = [i;j];

          pp = (R*(p-dd)+d); 

          mn = floor(pp); 

          x = pp(1);

          y = pp(2);

          m = mn(1);

          n = mn(2);

          if m>=1 && m=1 && n

              if x-m <= 0.5

                        x = m;

              else

                        x = m+1;

              end

              if y-n <= 0.5

                        y = n;

              else

                        y = n+1;

              end                   

            img2(i,j,k) = img(x,y,k);

          end

       end

    end

end

figure;

imshow(img2);

title('旋转45度结果');

MATLAB 图像几何变换_第2张图片

MATLAB 图像几何变换_第3张图片

– 对原图像进行水平镜像和垂直镜像操作;

I=imread('moon.tif');

[M,N]=size(I);

I_x=I;

for i=1:M

    for j=1:N

        I_x(i,j)=I(i,N-j+1);

    end

end

subplot(2,2,1);

imshow(I);

subplot(2,2,2);

imshow(I_x);

I_y=I;

for i=1:M

    for j=1:N

        I_y(i,j)=I(M-i+1,j);

    end

end

subplot(2,2,3);

imshow(I_y);

MATLAB 图像几何变换_第4张图片

– 自己编写一段程序,实现对图像的平移操作,调整平移参数,记录不同实验结果。

将moon图像向左上角平移50

I=imread('moon.tif');

figure,imshow(I);                 

[r,c]=size(I);                     

dst=zeros(r,c);                   

dx=-50;                              

dy=-50;                             

tras=[1 0 dx;0 1 dy;0 0 1];       

for i=1:r

    for j=1:c

        temp=[i;j;1];             

        temp=tras*temp;           

        x=temp(1,1);             

        y=temp(2,1);                

        if(x>=1&&x<=r)&&(y>=1&&y<=c)

            dst(x,y)=I(i,j);

        end

    end

end

figure,imshow(uint8(dst));

MATLAB 图像几何变换_第5张图片

通过改变dx和dy的值可以实现各种平移操作:

向左下角平移80:

MATLAB 图像几何变换_第6张图片

垂直向下平移100:

MATLAB 图像几何变换_第7张图片

水平向右平移150:

MATLAB 图像几何变换_第8张图片

六、实验心得与体会

   通过本次实验对图像进行各种几何变化,对原始图像按照需要产生大小、形状和位置的变化包括缩放、旋转、水平和垂直镜像以及平移。感受到了图像处理是通过矩阵的变化实现的,将课本上的理论和实际结合起来,加深了对课堂所学的理解。

  对于matlab的使用更加熟练,提高了自己的动手能力,在调节图像的过程之中,遇到了很多困难,通过查阅丰富了很多理论知识,收获颇丰,希望在今后的学习中能够更加熟练。

你可能感兴趣的:(matlab,开发语言,图像处理)