博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
图像旋转、伸缩的自写matlab实现
阅读量:6244 次
发布时间:2019-06-22

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

一、图像的旋转

  今天的代码不是自己写的,缺少一些时间。但是认认真真推导了一下旋转的公式,代码的思想与原博博主一致,致敬!

  愚以为,自己来实现图像旋转算法的关键点有二:其一,确定旋转后的图像边界。其二,确定图像新旧坐标系下的图像变换矩阵。

  下面重点介绍图像变换矩阵(算法)。由于我们常见的旋转算法是根据图像中心来进行的,并非是ROC坐标轴左上角的位置。如果我们直接进行变换,那么将难以写出图像变换矩阵。所以,我们将问题分为三步:

  1.将原坐标轴1变换为新坐标轴2,得到图像变换矩阵M1;

  2.在坐标轴2中进行旋转操作,得到图像变换矩阵M2;

  3.将旋转后的点,从坐标轴2再变换回坐标轴1.

 

  

  以下考虑代码实现:

  myinrotate.m

function [ A ] = myimrotate(B,degree)                                 %定义旋转函数,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=temp(1,2);                                              %y取矩阵temp的第一行第二列,y对应j,为高度            x=temp(1,1);                                              %x取矩阵temp的第一行第一列,x对应i,为宽度            y=round(y);                                               %y四舍五入取整            x=round(x);                                               %x四舍五入取整           if(x>=1&&x<=c)&&(y>=1&&y<=r)                               %判断的得到的(x,y)点是否在原图像上               A(j,i,:)=B(y,x,:);                                     %将原图像的像素点赋值给对应的旋转后图像上的点           end                                                        %(”有人疑惑为啥不是A(i,j,:)=B(x,y,:);因为i,x对应的是列,即宽,而j,y对应的是行,即高“),我这里以x为横坐标,y为竖向纵坐标        end    endend

  my_rotation.m

clc                                 I=imread('学妹.jpg');figure,imshow(I);title('srcImage');I1=myimrotate(I,30);     %调用myimrotate()函数旋转30° I2=myimrotate(I,-90);     %调用myimrotate()函数旋转-90°figure,imshow(uint8(I1));title('旋转30°:I1');figure,imshow(uint8(I2));title('旋转-90°:I2');

  运行情况:

 

二、图像伸缩

   做了一个长宽各缩小至原来一半的。这个简单,直接上代码。

scaling.m

function [ A ] = scaling(B)[r,c,d]=size(B);A=zeros(r/2,c/2,d);    for i=1:c/2        for j=1:r/2            A(j,i,:)=B(2*j,2*i,:);        end    endend

my_scaling.m

clc                                 I=imread('学妹.jpg');figure,imshow(I);title('srcImage');I1=scaling(I);figure,imshow(uint8(I1));title('缩小:I1');

  代码运行结果:

 

 

参考文献:

[1] https://blog.csdn.net/Bryan_QAQ/article/details/78805201

 

2019-03-12

20:33:25

转载于:https://www.cnblogs.com/lyxyhhxbk/p/10518405.html

你可能感兴趣的文章
Android----------WindowManager
查看>>
通过DAC来连接SQL Server
查看>>
Jquery学习笔记:利用parent和parents方法获取父节点
查看>>
Python批量删除指定目录下的指定类型的文件
查看>>
Java程序猿的JavaScript学习笔记(3——this/call/apply)
查看>>
Mac OS设置rootpassword
查看>>
FreeLink开源呼叫中心设计思想
查看>>
//6小时更新一次首页
查看>>
Android开发者应该深入学习的10个开源应用项目
查看>>
对《LINQ能不能用系列(一)数组筛选效率对比》中测试的几个问题
查看>>
SGU 275 To xor or not to xor
查看>>
Sharepoint学习笔记—ECMAScript对象模型系列-- 6、使用ECMA操作列表项对象(list item)...
查看>>
【转载】常用统计软件下载地址大全
查看>>
新的思想来源
查看>>
对于超大型SQL SERVER数据库执行DBCC操作
查看>>
Binary Tree Level Order Traversal II
查看>>
Python 点滴 I
查看>>
Java泛型详解
查看>>
分治算法思想介绍
查看>>
1 张图秒懂 Nova 16 种操作 - 每天5分钟玩转 OpenStack(44)
查看>>