zoukankan      html  css  js  c++  java
  • 图像旋转的原理与实现

    图像旋转的原理与实现

    一般图像的旋转是以图像的中心为原点,旋转一定的角度,也就是将图像上的所有像素都旋转一个相同的角度。旋转后图像的的大小一般会改变,即可以把转出显示区域的图像截去,或者扩大图像范围来显示所有的图像。图像的旋转变换也可以用矩阵变换来表示。设点clip_image002[14]逆时针旋转clip_image004[14]角后的对应点为clip_image006[14]。那么,旋转前后点clip_image002[15]clip_image006[15]的坐标分别是:

    clip_image009[10]                          (3-6)

    clip_image011[10]  (3-7)

     

     

    写成矩阵表达式为

    clip_image013[10]            (3-8)

     

     

     

     

    其逆运算为

    clip_image015[10]            (3-9)

     

     

    利用上述方法进行图像旋转时需要注意如下两点:

    1)图像旋转之前,为了避免信息的丢失,一定要有坐标平移。

    2)图像旋转之后,会出现许多空洞点。对这些空洞点必须进行填充处理,否则画面效果不好,一般也称这种操作为插值处理。

    以上所讨论的旋转是绕坐标轴原点(0,0)进行的。如果图像旋转是绕一个指定点(a,b)旋转,则先要将坐标系平移到该点,再进行旋转,然后将旋转后的图象平移回原来的坐标原点,这实际上是图像的复合变换。如将一幅图像绕点(a,b)逆时针旋转clip_image004[15]度,首先将原点平移到(a,b),即

    clip_image018[10]                        (3-10)

    然后旋转

    clip_image020[10]                 (3-11)

    然后再平移回来

    clip_image022[10]                        (3-12)

     

    综上所述,变换矩阵为clip_image024[10]

    附录:

    B=imread('image1.bmp');
    %读取原图像
    [m,n]=size(B); %获取原图尺寸w
    %参数设置 
    theta = pi/4;  %旋转角度
    a = sin(theta);
    b = cos(theta);
    T = [cos(theta),sin(theta),;    %旋转矩阵
        -sin(theta),cos(theta)];
     
    %建立存储空间
    row=m+round((m)/2);
    col=n+round((n)/2);
    rotateima = zeros(row, col);  %存储旋转后图像的矩阵
     
    %图像旋转         
    for i=1:m                                       
        for j=1:n
            x=ceil(abs((i-round(m/2))*b-(j-round(n/2))*a+round(row/2)));  %坐标平移至中心
            y=ceil(abs((i-round(m/2))*a+(j-round(n/2))*b+round(col/2)));  %坐标平移至中心
            rotateima(x,y)=B(i,j);                   %未插值的图像
        end
    end
    nrotateima = uint8(rotateima);
    imshow(nrotateima);
    title('未插值的图像')
     
    %图像插值(近邻插值法)
    for i=1:row    
        for j=2:col-1       
                  
                if(rotateima(i,j) == 0 && rotateima(i,j-1) ~= 0 && rotateima(i,j+1) ~= 0 )       
                    rotateima(i,j) =rotateima(i,j-1) ;      
               
                end
        end
    end
     
    %图像显示
    figure(1);
    imshow(B)
    title('原始图像');
    % figure(2);
    % imshow(nrotateima);
    % title('未插值的图像');
    figure(3);
    imshow(rotateima/256);
    imwrite(rotateima/256, '旋转后图像.jpg', 'jpg');
    title('旋转图');
    

      

      

           

     

  • 相关阅读:
    忘记Linux用户密码怎么办?
    新建虚拟机并与XShell连接(配置网卡)
    虚拟机U盘挂载
    Linux 创建虚拟机,配置网卡,桥接,连接XShell
    C/C++产生随机数
    举例说明数据结构在网络技术领域和实际生活中的应用
    组合数学--容斥原理&鸽巢原理
    计算机组成原理-好文总结
    八大排序算法
    博客园自定义页面风格设计
  • 原文地址:https://www.cnblogs.com/hustlx/p/5245226.html
Copyright © 2011-2022 走看看