图像旋转

  

clear;
clc;
imagDat=imread('t3','bmp');
imagGray=rgb2gray(imagDat);%注意这里需要转换成灰度图像
[row column]=size(imagGray);
angle=25;

Angle=25;%用于matlab中自带图像旋转函数的角度参数
angle=pi*angle/180;%用于可代码的角度参数    注意这里代入的是以弧度为单位的角度值
  cosa=cos(angle);  
  sina=sin(angle);
  %计算源图像旋转后要显示的区域  
  Wold=row;Hold=column;
  SrcX1=(-0.5*Wold);  
  SrcY1=(0.5*Hold);  
  SrcX2=(0.5*Wold);  
  SrcY2=(0.5*Hold);  
  SrcX3=(-0.5*Wold);  
  SrcY3=(-0.5*Hold);  
  SrcX4=(0.5*Wold);  
  SrcY4=(-0.5*Hold);
 
    %新图像对应数值  
  DstX1=cosa*SrcX1+sina*SrcY1;  
  DstY1=-sina*SrcX1+cosa*SrcY1;  
  DstX2=cosa*SrcX2+sina*SrcY2;  
  DstY2=-sina*SrcX2+cosa*SrcY2;  
  DstX3=cosa*SrcX3+sina*SrcY3;  
  DstY3=-sina*SrcX3+cosa*SrcY3;  
  DstX4=cosa*SrcX4+sina*SrcY4;  
  DstY4=-sina*SrcX4+cosa*SrcY4; 
 
  %新图像的宽高  
  Wnew   =   fix(max(abs(DstX4-DstX1),abs(DstX3-DstX2)));  
  Hnew   =   fix(max(abs(DstY4-DstY1),abs(DstY3-DstY2)));  
  num1   =  -0.5*Wnew*cosa-0.5*Hnew*sina+0.5*Wold;  
  num2   =   0.5*Wnew*sina-0.5*Hnew*cosa+0.5*Hold;  
 
    %旋转操作  
  for y1=1:Hnew  
      for x1=1:Wnew  
      %得到横坐标和纵坐标在原图中的位置   注意这里是用已旋转的图像坐标(x1,y1)来计算其在原来图像中的坐标(x0,y0)

      %一开始写这个代码时  下面这个公式被一篇研究生毕业论文误导(现在研究生的水平真的是不行呀)   
      x0=   fix(x1*cosa+y1*sina+num1);  
      y0=   fix(-x1*sina+y1*cosa+num2);
        if x0>0  &&   x0<Wold   &&   y0>0   &&   y0<Hold   
            newImag(x1,y1)=imagGray(x0,y0);
        end
      end
  end
  figure
imshow(imagGray);
title('old');
figure
imshow(newImag);
title('newImag');

newImagB = imrotate(imagGray,Angle);%用matlab自带的旋转函数对比
figure
imshow(newImagB);
title('newImagB');

  

你可能感兴趣的:(图像)