图像旋转、伸缩的自写matlab实现
一、图像的旋转
今天的代码不是自己写的,缺少一些时间。但是认认真真推导了一下旋转的公式,代码的思想与原博博主一致,致敬!
愚以为,自己来实现图像旋转算法的关键点有二:其一,确定旋转后的图像边界。其二,确定图像新旧坐标系下的图像变换矩阵。
下面重点介绍图像变换矩阵(算法)。由于我们常见的旋转算法是根据图像中心来进行的,并非是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,为了旋转彩色图像所以有必要得到通道数d
nH=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 ]; %坐标系变换矩阵M1
M2=[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
end
end
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
end
end
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
图像旋转、伸缩的自写matlab实现的更多相关文章
- 【OpenCV学习笔记】之六 手写图像旋转函数---万丈高楼平地起
话说,平凡之处显真格,这一点也没错! 比如,对旋转图像进行双线性插值,很简单吧? 可,对我,折腾了大半天,也没有达到预期效果! 尤其是三个误区让我抓瞎好久: 1,坐标旋转公式. 这东西,要用 ...
- 图像旋转与图像缩放及Matlab代码实现
本周的作业是自己通过公式编写图像旋转与缩放的代码.今天先通过调用函数的方法来实现. 图像的旋转: A=imread('2.jpg'); J=imrotate(A, 30); subplot(1,2,1 ...
- 图像卷积、相关以及在MATLAB中的操作
图像卷积.相关以及在MATLAB中的操作 2016年7月11日 20:34:35, By ChrisZZ 区分卷积和相关 图像处理中常常需要用一个滤波器做空间滤波操作.空间滤波操作有时候也被叫做卷积滤 ...
- [google面试CTCI] 1-6.图像旋转问题
[字符串与数组] Q:Given an image represented by an NxN matrix, where each pixel in the image is 4 bytes, wr ...
- pyhton:图像旋转
最近一个作业中要用到图像旋转,分享一下学习过程.如有讲错的地方,恳请指正! 图像旋转,想想真简单啊,不就是将图像矩阵乘上一个旋转平移矩阵就完了吗?实际上还真没这么简单.首先这个旋转平移矩阵怎么获得?通 ...
- 基于c++和opencv底层的图像旋转
图像旋转:本质上是对旋转后的图片中的每个像素计算在原图的位置. 在opencv包里有自带的旋转函数,当你知道倾斜角度theta时: 用getRotationMatrix2D可得2X3的旋转变换矩阵 M ...
- OpenCV计算机视觉学习(11)——图像空间几何变换(图像缩放,图像旋转,图像翻转,图像平移,仿射变换,镜像变换)
如果需要处理的原图及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice 图像 ...
- 图像旋转的FPGA实现(一)
继续图像处理专题,这次写的是图像旋转.若要说小分辨率的图像旋转倒也简单,直接将原始图像存储在BRAM中,然后按照旋转后的位置关系取出便是.但是对于高分辨的图像(720P及以上)就必须得用DDR3或者D ...
- NOI题库 09:图像旋转翻转变换
NOI题库开始的题,也是略水,当然也是大水,所以彼此彼此 09:图像旋转翻转变换 总时间限制: 1000ms 内存限制: 65536kB 描述 给定m行n列的图像各像素点灰度值,对其依次进行一系列操作 ...
随机推荐
- 定位属性position
定位属性position小结 1.元素为fixed(固定的),则是固定定位,即使是子元素,也不参考父元素的位置,即以浏览器作为参考定位.相当于电脑屏幕的一只蚂蚁,你无论怎么滑动屏幕,还是在原来的位置. ...
- IIS宿主WCF服务*.svc Mime类型映射
经常会遇到由于.net安装组件缺失,导致发布wcf服务后,访问wcf报.svc请求类型不支持 简单方法就是添加删除程序,修改.net组件安装选项,勾选http激活即可: 或者手工添加映射处理程序 1. ...
- Install Superset from Python3.6
本文安装Superset大致分为以下部分: 在操作系统中安装相关依赖,我所用的操作系统为Centos6.5 安装Python3.6.6 安装Superset 详细步骤如下: 相关依赖的安装 yum i ...
- oracle储存过程学习笔记
转载至: https://www.2cto.com/database/201610/559389.htm 1.什么是oracle存储过程 存储过程和函数也是一种PL/SQL块,是存入数据库的PL/SQ ...
- HibernateValidators
public final class HibernateValidators { private static final Validator VALIDATOR; private Hibernate ...
- Postman代码测试工具如何用?
1. 1)get请求,参数为map时, postman的传参 2)参数为基本数据类型的参数时 postman传参: 3)当参数在接口中动态获取时 postman传参: 2. 1)post请求,参数 ...
- 21.命名空间别名限定符::和global全局名称空间限定符
命名空间别名限定符(::)用于查找标识符,它在指定的别名的命名空间中查找运算符,如下代码是在全局名称空间中查找System.Console.WriteLine("Hello World&qu ...
- appium 3 跑起来
1. 代码如下: from appium import webdriver capabilitise = { "platformName": "Android" ...
- Linux 7.x 防火墙&端口
Linux 7.x 防火墙&端口 查看当前防火墙的状态: # firewall-cmd --state 也可以使用指令:systemctl status firewall.service 启动 ...
- 简介一下 i++和++i&&i=i+i,i+=1;的区别
首先: int i=2; i++=2; ++i=3; 前者先显示当前的值,而后者则是先自增在显示值: second i=i+1和i+=1; 输出结果虽然一样,但是 1.byte i=2; i+=2; ...