一、实验名称

图像的几何变换

二、实验目的

1.熟悉MATLAB软件的使用。
2.掌握图像几何变换的原理及数学运算。
3.于MATLAB环境下编程实现对图片不同的几何变换。

三、实验内容

1.将图像绕图像中心顺时针旋转30度,旋转之后的图像尺寸保持为原图像的尺寸。
2.将原图像放大2倍
3.得到该图像的水平镜像图片
4.得到该图像的垂直错切图像

四、实验仪器与设备

Win10 64位电脑
MATLAB2017a

五、实验原理

图像旋转
    所谓图像的旋转无非就是将图像中的所有像素整体旋转,即本质就是对每个像素进行旋转。对一个像素进行旋转,可以看出向量的旋转,利用向量旋转公式,得到旋转矩阵。当然,旋转之后,虽然图像的大小的不会变化的,但是便于我们坐标的选取,我们会计算出一个新的坐标系,所以这里两个过程,两个坐标系中坐标的相互转换,得到两个转换矩阵,这样一来,对于一个像素点,只需要对它进行相应的矩阵操作即可得到旋转之后的点坐标。当然,对于一些得到的映射点不是整数的情况下,我们可以按照要求进行取整或者插值操作即可。
图像的放大
    图像的放大收缩,这里拿放大举例,就是拿更多的像素去表达原来的图像,但是图像整体不变,通俗一点就是,原来一个特征点,需要10个像素表示,放大就是现在我们用20个或者更多来表示这个特征点,这里填值的方法有很多,邻值插值,线性插值等。
图像的水平镜像
    对像素矩阵进行水平转置即可。
图像的垂直错切
    对垂直方向进行线性变换即可。

六、实验过程及代码

图像旋转

function [newimage]=rotate(img,degree)%获取图片信息 注意三通道获取完 即定义三个变量
[m,n,dep]=size(img);%计算出旋转之后,形成一个大矩形的长宽 可以看效果图
rm=round(m*abs(cosd(degree))+n*abs(sind(degree)));
rn=round(m*abs(sind(degree))+n*abs(cosd(degree)));%定义一个新矩阵,三通道的,存储新图片的信息
newimage=zeros(rm,rn,dep);%坐标变换 分三步
m1=[1,0,0;0,1,0;-0.5*rm,-0.5*rn,1];
m2=[cosd(degree),sind(degree),0;-sind(degree),cosd(degree),0;0,0,1];
m3=[1,0,0;0,1,0;0.5*m,0.5*n,1];%利用循环,对每一个像素点进行变换
for i=1:rmfor j=1:rntem=[i j 1];tem=tem*m1*m2*m3;x=tem(1,1);y=tem(1,2);x=round(x);y=round(y);if(x>0&&x<=m)&&(y>0&&y<=n)newimage(i,j,:)=img(x,y,:);endendendend
主函数t=imread('a1.jpg');
t1=rotate(t,30);
subplot(1,2,1),imshow(uint8(t)),title('原图');
subplot(1,2,2),imshow(uint8(t1)),title('旋转30度后');
图像放大2倍t=imread('a1.jpg');
[m,n,dep]=size(t);
%自定义长 宽
rm=1400;
rn=822;%构造新矩阵 存储收缩后的图片
rt=zeros(rm,rn,dep);for i=1:rm
for j=1:rn
%坐标转换
x=i*m/rm;
y=j*n/rn;
%求出偏移量
u=x-floor(x);
v=y-floor(y);
%边缘处理
if x<1
x=1;
end
if y<1
y=1;
end
%双线性插值
rt(i,j,:)=t(floor(x),floor(y),:)*(1-u)*(1-v)+t(floor(x),ceil(y),:)*(1-u)*v+t(ceil(x),ceil(y),:)*(u)*(1-v)+t(ceil(x),ceil(y),:)*u*v;
end
endimshow(t);title('原图');
figure;imshow(uint8(rt));title('加倍后的图片');

图像的水平镜像

t=imread('a1.jpg');
[m,n,z]=size(t);
rt=t;
for i=1:m
for j=1:n
rt(i,j,:)=t(i,n-j+1,:);
end
end
subplot(1,2,1),imshow(t),title('原图')
subplot(1,2,2),imshow(rt),title('水平镜像')
垂直方向错切:
t=imread('a1.jpg');
[m,n,z]=size(t);
rt=zeros(m+n,n,z);
for i=1:m
for j=1:n
rt(i+j,j,:)=t(i,j,:);
end
end
subplot(1,2,1),imshow(t),title('原图')
subplot(1,2,2),imshow(uint8(rt)),title('垂直错切')

七、实验结果与分析

图 1图像顺时针旋转30度

图 2图像放大2倍

图 3图像的水平镜像

图 4垂直错切

实验结果分析
1、图像的旋转,其原理知识就是数学中向量的旋转,在确定好旋转角度后,计算出旋转后图片的大小,然后进行坐标转换,再向量旋转,最后在逆坐标转换即可。
2、图像的放大与收缩,放大时,利用插值法填充空白像素点,这里可以用线性插值、双线性插值等方法;收缩时,这时我们就需要考虑舍弃一些不必要的像素点,尽可能多的保持原图像的完整性
3、图像的水平镜像,实质是图像像素矩阵的水平逆转
4、图像的错切,本质就是对原有坐标单方向进行函数变换

八、实验总结及心得体会

通过这次实验,自己学会了几种图像变换的方法:图像的放大、收缩、水平镜像、错切等,在进行放大的时候,接触到了插值法,有线性插值、双线性插值等,好多的原理知识都需要一定的高数知识,基础还是有点不扎实啊。在图形的放大时,在m、n两个变量搞混,其实也就是坐标轴建立处理差错。

附:图像收缩原理验证
定义
图像的收缩通俗一点就是我们常说的放大、缩写,在数字图像处理中,就是指像素的增加与减少。比如22的图像,有4个像素,放大两倍,那么就有44=16个像素。
那么怎么对图像进行收缩呢?
这里拿放大举例:放大二倍的图像就是图片的width、height都扩大为原来的两倍,也就是像素总数为原来的四倍。那么怎么在保证图片内容不变的情况下增加像素呢?这个也简单,举个例子,比如一个红色的圆原来是4个像素(4个相同的像素)来表示,二倍后的圆那么就是用16个像素(也是相同的)来表示,通俗来说,就是用更多的像素来表示同一种图形。原来需要4个,那么现在就需要16个。
当然,随机图像上面一个片段是由多个不同的像素表示,那么怎么增加像素个数,同时图形还不变化呢?这个就要用插值来计算了。举个例子,一段上坡路,现在要把它增长(在中间增长),那么肯定是在中间填入和两侧差不多的高度,使得原来的坡面同样也是连续的,保持原来的连续性。所以插值的目的是:通过填充像素,保持原图像的一致,和高数上变化后保持连续性相似。下图是插值法的说明:

该算法的伪代码:

我的理解:
比如原图的大小为300400,放大两倍,变成600800;原图上(1,2)的点在放大图的点为(2,4)。这个应该比较好理解。
编程的时候,我们是先构造出放大图像的空矩阵,再依次填值。这就要求我们要能够在已知知道放大图像中的一个点坐标,计算出原图的坐标,然后把原图的坐标赋值给新点。
这里运用比例思想,比如x轴上,放大图为2,它占总长600的2/600,那么原图的x坐标同样也占x轴的2/600,计算出来为1.
假设(x1,y1)为放大图像的值,(x0,y0)为原图的值,m,n为原图的横纵长度,rm,rn为放大图的横纵长度。

有以下关系:

x1/rm=x0/m y1/rn=y0/n
可以推导出:
x0=x1m/rm y0=y1n/rn
最后再利用双线性插值法插值即可。
这里代码是(其实就是先分别求出周围4个点,利用不同的取值函数就行,再计算):

rt(i,j,:)=t(floor(x),floor(y),:)*(1-u)*(1-v)+t(floor(x),ceil(y),:)*(1-u)*v+t(ceil(x),ceil(y),:)*(u)*(1-v)+t(ceil(x),ceil(y),:)*u*v;

更多

获取更多资料、代码,微信公众号:海轰Pro
回复 海轰 即可

MATLAB--数字图像处理 图像几何变换相关推荐

  1. Matlab数字图像处理——图像的空间变换

    Matlab空间变换函数 imtransform Matlab空间变换函数 imtransform 可以实现图像仿射变换(如 平移.旋转.剪切.缩放).投影变换, 该函数可与 maketform 配合 ...

  2. matlab数字图像处理——图像的读写,灰度、二值图像

    一.实验目的 1.结合数字图像处理的知识,直观感受图像处理的基本实现过程 2.熟悉MATLAB工具的使用 3.了解图像的读写和显示 二.实验内容 实验内容一:图像读取 (1)利用编程实现读取图像 利用 ...

  3. Matlab数字图像处理——图像处理工具箱Image Processing Toolbox

    Image Processing Toolbox 图像处理工具箱包含的功能: 图像的读取和保存 图像的显示 创建GUI 图像的几何变换 图像滤波器设计及线性滤波 形态学图像处理 图像域变换 图像增强 ...

  4. Matlab数字图像处理——图像文件的读取

    文章目录 一.Matlab中获取图像信息的函数 imfinfo 二.Matlab读取图像文件的函数 imread 三.Matlab保存图像文件的函数 imwrite 完整目录 一.Matlab中获取图 ...

  5. matlab 求其骨架,数字图像处理图像的骨架生成和提取(Matlab)三种方法

    [实例简介] 数字图像处理图像的骨架生成和提取(Matlab),有三种方法,推荐给大家! [实例截图] [核心代码] Programe ├── Programe1 │   ├── 00.JPG │   ...

  6. matlab图像低通滤波器 实验报告,基于matlab数字图像处理之低通滤波器

    <基于matlab数字图像处理之低通滤波器>由会员分享,可在线阅读,更多相关<基于matlab数字图像处理之低通滤波器(6页珍藏版)>请在人人文库网上搜索. 1.实践一:理想低 ...

  7. MATLAB 数字图像处理GUI二值图像实验

    电信19-2 翁大弟 摘要 图像信息是人类获取信息的重要来源及利用信息的重要手段,数字图像处理的产生和迅速发展主要受三个因素的影响:一是计算机的发展:二是广泛的农牧业.环境.军事.工业等方面的应用需求 ...

  8. MATLAB数字图像处理复习概览

    MATLAB数字图像处理 第1章 绪论 数字图像的概念 数字图像处理 第2章 数字图像处理基础 数字图像的生成与表示 数字图像的数值描述 第3章 图像基本运算 图像几何变换 几何变换基础 位置变换 几 ...

  9. 《精通Matlab数字图像处理与识别》一6.2 傅立叶变换基础知识

    本节书摘来自异步社区<精通Matlab数字图像处理与识别>一书中的第6章,第6.2节,作者 张铮 , 倪红霞 , 苑春苗 , 杨立红,更多章节内容可以访问云栖社区"异步社区&qu ...

  10. matlab fspeical,MATLAB数字图像处理.doc

    MATLAB数字图像处理 MATLAB常用图像操作 转换图像类型 例1.对一幅图像进行二值化处理,代码及结果如下: load trees BW=im2bw(X,map,0.4); imshow(X,m ...

最新文章

  1. 排名前 16 的 Java 工具类
  2. JAVA之间的引用传递
  3. Debian、Ubuntu安装源配置文件说明
  4. python安装modify setup选哪-python 之禅 import this
  5. php上下翻页,一个很不错的PHP翻页类
  6. [BZOJ1322]Destroying The Graph
  7. 中国医科大学计算机在线作业,中国医科大学《计算机应用基础》在线作业及参考 答案.doc...
  8. unity发布成手机app怎么不能被顶_Unity中Android API 28之后无法HTTP请求
  9. Java 写时拷贝容器CopyOnWriteArrayList的测试
  10. Winform可读取html语言,C# Winform 用WebBrowser实现 Html 编辑功能
  11. mysql定时作业_mysql 让一个存储过程定时作业的代码(转)
  12. hdu 1524 A Chess Game
  13. 小爱音箱怎么装app_小爱音箱app
  14. 微信公众号开发--自定义菜单跳转页面并获取用户信息
  15. win10 查看计算机名称与用户名称
  16. 音频基础之麦克风、功放、扬声器
  17. 计算机硬件系统概念,计算机系统概念
  18. 【Java类和对象】
  19. 舆情指数在哪里可以查到?具体平台与工具参考
  20. html5待办事项模板,待办事项列表模板

热门文章

  1. EBS FA资产模块新增CIP在建工程手册
  2. 基于SpringBoot+Vue在线考试系统【web端+小程序端】【附带源码】
  3. 魔乐科技安卓开发教程----李兴华----13视频录制
  4. 数据结构 第一章:绪论
  5. ​C++ 解析Json——jsoncpp​
  6. python爬人人贷代码视频_【IT专家】人人贷网的数据爬取(利用python包selenium)
  7. 摸爬滚打大半年,我是如何从零基础进阶到渗透测试工程师
  8. STemWin显示图片
  9. BBR加速 Centos
  10. jqweui 中的tabbar导航