图像旋转、伸缩的自写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列的图像各像素点灰度值,对其依次进行一系列操作 ...
随机推荐
- boot跳转到app后,中断不起作用的原因
boot跳转到app后 osKernelStart()之前,中断有问题,不起作用 原因是因为boot跳转之前__disable_irq(); 跳转到APP后,并不是一切从头开始,__disable_i ...
- webrtc如何进行错误恢复
视频的压缩方法:(三种帧) 为了视频尽可能的保持高效,视频数据通过不同的编码进行压缩.以帧为单位进行压缩,按照压缩中的不同作用可分类为:内帧(Intra-frames,I帧),预测帧(Predicti ...
- LDAP与实现
LDAP是什么? LDAP是轻量目录访问协议,英文全称是Lightweight Directory Access Protocol,一般都简称为LDAP.它是基于X.500标准的,但是简单多了并且可以 ...
- 找出sql脚本中需要创建的表空间名称和数据库用户名
测试的工作中,经常会遇到项目交接或者搭建一个新的测试环境,而创建oracle数据库用户及表空间时,需要提前找出脚本中的 数据库用户名和表空间名,所以自己写了一个python脚本,自动找出sql脚本中的 ...
- 尝试启动 ADB 服务器时出错 解决方法
启动CMD→ adb kill-server → adb start-server;
- Lintcode: Knight Shortest Path
Given a knight in a chessboard (a binary matrix with 0 as empty and 1 as barrier) with a source posi ...
- Python模拟ICMP包
主要使用Scapy来完成 基础环境 VM1(192.168.1.226) | | VM2(192.168.1.125) vm1封装icmp包发给vm2 vm1脚本: #! /usr/bin/env p ...
- 目标检测方法——R-FCN
R-FCN论文阅读(R-FCN: Object Detection via Region-based Fully Convolutional Networks ) 目录 作者及相关链接 方法概括 方法 ...
- 【SW4STM32生成 hex文件的设置方法】
SW4STM32生成 hex文件的设置方法 开发环境:WIN7_64 + SW4STM32 联系方式:yexiaopeng1992@126.com 修改: 2018年1月21日 在这周,有一个热心的 ...
- 寻找U2OS中表达的基因及其promoter并用于后续annotation
方法1.RNA-seq得到不同表达程度基因 方法2. 直接download U2OS_gene.csv https://cancer.sanger.ac.uk/cell_lines/download ...