图形图像处理-图像的几何变换Matlab实现_第1页
图形图像处理-图像的几何变换Matlab实现_第2页
图形图像处理-图像的几何变换Matlab实现_第3页
图形图像处理-图像的几何变换Matlab实现_第4页
图形图像处理-图像的几何变换Matlab实现_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、湖南商学院课程设计 课程名称图形图像处理题目图像的几何变换系部数学与统计学院专业信息与计算科学班级信息与计算科学1301学号学生姓名任课教师王勇2016年月日目录第一章绪论§1 非彩色图像在Matlab中的矩阵 (3§2 彩色图像在Matlab中的矩阵 (4第二章图像的镜像变换§1 图像的水平方向镜像 (5§2 图像的垂直方向镜像 (8第三章图像的旋转变换§1 图像的旋转变换 (10第四章图像的转置变换§1 非彩色图像的转置变换 (13§3 彩色图像的转职变换 (13第五章图像的缩放变换§1 双线性内插法简介 (1

2、5§2 图像的缩放 (16第六章图像的平移变换§1 图像的平移变换 (19第一章 绪论§1 非彩色图像在Matlab 中的矩阵非彩色图像可以定义为一个二维函数(,f x y ,其中x 和y 是Euclid 空间(平面坐标,任意一个二元组(,x y 处的值f 称为该点处的强度或者灰度。当x ,y 和灰度值f 是离散的数值时,我们称改图像为数字图像。每一个非彩色图像在Matlab 中都是一个二维矩阵n m A ,而我们知道变换是指集合自身到自身的映射,所以对非彩色图像的变换其实质就是对二维矩阵n m A 进行变换得到另一个二维矩阵n m B 的过程。例如图像1.1 图

3、1.1其在Matlab 中的表示:>> A=imread('Fig3.24.jpg' >> size(Aans = 298 252 %A 是一个298行252列的矩阵。§2 彩色图像在Matlab 中的矩阵不同于非彩色图像,每一个彩色图像在Maltab 中都是三维矩阵n m s A 。例如图像2.1 图2.1>> A=imread('Koala.jpg' >> size(A ans =768 1024 3A 是一个三维矩阵,768行1024列3层,3层是RGB 三色的数值。示意图:第二章 图像的镜像变换&

4、#167;1图像的水平方向镜像1.1 对于非彩色图像实现水平镜像操作,我们每次只需提取一列,使其与对称的列交换位置即可:1122j i j i ni nj a a a a a a 其中1j m i =-+原图像经过变换后为:1,1,11,12,2,12,1,1,1 m m m m n m n m n a a a a a a A a a a -=例1:对 132 152 210 99 172 10 23 110 5进行水平方向镜像。132 99 23 A =, 152 172, 110A A =, 210 10, 5A A =210 152 132 10 172 99 5 110 23A = 1

5、.2 对于彩色图像的水平镜像类比二维的操作,我们每次按行选取一个面,将每个面与其列对称的位置交换即可:1,32,3,31,32,3,31,22,2,21,22,2,21,12,1,11,12,1,1 j j n j i i n i j j n j i i n i i i n i j j n j a a a a a a a a a a a a a a a a a a = 其中1j m i =-+原图像经过变换后得:1,2,3223231323311321313122221,2,22222211221212112111112111,2,122121 , , n m m nm n m m nm n

6、n m m nm n n a a a a a a a a a A a a a a a a a a a a a a a a a a a a = 111.3 Matlab 实现 Matlab 源程序disp('Horizontal image by inversion;(水平镜像' str=input('请输入图片名称(例如:Koala.jpg :n','s' imA=imread(str; originalA=size(imA; n=size(originalA; rowA=originalA(1; colA=originalA(2; if n(2

7、=3imB=zeros(rowA,1,3; for i=1:colAimB=imA(:,i,:,imB; end endif n(2=2imB=zeros(rowA,1; for i=1:colAimB=imA(:,i,imB;endendsubplot(1,2,1;imshow(imA;subplot(1,2,2;imshow(imB; Command Window运行: §2图像的垂直方向镜像2.1 与第一节类似的对于非彩色图像实现垂直镜像操作,我们每次只需提取一行,使其与对称的列交换位置即可:1212 j j jn i i in a a a a a a 其中1j m i =-+

8、原图像经过变换后为:,1,2,1,11,21,11,11,21, n n n n n n n n a a a a a a A a a a -=2.2 对于彩色图像的垂直镜像我们每次按列选取一个面,将每个面与其行对称的位置交换即可:,1,3,2,3,3,1,3,2,3,3,1,2,2,2,2,1,2,2,2,2,1,1,2,1,1,1,1,2,1,1 j j j n i i i n j j j n i i i n i i i n j j j n a a a a a a a a a a a a a a a a a a = 其中1j m i =-+原图像经过变换后得:,1,3,2,3,3,1,2,2

9、,2,2,1,1,2,1,12,1,32,2,32,32,1,22,2,22,22,1,12,2,12,11,1,31,2,3 n n n m n n n m n n n m m m m a a a a a a a a a a a a A a a a a a aa a = 1,31,1,21,2,21,21,1,11,2,11,1 m m m a a a a a a a 2.3Matlab实现:Matlab源程序:disp('Vertical image by inversion(垂直镜像'str=input('请输入图片名称(例如:Koala.jpg:n',&

10、#39;s' imA=imread(str;originalA=size(imA;n=size(originalA;rowA=originalA(1;colA=originalA(2;if n(2=3imB=zeros(1,colA,3;for i=1:rowAimB=imA(i,:,:;imB;endendif n(2=2imB=zeros(1,colA;for i=1:rowAimB=imA(i,:;imB;endendsubplot(2,1,1;imshow(imA;subplot(2,1,2;imshow(imB;CommandWindow运行 第三章 图像的旋转变换§

11、;1 图像的旋转变换对于任意n m 的图像矩阵,我们首先创建一个假想矩阵,大小是原矩阵对角线的长度。原矩阵中的中心点为:00,22col row x y =(处理时需取整 假想图像的中心: 00''22x y =(处理时需取整在原图中,点(,x y 关于原点的坐标:00(,x x y y - 假想图中,点(','x y 关于原点的坐标:00(','x x y y -当算法取原矩阵中y 行x 列时进行旋转变换:00'cos sin 'sin cos x x x y y y -=-得到的假想图中的相对坐标再转化为'y 行

12、9;x 列。这时把对应的行列赋值于假想图中:',',y x y x a a = 模型图3.1.1Matlab源程序disp('旋转变换'str=input('请输入图片名称(例如:Koala.jpg:n','s'theta=input('请输入角度theta(单位:度;旋转为逆时针'theta=pi/180*theta;imA=imread(str;originalA=size(imA;n=size(originalA;rowA=originalA(1;colA=originalA(2;maxsize=floor(

13、sqrt(rowA2+colA2;if n(2=2 %如果图像矩阵是2维,进行非彩色图像旋转B=zeros(maxsize,maxsize;x0=colA/2;y0=rowA/2; %获取原图像中心点xe0=maxsize/2;ye0=maxsize/2; %获取假想图像中心点for y=1:rowAfor x=1:colAC=cos(theta,-sin(theta;sin(theta,cos(theta*x-x0;y-y0;xe=floor(C(1;ye=floor(C(2;B(ye+ye0,xe+xe0=imA(y,x;endendendif n(2=3; %如果图像矩阵是3维,进行彩色

14、图像旋转B=zeros(maxsize,maxsize,3;x0=colA/2;y0=rowA/2; %获取原图像中心点xe0=maxsize/2;ye0=maxsize/2; %获取假想图像中心点for y=1:rowAfor x=1:colAC=cos(theta,-sin(theta;sin(theta,cos(theta*x-x0;y-y0;xe=floor(C(1;ye=floor(C(2;B(ye+ye0,xe+xe0,:=imA(y,x,:;endendendsubplot(1,2,1;imshow(imA;hold onsubplot(1,2,2;imshow(uint8(B;

15、CommandWindow 缺陷分析:输出图中出现许多规则分布的空洞,可知在旋转过程中非整数的点被化为整数点时失去一部分点的灰度值,这些灰度值其实可以通过插值弥补,为了使程序较为简单,笔者就没有进行修正。第四章 图像的转置变换§1 非彩色图像的转置(Transpose 变换非彩色图像的转置变换非常简单只需把原图像矩阵转置即可:111212122212m m n n nm a a a a a a A a a a = ,T B A =§2 彩色图像的转置变换因为彩色图像是三维矩阵,我们每次进行一层的转置,最后可以得到全图的转置。1,1,11,2,11,12,1,12,2,12,

16、111,1,1,2,1,1 m m T n n n m a a a a a a A A A a a a =1,1,21,2,21,22,1,22,2,22,222,1,2,2,2,2 m m T n n n m a a a a a a A A A a a a =1,1,31,2,31,32,1,32,2,32,333,1,3,2,3,3 m m T n n n m a a a a a a A A A a a a =Matlab 程序disp('Transpose Of A Image'str=input('请输入图片名称(例如:Koala.jpg :n',

17、9;s' imA=imread(str; originalA=size(imA; n=size(originalA; rowA=originalA(1; colA=originalA(2; if n(2=3imB=zeros(colA,rowA,3;imB(:,:,1=imA(:,:,1'imB(:,:,2=imA(:,:,2'imB(:,:,3=imA(:,:,3' endif n(2=2imB=imA'endsubplot(1,2,1;imshow(imA;subplot(1,2,2;imshow(uint8(imB; CommandWindow 第

18、五章 图像的缩放变换§1 双线性内插法简介在放大、收缩等变换和几何校正的任务重内插是被广泛应用的基本工具。这一节我们主要介绍双线性内插法,为接下来图像的缩放做铺垫。在双线性内插法中,我们用4个最近邻去估计给定位置的灰度。令x ,y 表示想要赋以灰度值的位置,令v 表示灰度值。对于双线性内插,类似线性插值,我们同时对两个自变量进行插值,赋值公如下:11212212212121211222211121212121(,(,(,(,(,(f x y f x y f x y x x y y x x y y x x y y x x y y f x y f x y x x y y x x y y

19、x x y y x x y y -+-+-+-事实上:考虑如下坐标系下四点: 要通过11(,x y ,12(,x y ,21(,x y ,22(,x y 四个点的数值11(,f x y ,12(,f x y ,21(,f x y ,22(,f x y 来表示(,f x y 的值。我们先对x 做2个数据的拉格朗日插值:回忆两个点时的拉格朗日插值(线性插值:12212121(x x x xf x f x f x x x x x -=+- (3.1.1此时f 的值与两个变量有关,我们先选定一个变量为常数,于是 令1y y =,带入(3.1.1 :12121112121(,(,(,x x x xf x

20、 y f x y f x y x x x x -=+- (3.1.2令2y y =,带入(3.1.1:12222122121(,(,(,x x x xf x y f x y f x y x x x x -=+- (3.1.3 再令 (1,2i x x i =:12212121(,(,(,i i i y y y yf x y f x y f x y y y y y -=+- (3.1.4最后把(3.1.2(3.1.3带入(3.1.4得:11212212212121211222211121212121(,(,(,(,(,(f x y f x y f x y x x y y x x y y x x

21、y y x x y y f x y f x y x x y y x x y y x x y y x x y y -+-+-+-这样通过邻近四个点的灰度值可以对目标点估计灰度值。§2 图像的缩放2.1有了双线性内插法作为工具,我们下面来进行图像的缩放变换。假设一个大小500*500的像素的图像要放大1.5倍到750*750的像素。一种简单的思想是,先创建一个假想的750*750网格,它与原始图像有相同的间隔(一般是1,然后将其收缩、压缩,使它精确地与原图像匹配成500*500。显然,收缩后的假想图像的间隔比原图像的间隔要小。每个假想图像的相同间隔的灰度值应该与原图像相等,而假想图像间隔

22、小,所以存在未被赋灰度值的像素点,这时我们采取双线性内插法进行赋值。 2.2Matlab源程序I=imread('Koala .jpg' %读入原图像,只需将此处的文件换成要变换的图片即可rows,cols=size(I;K1 = str2double(inputdlg('请输入行缩放倍数', 'INPUT scale factor', 1, '0.5'K2 = str2double(inputdlg('请输入列缩放倍数', 'INPUT scale factor', 1, '0.4'

23、; width = K1 * rows;height = K2 * cols;Out = uint8(zeros(width,height; %创建输出图像矩阵widthScale = rows/width;heightScale = cols/height;for x = 6:width - 6 % 6是为了防止矩阵超出边界溢出for y = 6:height - 6oldX = x * widthScale; % oldX,oldY为原坐标,x,y为新坐标oldY = y * heightScale;if (oldX/double(uint16(oldX = 1.0 &&

24、(oldY/double(uint16(oldY = 1.0Out(x,y = I(int16(oldX,int16(oldY;%若oldX,oldY为整数,直接赋值elsea = double(uint16(oldX;b = double(uint16(oldY;x11 = double(I(a,b; % x11 赋值为I(a,bx12 = double(I(a,b+1; % x12 赋值为I(a,b+1x21 = double(I(a+1,b; % x21 赋值为I(a+1,bx22 = double(I(a+1,b+1; % x22 赋值为I(a+1,b+1Out(x,y =uint8(b+1-oldY*(oldX-a*x21+(a+1-oldX*x11+(oldY-b*(oldX-a*x22+(a+1-ol dX*x12; % 用双线性插值计算公式计算endendendimshow(I;figure;imshow(O

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论