目录

  • 1.图像旋转的原理
    • 1.1.旋转矩阵
    • 1.2.双线性插值
    • 1.3.像素点匹配
  • 2.实现效果与说明

1.图像旋转的原理

1.1.旋转矩阵

旋转一幅图像(假设这幅图像大小是矩形的),当然应该从像素点(pixels)开始,在直角坐标系中,对点x0=[a0b0]x_0=\begin{bmatrix}a_0\\b_0\\ \end{bmatrix}x0​=[a0​b0​​]逆时针旋转角度θ\thetaθ到x1=[a1b1]x_1=\begin{bmatrix}a_1\\b_1\\ \end{bmatrix}x1​=[a1​b1​​]的变换公式为
x1=[cosθ−sinθsinθcosθ]x0x_1=\begin{bmatrix}cos\theta & -sin\theta \\ sin\theta & cos\theta\\ \end{bmatrix}x_0x1​=[cosθsinθ​−sinθcosθ​]x0​
那么对图像上的每个点调用这个旋转公式,将旧图像像素点的RGB值搬移到新图像像素点,就可以将图像旋转到任意位置。
但是问题来了,显示屏的像素点是有限的,这意味着显示在显示屏上的像素点坐标必须是整数,旋转过后的图像的每个像素点坐标难免有非整数的情况,那么这种情况下我们怎么处理呢?
我们不妨假设逆时针旋转θ\thetaθ旋转后的图形上所有的像素点都是整点,对于旋转后的图形的每个像素点x1x_1x1​,求旋转前图形的对应像素点的坐标x0x_0x0​,取ω=−θ\omega=-\thetaω=−θ为逆旋转角度,则旋转后的像素点和旋转前的像素点的对应关系为:
x0=[cosω−sinωsinωcosω]x1x_0=\begin{bmatrix}cos\omega & -sin\omega \\ sin\omega & cos\omega\\ \end{bmatrix}x_1x0​=[cosωsinω​−sinωcosω​]x1​
此时x0x_0x0​不一定为整点,x0x_0x0​的像素值需要做一定的近似。近似的方法有最近邻插值、双线性插值等等,在这里我们就介绍比较实用且不是很复杂的双线性插值,该插值方法不会产生明显失真现象。
对于像素点的旋转坐标函数编写如下:
坐标旋转变换函数:rot.m

function y=rot(p,angle)
%p=[x,y]为角度制
angle=angle*pi/180;%角度制输入进行计算
y=[cos(angle) -sin(angle);sin(angle) cos(angle)]*p';
end

1.2.双线性插值

对于x和y坐标非整数的非整点xpx_pxp​,假设它周围的四个整点坐标分别为x11,x12,x21,x22x_{11},x_{12},x_{21},x_{22}x11​,x12​,x21​,x22​(构成一个矩形)。假设第一维度是x坐标,第二维度是y坐标。则x11(1)=x21(1)≤xp(1)≤x12(1)=x22(1)x_{11}(1)=x_{21}(1)≤x_p(1)≤x_{12}(1)=x_{22}(1)x11​(1)=x21​(1)≤xp​(1)≤x12​(1)=x22​(1)
x11(2)=x12(2)≥xp(2)≥x21(2)=x22(2)x_{11}(2)=x_{12}(2)≥x_p(2)≥x_{21}(2)=x_{22}(2)x11​(2)=x12​(2)≥xp​(2)≥x21​(2)=x22​(2)
显然,即使xpx_pxp​为整点,仍然存在这样的四个点x11,x12,x21,x22x_{11},x_{12},x_{21},x_{22}x11​,x12​,x21​,x22​使得上式成立。
在下图中,P为非整点,存在4个整点Q12,Q11,Q22,Q21Q_{12},Q_{11},Q_{22},Q_{21}Q12​,Q11​,Q22​,Q21​将P点包围在其中,设纵向比例系数β=y−y2y1−y2\color{blue}\beta=\frac{y-y_2}{y_1-y_2}β=y1​−y2​y−y2​​,横向比例系数α=x−x1x2−x1\color{blue}\alpha=\frac{x-x_1}{x_2-x_1}α=x2​−x1​x−x1​​颜色函数F(P)F(P)F(P)在四个整点处的值分比为F12,F11,F22,F21F_{12},F_{11},F_{22},F_{21}F12​,F11​,F22​,F21​,则P点的函数值
FP=β[(1−α)F11+αF21]+(1−β)[(1−α)F12+αF22]F_P=\beta[(1-\alpha)F_{11}+\alpha F_{21}]+(1-\beta)[(1-\alpha)F_{12}+\alpha F_{22}]FP​=β[(1−α)F11​+αF21​]+(1−β)[(1−α)F12​+αF22​]写成矩阵的形式即为:
FP=[1−αα][F11F12F21F22][β1−β]F_P=\begin{bmatrix}1-\alpha & \alpha \end{bmatrix}\begin{bmatrix} F_{11} & F_{12} \\[2ex] F_{21} & F_{22} \end{bmatrix}\begin{bmatrix}\beta \\[2ex] 1-\beta \end{bmatrix}FP​=[1−α​α​][F11​F21​​F12​F22​​][β1−β​]

对于灰度图像,F(P)F(P)F(P)是一维函数,对于RGB图像,F(P)=[FR(P)FG(P)FB(P)]F(P)=\begin{bmatrix}F_R(P) \\F_G(P) \\ F_B(P) \end{bmatrix}F(P)=⎣⎡​FR​(P)FG​(P)FB​(P)​⎦⎤​
由于该公式较为复杂,可以单独编写双线性插值函数,输入为一个任意点坐标,和图像每个点的像素;输出为该点进行双线性插值后的颜色函数值。但需要主要的是,若给采集的4个周围整点,有其中一个超出了图像边界,考虑到图像边界一般为白色,则以白色为替代。检测点是否在画布内只需要条件判断语句就够了。
检测是否在画布内的判断程序:isinrect.m

function y=isinrect(plt,rect)
if plt(1)>=rect(1) && plt(1)<=rect(2) && plt(2)>=rect(3) && plt(2)<=rect(4)y=true;
elsey=false;
end

双线性插值函数:linear_interp.m

function y=linear_interp(p,img)%p为需要双线性插值的点坐标(向量)x=p(1);y=p(2);m=size(img,1);n=size(img,2);x1=floor(x);x2=ceil(x);y1=floor(y);y2=ceil(y);%[x,y]四周的四个整点left=x-x1;%距左边线距离bottom=y-y1;%距底线距离plt=[x1,y2;x2,y2;x1,y2;x2,y2];img_rect=[1,m,1,n];%原图像的矩形框pix_rect=zeros(1,4,3);for t=1:4if isinrect(plt(t,:),img_rect)for color=1:3pix_rect(1,t,color)=img(plt(t,1),plt(t,2),color);endelsepix_rect(1,t,:)=255;%背景色为白色endendpixels=zeros(1,3);%保存该点的三原色的三个像素pix_rect=reshape(pix_rect,2,2,3);for color=1:3pixels(color)=[bottom,1-bottom]*pix_rect(:,:,color)*[1-left;left];%双线性像素插值endy=pixels;
end

1.3.像素点匹配

假设图像的点都是整点的情况下,新图像是一个旋转后的矩形,此时需要给新图像定界使得新图像能够包括在一个旋转角度为0°大矩形中。

left=max(x1,x2,x3,x4),right=min(x1,x2,x3,x4)left=max(x_1,x_2,x_3,x_4),right=min(x_1,x_2,x_3,x_4)left=max(x1​,x2​,x3​,x4​),right=min(x1​,x2​,x3​,x4​)
top=max(y1,y2,y3,y4),bottom=min(y1,y2,y3,y4)top=max(y_1,y_2,y_3,y_4),bottom=min(y_1,y_2,y_3,y_4)top=max(y1​,y2​,y3​,y4​),bottom=min(y1​,y2​,y3​,y4​)

filename='足球.bmp';%文件的完整路径名
img=imread(filename);%导入图像
% subplot(121)
% imshow(img)%展示原图像
m=size(img,1);n=size(img,2);%统计图像的长和宽
plt=[0,0;m,0;m,n;0,n];%四个顶点坐标
for t=1:4plt(t,:)=ceil(rot(plt(t,:),rot_angle));%三个顶点进行旋转坐标变换
end
%新的四个点坐标的x和y边界值
left=min(plt(:,1));right=max(plt(:,1));
bottom=min(plt(:,2));top=max(plt(:,2));
M=right-left;N=top-bottom;%获取新的图像大小
new_img=255*ones(M,N,3);%创建新画布
left=min(plt(:,1));right=max(plt(:,1));
bottom=min(plt(:,2));top=max(plt(:,2));

定界完成后,只需要求出新图像定界后每个像素点对应的原图像像素点坐标,并按照双线性插值的方法取得像素值,对应到新图像点中,即可求出每个新图像点的像素值,旋转步骤即完成。要注意的是,如果双线性插值遇到了原图像界限外的点,为保证程序不出错,可以直接将界限外的点置为0(相当于非常弱的边缘虚化效果),或者直接将最外层边界整点进行最近邻插值(这种分段算法实现会略微麻烦)。主函数文件代码如下:
主函数文件:img_process.m

function img_process(rot_angle)
close all
filename='足球.bmp';%文件的完整路径名
img=imread(filename);%导入图像
figure
imshow(img)%展示原图像
m=size(img,1);n=size(img,2);%统计图像的长和宽
plt=[0,0;m,0;m,n;0,n];%四个顶点坐标
for t=1:4plt(t,:)=ceil(rot(plt(t,:),rot_angle));%三个顶点进行旋转坐标变换
end
%新的四个点坐标的x和y边界值
left=min(plt(:,1));right=max(plt(:,1));
bottom=min(plt(:,2));top=max(plt(:,2));
M=right-left;N=top-bottom;%获取新的图像大小
new_img=255*ones(M,N,3);%创建新画布
for i=1:Mfor j=1:Ninit_plt=rot([i-1+left,j-1+bottom],-rot_angle);%新图像对应原图像的坐标init_plt=init_plt+1;%还原到Matlab坐标系new_img(i,j,:)=linear_interp(init_plt,img);end
end
figure
imshow(uint8(new_img))%展示旋转后的新图像(底色为白色)

2.实现效果与说明

将上述标红的4个M文件放在一个文件夹,并更改MATLAB目录为该文件夹,并在该文件夹添加一张名为“足球.bmp”的位图文件,在命令行输入img_process(30)即可将该图像旋转30°显示,显示效果如下:

原图像 新图像(旋转30°)

本文从原理上用MATLAB代码实现了图像的旋转,如果想直接调用MATLAB的函数,请查看imrotate函数的相关说明:
new_img=imrotate(initial_img,angle,method, ‘crop’)

  • angle:逆时针旋转的角度,是角度值
  • method:该参数为插值方法,其中’bilinear’为双线性插值,可选
  • crop:旋转后增大图像

基于双线性插值的图像旋转原理及MATLAB实现(非自带函数)相关推荐

  1. 小白学习图像处理3——图像旋转原理

    文章目录 一.图像旋转的原理 二.使用matlab实现 1.思路 2.实现代码 三.优化 1.思路 2.代码实现 3.使用双线性插值 四.matlab函数实现图像旋转 1.imrotate函数 2.i ...

  2. 基于混沌的图像置乱加密算法及matlab的实现,基于混沌的图像置乱加密算法及MATLAB的实现...

    基于混沌的图像置乱加密算法及MATLAB的实现 提出了一种基于混沌映射的图像置乱加密算法.借助MATLAB6.5软 (本文共3页) 阅读全文>> 数字水印(Digital Watermar ...

  3. matlab图像压缩像素编码,基于DCT的图像压缩编码算法的MATLAB实现

    基于DCT的图像压缩编码算法的MATLAB实现 摘要 随着科学技术的发展,图像压缩技术越来越引起人们的关注.为此从众多的图像压缩编码标准中选取了基于DCT变换的JPEG图像压缩编码算法进行研究,并通过 ...

  4. 基于DSP的图像旋转算法数据调度策略

    基于DSP的图像旋转算法数据调度策略 [日期:2008-8-14] 来源:电子技术应用  作者:李筱琳,冯 燕,何亦征 [字体:大 中 小] <script src="http://w ...

  5. 使用双线性插值做图像旋转

    依然是"表格识别"课题,目前还在讨论图像倾斜校正. 上一篇中,对于倾斜的表格图像,通过拉冬变换得到了图像的倾斜角,下面探讨如何利用这个倾斜角进行图像变换 在论文<社区选举系统 ...

  6. 基于最小二乘法的图像边界曲线拟合(matlab平台)

    **(源码资源****有常(注意目前是有常哦)私我vx:xdsqczkyqs713,源码(带GUI,GUI是用户界面的意思)40圆, 加一份课设报告50圆,加vx之前注意下后边的说明内容哦**,**说 ...

  7. 图像卷积原理及MATLAB实现

    数字图像卷积原理,matlab的conv2函数,不使用con2函数实现卷积 图像卷积原理 卷积,Convolution.卷积是两个变量在某范围内相乘后求和的结果.如果卷积的变量是序列x(n)和h(n) ...

  8. 【图像加密】基于Logistic混沌图像加密与解密Matlab代码

    1 简介 当今时代,科学技术发展迅猛,网络成为人们获取成为人们获取多媒体数字信息的主要渠道,数字图像作为日常交流的主要传输媒介,更是承担着信息传递的重任.保证信息在传播过程中的安全性和完整性便成了目前 ...

  9. 基于RFM-SCAN的图像配准算法的matlab仿真

    目录 1.算法概述 2.仿真效果 3.MATLAB仿真源码 1.算法概述 这些匹配点通常是基于描述符相似性创建的.为了实现这一目标,现有的尝试通常涉及在几何约束下估计图像变换,其中需要预定义的变换模型 ...

最新文章

  1. python uwsgi_python Web开发你要理解的WSGI uwsgi详解
  2. SOA 案例研究:SOA 设计
  3. Swift - static和class的使用
  4. ML之FE:基于自定义数据集(银行客户信息贷款和赔偿)对比实现特征衍生(手动设计新特征、利用featuretools工具实现自动特征生成)
  5. 在Spring中使用DButils
  6. Doom HDU - 5239(线段树+思维)
  7. eclipse 开发 scala
  8. 基于JAVA+SpringBoot+Mybatis+Vue+MYSQL的智慧养老管理系统
  9. Nginx负载均衡和反向代理设置
  10. Java数据持久层框架 MyBatis之API学习六(Mapper XML 文件详解)
  11. FM、LFM、AFM、NFM、DeepFM、 Deep Cross Network
  12. 大话设计模式之----状态模式
  13. 搭建python本地源
  14. ABAQUS仿真软件经典案例——水滴入水分析
  15. 浅谈打开网页速度慢的原因和解决方法
  16. 怎么做SEO——页面权重计算公式
  17. html如何实现空格?
  18. datatable隐藏列设置及获取隐藏列的值
  19. 以数字技术推动行业跃迁,容联云抢先迈进云联络中心智能化阶段
  20. 2019前端最全面试题

热门文章

  1. 原 BinaryWriter和BinaryReader(二进制文件的读写)
  2. iBatis——执行原理
  3. Codeforces 757B - Bash's Big Day(分解因子+hashing)
  4. “玲珑杯”线上赛 Round #15 河南专场 F 咸鱼文章
  5. 001_docker-compose构建elk环境
  6. html跨浏览器兼容性问题
  7. WPF的WebBrowser屏蔽弹出脚本错误窗口
  8. 51CTO寄来的奖品
  9. ORA-28001: the password has expired解决方法
  10. c语言单字符输入和输出函数分别为,第03章单元总练习-实训-知识拓展.doc