博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数字图像处理----图像旋转
阅读量:6276 次
发布时间:2019-06-22

本文共 3645 字,大约阅读时间需要 12 分钟。

注:旋转中心很重要 坐标系为像素,按照像素位置(第(m,n)做为坐标)

以坐标原点为中心旋转的原理:

点p0绕坐标原点逆时针方向旋转θ角度得到点p1.

以任意图形中心点为坐标原点旋转原理:

从上图可知以任意图形中心点为坐标原点旋转我们需要三步:
(1)将坐标系Ⅰ变成坐标系Ⅱ
(2)在坐标系Ⅱ中旋转θ角
(3)将坐标系Ⅱ变成坐标系Ⅰ

(1)将坐标系Ⅰ变成坐标系Ⅱ

由Figure1得到Figure2可知,变换矩阵为:

(2)在坐标系Ⅱ中旋转θ角
见上面以坐标原点为中心旋转的原理
(3)将坐标系Ⅱ变成坐标系Ⅰ

最近邻插值matlab代码

function [ A ] = myimrotate(B,degree,method)                                 %定义旋转函数,degree为要旋转的角度[r,c,d]=size(B);                                                      %获取输入图像B的行r、列c和通道数d,为了旋转彩色图像所以有必要得到通道数dnH=round(r*abs(cosd(degree))+c*abs(sind(degree)));                    %旋转图像后得到的新高度,“round()函数四舍五入“nW=round(c*abs(cosd(degree))+r*abs(sind(degree)));                    %旋转图像后得到的新宽度A=zeros(nH,nW,d);                                                     %定义生成目标图像的行列以及通道数M1=[1 0 0;    0 -1 0;    -0.5*nW 0.5*nH 1 ];                                  %坐标系变换矩阵M1M2=[cosd(degree) -sind(degree) 0;    sind(degree) cosd(degree) 0;    0 0 1];  %角度旋转变换矩阵M2,我用的是顺时针方向M3=[1 0 0;    0 -1 0;    0.5*c 0.5*r 1];                                      %坐标系变换矩阵M3    for i=1:nW        for j=1:nH            temp=[i j 1]*M1*M2*M3;                                    %得到旋转后的矩阵temp            y_r=temp(1,2);                                              %y取矩阵temp的第一行第二列,y对应j,为高度            x_r=temp(1,1);                                              %x取矩阵temp的第一行第一列,x对应i,为宽度            y=round(y_r);                                               %y四舍五入取整            x=round(x_r);                                               %x四舍五入取整           if(x>=1&&x<=c)&&(y>=1&&y<=r)                               %判断的得到的(x,y)点是否在原图像上                %最近邻插值               if strcmp(method,'near')                  A(j,i,:)=B(y,x,:);                                     %将原图像的像素点赋值给对应的旋转后图像上的点               end                                                       %(”有人疑惑为啥不是A(i,j,:)=B(x,y,:);因为i,x对应的是列,即宽,而j,y对应的是行,即高“),我这里以x为横坐标,y为竖向纵坐标               %线性插值               if strcmp(method,'linear')                         b = x_r-x;                  a = y+1-y_r;                  if(x>=1&&x+1<=c)&&(y>=1&&y+1<=r)                                                                P1 = b*B(y, x) + (1-b)*B(y+1, x);                      P2 = b*B(y, x+1) + (1-b)*B(y+1, x+1);                      P = a*P1 + (1-a)*P2;                  else                      P=B(y,x,:);                  end                  A(j,i,:)=P;               end                 %三次插值               if strcmp(method,'trib')                       x = floor(x_r);                   y = floor(y_r);                                               if(x>1&&x+2<=c)&&(y>1&&y+2<=r)                            b = x_r-x;                       a = y_r-y;                       A_A=[s(1+a) s(a) s(1-a) s(2-a)];                        C=[s(1+b);s(b);s(1-b);s(2-b)];                        B_B=[B(y-1,x-1) B(y-1,x) B(y-1,x+1) B(y-1,x+2)                            B(y,x-1)   B(y,x)  B(y,x+1)   B(y,x+2)                            B(y+1,x-1)   B(y+1,x) B(y+1,x+1) B(y+1,x+2)                            B(y+2,x-1) B(y+2,x) B(y+2,x+1) B(y+2,x+2)];                      A(j,i,:) = (double(A_A)*double(B_B)*double(C));%                    else%                        if x<1%                            x = x+1;%                        end%                        if y<1%                            y = y+1;%                        end%                        A(j,i,:)=B(y,x,:);                   end               end           end           end    endend%计算S值function [ re ] = s(x)     x = abs(x);    if x<1 && x>=0        re = 1-2*x^2 + x^3;    end    if x>=1 &&x<2        re = 4 - 8*x +5*x^2-x^3;    end    if x>=2        re = 0;    endend复制代码

转载地址:http://pxwva.baihongyu.com/

你可能感兴趣的文章
package.json
查看>>
webpack4+babel7+eslint+editorconfig+react-hot-loader 搭建react开发环境
查看>>
Maven 插件
查看>>
初探Angular6.x---进入用户编辑模块
查看>>
计算机基础知识复习
查看>>
【前端词典】实现 Canvas 下雪背景引发的性能思考
查看>>
大佬是怎么思考设计MySQL优化方案的?
查看>>
<三体> 给岁月以文明, 给时光以生命
查看>>
Android开发 - 掌握ConstraintLayout(九)分组(Group)
查看>>
springboot+logback日志异步数据库
查看>>
Typescript教程之函数
查看>>
Android 高效安全加载图片
查看>>
vue中数组变动不被监测问题
查看>>
3.31
查看>>
类对象定义 二
查看>>
收费视频网站Netflix:用户到底想要“点”什么?
查看>>
MacOS High Sierra 12 13系统转dmg格式
查看>>
关于再次查看已做的多选题状态逻辑问题
查看>>
动态下拉菜单,非hover
查看>>
政府安全资讯精选 2017年第十六期 工信部发布关于规范互联网信息服务使用域名的通知;俄罗斯拟建立备用DNS;Google打击安卓应用在未经同意情况下收集个人信...
查看>>