数字图像处理课程设计题目图像的几何变换重建系 (部) 信息工程系班级姓名学号指导教师2013 年 12 月 16 日至 12 月 27 日共 2 周2013年 12 月 27 日数字图像处理课程设计任务书课程设计成绩评定表目录1 引言 (4)1.1课程设计的目的........................... 错误!未定义书签。
1.2课程设计的任务........................... 错误!未定义书签。
1.3课程设计的要求........................... 错误!未定义书签。
1.4开发工具................................. 错误!未定义书签。
2设计内容 (4)2.1设计内容 (4)2.2 系统框图 (4)3 设计方案 (5)3.1功能模块的划分 (5)3.2算法描述 (5)3.3实现主要功能的原理和方法 (8)3.3.1最近邻域插值法 (8)3.3.2双线性插值法 (8)4功能模块的具体实现 (10)4.1 模块功能 (10)4.2流程图 (11)4.3程序清单及各模块的实现效果图 (11)4.4 系统仿真与调试 (21)5 总结与体会 (22)参考文献 (22)附录 (23)1 引言2设计内容2.1设计内容我选取的是图像的几何变换,设计内容如下,(1)能够读取和存储图像。
(2)实现图像的平移、缩放、旋转几何变换。
(3)分别采用最近邻插值和双线性插值技术进行图像重建。
(4)编写代码实现上述功能。
图2-1系统框图本次课设所做的图像几何变换包括平移变换、缩放变换和旋转变换。
缩放变换和旋转变换均用双线性插值变换和最近邻插值变换两种方法来做,对图像进行处理后再存储。
3 设计方案3.1功能模块的划分本次设计整体分为四大模块:原图、平移、缩放和旋转。
其中缩放和旋转又分别有双线性插值和最近邻插值两模块。
3.2算法描述图像比例缩放是指将给定的图像在x 轴方向按比例缩放fx 倍,在y 轴按比例缩放fy 倍,从而获得一幅新的图像。
如果fx=fy ,即在x 轴方向和y 轴方向缩放的比率相同,称这样的比例缩放为图像的全比例缩放。
如果fx ≠fy ,图像的比例缩放会改变原始图象的像素间的相对位置,产生几何畸变。
设原图像中的点P 0(x 0,y 0)比例缩放后,在新图像中的对应点为P(x,y),则比例缩放前后两点P 0(x 0,y 0)、P(x,y)之间的关系用矩阵形式可以表示为⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡=⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡11000000100y x fy fx y x (3-1)其逆运算为⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡⋅⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡=⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡1100010001100y x fy fxy x (3-2)即⎪⎪⎩⎪⎪⎨⎧==fy yy fx x x 00 (3-3) 比例缩放所产生的图像中的像素可能在原图像中找不到相应得像素点,这样就必须进行插值处理。
下面首先讨论图像的比例缩小。
最简单的比例缩小时当fx=fy=0.5时,图像被缩到一半大小,此时缩小后图像中的(0,0)像素对应于原图像中的(0,0)像素;(0,1)像素对应于原图像中的(0,2)像素;(1,0)像素对应于原图像中的(2,0)像素,以此类推。
图像缩小之后,因为承载的数据量小了,所以画布可相应缩小。
此时,只需在原图像基础上,每行隔一个像素取一点,每隔一行进行操作,即取原图的偶奇数行和偶奇数列构成新的图像。
如果图像按任意比例缩小,则需要计算选择的行和列。
如果M×N 大小的原图像F(x,y)缩小为kM×kN 大小的新图像I(x,y)时,则I(x,y)=F(int(c×x),int(c×y)) (3-4)其中,c=1/k 。
由此公式可以构造出新图像。
当fx ≠fy 时,图像不按比例缩小,这种操作因为在x 方向和y 方向的缩小比例不同,一定会带来图像的几何畸变。
图像不按比例缩小的方法是:如果M×N 大小的旧图F(x,y)缩小为k 1M×k 2N 大小的新图像I(x,y)时,则I(x,y)=F(int(c 1×x),int(c 2×y)) (3-5)其中c 1=1/k 1,c 2=1/k 2,由此公式可以构造出新图像。
图像的缩小操作中,是在现有的信息里如何挑选所需要的有用信息。
而在图像的放大操作中,则需要对尺寸放大后所多出来的空格填入适当的像素值,这是信息的估计问题,所以较图像的缩小要难一些。
当fx=fy=2时,图像被按全比例放大二倍,放大后图像中的(0,0)像素对应于原图中的(0,0)像素;(0,1)像素对应于原图中的(0,0.5)像素,该像素不存在,可以近似为(0,0)也可以近似为(0,1);(0,2)像素对应于原图像中的(0,1)像素;(1,0)像素对应于原图中的(0.5,0),它的像素值近似于(0,0)或(1,0)像素;(2,0)像素对应于原图中的(1,0)像素,依此类推。
其实这是将原图像每行中的像素重复取值一遍,然后每行重复一次。
按比例将原图像放大k 倍时,如果按照最近邻域法则需要将一个像素值添在新图像的k×k 的子块中。
显然,如果放大倍数太大,按照这种方法处理会出现马赛克效应。
当fy fx ≠)0,(>fy fx 时,图像在x 方向和y 方向不按比例放大,此时这种操作由于x 方向和y 方向的放大倍数不同,一定会带来图像的几何畸变。
放大的方法是将原图像的一个像素添到新图像的一个21k k ⨯的子块中去。
为了提高几何变换后的图像质量,常采用线性插值法。
该方法的原理是,当求出的分数地址与像素点不一致时,求出周围四个像素点的距离比,根据该比率,由四个邻域的像素灰度值进行线性插值。
旋转。
一般图像的旋转是以图像的中心为原点,旋转一定的角度,也就是将图像上的所有像素都旋转一个相同的角度。
旋转后图像的的大小一般会改变,即可以把转出显示区域的图像截去,或者扩大图像范围来显示所有的图像。
图像的旋转变换也可以用矩阵变换来表示。
设点),(000y x P 逆时针旋转θ角后的对应点为),(y x P 。
那么,旋转前后点),(000y x P 、),(y x P 的坐标分别是:⎩⎨⎧==ααcos cos 00r y r x (3-6) ⎩⎨⎧+=+=+=-=-=+=θθθαθαθαθθθαθαθαcos sin sin cos cos sin )sin(sin cos sin sin cos cos )cos(0000y x r r r y y x r r r x (3-7)写成矩阵表达式为⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡-=⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡11000cos sin 0sin cos 100y x y x θθθθ (3-8)其逆运算为 ⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡-=⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡11000cos sin 0sin cos 100y x y x θθθθ (3-9) 利用上述方法进行图像旋转时需要注意如下两点:(1)图像旋转之前,为了避免信息的丢失,一定要有坐标平移。
(2)图像旋转之后,会出现许多空洞点。
对这些空洞点必须进行填充处理,否则画面效果不好,一般也称这种操作为插值处理。
以上所讨论的旋转是绕坐标轴原点(0,0)进行的。
如果图像旋转是绕一个指定点(a,b)旋转,则先要将坐标系平移到该点,再进行旋转,然后将旋转后的图象平移回原来的坐标原点,这实际上是图像的复合变换。
如将一幅图像绕点(a,b)逆时针旋转θ度,首先将原点平移到(a,b),即⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡--=1001001b a A (3-10) 然后旋转⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡-=0000cos sin 0sin cos θθθθB (3-11) 然后再平移回来 ⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡=1001001b a C (3-12)综上所述,变换矩阵为A B C T ⋅⋅=。
3.3实现主要功能的原理和方法3.3.1最近邻域插值法最近邻域插值法:它输出的像素灰度值就等于距离它映射到的位置最近的输入像素的灰度值,取离I(i/b,j/a,k)最近的整数点的灰度值为点I(i/b,j/a,k)的灰度值。
取最近整数点用四舍五入。
在许多情况下,最近邻插值的结果可以令人接受。
最邻近点插值取插值点的4个邻点中距离最近的邻点灰度值作为该点的灰度值。
设插值点(i,j)到周边4个邻点f k(i,j)(k =1,2,3,4)的距离为d k(k =1,2,3,4),则:g(i,j)=f k(i,j),d l=min{d1,d2,d3,d4},l=1,2,3,4。
最近邻点插值的一个隐含的假设条件是任一网格点p(x,y)的属性值都使用距它最的位置点的属性值,用每一个网格节点的最邻点值作为待的节点值[3]。
当数据已经是均匀间隔分布,要先将数据转换为SURFER的网格文件,可以应用最近邻点插值法;或者在一个文件中,数据紧密完整,只有少数点没有取值,可用最近邻点插值法来填充无值的数据点。
有时需要排除网格文件中的无值数据的区域,在搜索椭圆(SearchEllipse)设置一个值,对无数据区域赋予该网格文件里的空白值。
设置的搜索半径的大小要小于该网格文件数据值之间的距离,所有的无数据网格节点都被赋予空白值。
在使用最近邻点插值网格化法,将一个规则间隔的XYZ数据转换为一个网格文件时,可设置网格间隔和XYZ数据的数据点之间的间距相等。
最近邻点插值网格化法没有选项,它是均质且无变化的,对均匀间隔的数据进行插值很有用,同时,它对填充无值数据的区域很有效。
3.3.2双线性插值法双线性插值法:它是利用了需要处理的原始图像像素点周围的四个像素点的相关陛,通过双线眭算法计算得出的。
对于一个目的坐标,通过向后映射法得到其在原始图像的对应的浮点坐标(i+u,j+v),其中i,j均为非负整数,u,v为[0,l]区间的浮点数,则这个像素的值f(i+u,j+v)可由原图像中坐标为(I,j)、(i+l,j)、(i,j+1)、(i+1,j+1)所对应的周围四个像素的值决定,即:f(i+u,j+v)=(1-u)×(1-v)×f(,j)+(1-u)×v×f(i,j+1)+u×(1-v)×f(i+l,j)+u×v×f(i+,j+1),其中f(i,j)表示源图像(i,j)处的的像素值,以此类推,这就是双线性插值法。
如图3-1所示,已知(0,0)、(0,1)、(1,0)、(1,1)四点的的灰度,可以由相邻像素的灰度值f(0,0)和f(1,0)在X方向上线性插值求出(x,0)的灰度f(x,0),由另外两个相邻像素f(0,1)和f(1,1)在X方向上线性插值可求出(x,1)的灰度f(x,1),最后由f(x,0),f(x,1)在Y方向上进行线性插值就可以得到(x,y)的灰度f(x,y)。