图形图像处理-图像的几何变换Matlab实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

湖南商学院
课程设计
课程名称图形图像处理
题目图像的几何变换
系部数学与统计学院
专业信息与计算科学
班级信息与计算科学1301
学号
学生姓名
任课教师王勇
2016年月日
目录
第一章绪论
§1 非彩色图像在Matlab中的矩阵 (3)
§2 彩色图像在Matlab中的矩阵 (4)
第二章图像的镜像变换
§1 图像的水平方向镜像 (5)
§2 图像的垂直方向镜像 (8)
第三章图像的旋转变换
§1 图像的旋转变换 (10)
第四章图像的转置变换
§1 非彩色图像的转置变换 (13)
§3 彩色图像的转职变换 (13)
第五章图像的缩放变换
§1 双线性内插法简介 (15)
§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
图1.1
其在Matlab 中的表示:
>> A=imread('Fig3.24.jpg'); >> size(A)
ans = 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 3
A 是一个三维矩阵,768行1024列3层,3层是RG
B 三色的数值。

示意图:
第二章 图像的镜像变换
§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.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,2222
22112212121121
11112111,2,1221
21
,
,
n m m nm n m m nm n 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 ⎡⎤⎡⎤⎢⎥⎢
⎥=⎢⎥⎢⎥⎢⎥⎢⎥
⎣⎦⎣⎦11⎡⎤
⎡⎤⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦⎣⎦
1.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)==3
imB=zeros(rowA,1,3); for i=1:colA
imB=[imA(:,i,:),imB]; end end
if n(2)==2
imB=zeros(rowA,1); for i=1:colA
imB=[imA(:,i),imB];
end
end
subplot(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 =-+
原图像经过变换后为:
,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,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 a a 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','s'); imA=imread(str);
originalA=size(imA);
n=size(originalA);
rowA=originalA(1);
colA=originalA(2);
if n(2)==3
imB=zeros(1,colA,3);
for i=1:rowA
imB=[imA(i,:,:);imB];
end
end
if n(2)==2
imB=zeros(1,colA);
for i=1:rowA
imB=[imA(i,:);imB];
end
end
subplot(2,1,1);
imshow(imA);
subplot(2,1,2);
imshow(imB);
CommandWindow运行
第三章 图像的旋转变换
§1 图像的旋转变换
对于任意n m ⨯的图像矩阵,我们首先创建一个假想矩阵,大小是原矩阵对角线的长度。

原矩阵中的中心点为:
00,22
col row x y =
=(处理时需取整) 假想图像的中心:
2222
00','22
col row col row x 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 行'x 列。

这时把对应的行列赋值于假想图中:
',',y x y x a a =
模型图3.1.1
Matlab源程序
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(sqrt(rowA^2+colA^2));
if n(2)==2 %如果图像矩阵是2维,进行非彩色图像旋转B=zeros(maxsize,maxsize);
x0=colA/2;y0=rowA/2; %获取原图像中心点
xe0=maxsize/2;ye0=maxsize/2; %获取假想图像中心点
for y=1:rowA
for x=1:colA
C=[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);
end
end
end
if n(2)==3; %如果图像矩阵是3维,进行彩色图像旋转B=zeros(maxsize,maxsize,3);
x0=colA/2;y0=rowA/2; %获取原图像中心点
xe0=maxsize/2;ye0=maxsize/2; %获取假想图像中心点
for y=1:rowA
for x=1:colA
C=[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,:);
end
end
end
subplot(1,2,1);
imshow(imA);
hold on
subplot(1,2,2);
imshow(uint8(B));
CommandWindow
缺陷分析:
输出图中出现许多规则分布的空洞,可知在旋转过程中非整数的点被化为整数点时失去一部分点的灰度值,这些灰度值其实可以通过插值弥补,为了使程序较为简单,笔者就没有进行修正。

第四章 图像的转置变换
§1 非彩色图像的转置(Transpose )变换
非彩色图像的转置变换非常简单只需把原图像矩阵转置即可:
111212122
212
m 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,,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','s'); imA=imread(str); originalA=size(imA); n=size(originalA); rowA=originalA(1); colA=originalA(2); if n(2)==3
imB=zeros(colA,rowA,3);
imB(:,:,1)=imA(:,:,1)';
imB(:,:,2)=imA(:,:,2)';
imB(:,:,3)=imA(:,:,3)'; end
if n(2)==2
imB=imA';
end
subplot(1,2,1);
imshow(imA);
subplot(1,2,2);
imshow(uint8(imB)); CommandWindow
第五章 图像的缩放变换
§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 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 x
f x f x f x x x x x --=
+-- (3.1.1)
此时f 的值与两个变量有关,我们先选定一个变量为常数,于是 令1y y =,带入(3.1.1) :
12121112121
(,)(,)(,)x x x x
f x y f x y f x y x x x x --=+-- (3.1.2)
令2y y =,带入(3.1.1):
12222122121
(,)(,)(,)x x x x
f x y f x y f x y x x x x --=
+-- (3.1.3) 再令 (1,2)i x x i ==:
12212121
(,)(,)(,)i i i y y y y
f 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 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。

显然,收缩后的假想图像的间隔比原图像的间隔要小。

每个假想图像的相同间隔的灰度值应该与原图像相等,而假想图像间隔小,所以存在未被赋灰度值的像素点,这时我们采取双线性内插法进行赋值。

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'})); 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 - 6
oldX = x * widthScale; % oldX,oldY为原坐标,x,y为新坐标
oldY = y * heightScale;
if (oldX/double(uint16(oldX)) == 1.0) && (oldY/double(uint16(oldY)) == 1.0)
Out(x,y) = I(int16(oldX),int16(oldY));%若oldX,oldY为整数,直接赋值
else
a = double(uint16(oldX));
b = double(uint16(oldY));
x11 = double(I(a,b)); % x11 赋值为I(a,b)
x12 = double(I(a,b+1)); % x12 赋值为I(a,b+1)
x21 = double(I(a+1,b)); % x21 赋值为I(a+1,b)
x22 = double(I(a+1,b+1)); % x22 赋值为I(a+1,b+1)
Out(x,y) =
uint8((b+1-oldY)*((oldX-a)*x21+(a+1-oldX)*x11)+(oldY-b)*((oldX-a)*x22+(a+1-ol dX)*x12)); % 用双线性插值计算公式计算
end
end
end
imshow(I);
figure;
imshow(Out);
CommandWindow运行:
原图行列分别缩小为0.5,0.4
原图行列分别放大为2,2
第六章 图像的平移变换
我们先创建一个假想图空间域,行列大小都是原图像的1.5倍。

先获取原图像的y 行x 列。

想要平移距离:x ∆,y ∆ 原矩阵中的中心点为:
00,22
col row x y =
=(处理时需取整) 假想图像的中心:
001.5 1.5','22
col row x y =
=(处理时需取整) 在原图中,点(,)x y 关于原点的坐标:00(,)x x y y -- 平移后假想图中对应坐标:s
00''x x x x x =-++∆,00''y y y y y =-++∆
对应的元素替换:
',',y x x y a a =
Matlab 程序 disp('平移变换');
str=input('请输入图片名称(例如:Koala.jpg ):\n','s'); xm=input('请输入x 轴平移距离'); ym=input('请输入y 轴平移距离'); imA=imread(str); originalA=size(imA); rowA=originalA(1); colA=originalA(2);
imB=zeros(1.5*rowA,1.5*colA); x0=colA/2;y0=rowA/2;
xe0=(1.5*colA)/2;ye0=(1.5*rowA)/2; for x=1:colA
for y=1:rowA
ye=floor(y-y0+ye0+ym);xe=floor(x-x0+xe0+ym); imB(ye,xe)=imA(y,x); end end
subplot(1,2,1); imshow(imA); hold on
subplot(1,2,2);
imshow(uint8(imB));
CommandWindow
右下方平移60,50。

相关文档
最新文档