资源描述
山东建筑大学信息与电气工程学院学院课程设计说明书
山东建筑大学
课 程 设 计 说 明 书
题 目: 建筑物图像的立体倒影
课 程: 数字图像处理课程设计
院 (部): 信息与电气工程学院
专 业: 电子信息工程
班 级:
学生姓名:
学 号:
指导教师:
完成日期: 2013年6月
14
目 录
目 录 I
摘 要 II
1 设计目的 1
2 设计要求 1
3 设计内容 2
3.1理论依据 2
3.2方案设计 2
3.2.1方案总流程 2
3.2.2图像的垂直镜像 3
3.2.3雾化原理 5
3.3 程序设计 6
3.4 程序调试 7
总结与致谢 9
参考文献 10
附录一 11
程序代码: 11
附录二 12
摘 要
水面倒影图像是非常常见的一种自然景观图像。人的肉眼很容易观察到图像的水面倒影,在视频监控中技术中水面目标的检测方面,识别水面倒影是极具挑战性的课题。目前对水面倒影图像的研究多集中在如何拍摄上,那如何用数字图像处理技术实现倒影的特效是这次我们实验的课题。
利用数字图像处理技术制作倒影效果,可以更好的展现风景图片和建筑物图片的立体效果,达到让欣赏者赏心悦目的效果,实现图像的美化过程。
本次课题使用MATLAB编程实现,通过对实验素材图像垂直镜像方法和水波纹或雾化方法,实现建筑物图像的立体倒影。
关键词:水面倒影;水面检测;建筑物;MATLAB;立体倒影
1 设计目的
一幅M×N个像素的数字图像,其像素灰度值可以用M行、N列的矩阵[G]表示,这样数字图像中的像素与二维数组中的每个元素便一一对应起来。利用数字图像处理课程所学知识,对一幅彩色建筑物图片进行分析,实现图像的垂直镜像,以及水波纹或雾化方法,从而实现建筑物立体倒影效果。增强对课本理论知识的理解,熟练掌握对MATLAB的编程。
2 设计要求
1. 基本教学要求:每人一台计算机,计算机安装matlab、visio等软件。
2. 根据已知设计要求分析建筑物图像的立体倒影系统设计功能,确定建筑物图像的立体倒影的方法。
3. 利用visio软件画出流程图,利用matlab编写实现程序,并进行调试,完成系统软件设计。
3 设计内容
3.1理论依据
一幅彩色图片的一个像素的显示是通过R/G/B三个值组成,建筑物图像的立体倒影效果的实现,需要对图像进行垂直镜像及雾化。将所有行所有列的R分量取出组成一个二维数组,同样的对G分量和B分量进行操作,然后通过对这三个矩阵的数值的位置变化,实现镜像变化,对其数值一定规律的改变替换,实现雾化原理。
3.2方案设计
3.2.1方案总流程
对于建筑物立体倒影的实现从整体上把握应该分为以下几个步骤:
(1) 取一幅水建筑物图片作为素材,以下将对此图片操作
(2) 由于原始图片的像素组成一个MxN的二维矩阵,将改矩阵的列数不变,行数 缩小一半。改操作是为了使得到的含有倒影图像的图片大小与原图片大小一致。
(3) 将得到的缩小一半的图片进行上下翻转,得到垂直镜像图片。
(4) 对垂直镜像后的图片进行雾化处理,使此图片看起来像是水中的倒影。
(5) 将雾化后的图片与仅进行了缩小一半的图片进行结合,组成我们所需要的图 片。
(6) 将原始图片与最终得到的图片进行对比。总流程图如图3.2.1所示。
图3.2.1
3.2.2图像的垂直镜像
实现建筑物的立体倒影首先要实现的是图像的上下翻转,由于彩色图像的一个像素通过R\G\B三个值组成的,将所有行所有列的R分量取出组成一个二维数组,同样的对G分量和B分量进行操作,然后对这三个二维数组中的值的位置进行一定规律的改变,具体的用几何语言表述为,在R分量的二维数组中,设点P0(x0, y0) 上下翻转后的对应点为P(x, y),设矩阵的行数为o,列数为p,则其对应关系为:
这样,只要将每个矩阵中的各个点都一一的对应改变,然后他们合成的像素组成上下翻转的图像,即垂直镜像图像。其效果对比图如图3.2.21所示。
(1)原始图片
(2)垂直镜像
图3.2.21垂直镜像效果对比图
其设计流程图如图3.3.22所示
图3.2.22
3.2.3雾化原理
雾化就是过喷嘴或用高速气流使液体分散成微小液滴的操作。就好像是寒冷的冬天用嘴往玻璃上哈气所形成的效果,我们想要通过这种操作实现水面倒影模糊的效果。
我们可以通过哈气的原理推到出我们所需要的雾化的算法:
玻璃上面哈气后,有很多小水滴小水汽之类的,形状不规则,因此发生光折射,由于水滴的不规则性,发生折射也是不规则的,也就是折射光的折射角不确定,但是肯定有个范围,假设有像素A(i,j),(i和j分别表示横坐标和纵坐标),折射后一定几率在A(i+d,j+d)处,(-k<d<k),该点在原来的点为圆心的圆内。
从而得出雾化处理效果算法:
对每个像素A(i,j)进行处理,我们可以随机产生一个数作为圆的半径k,用这个圆内随机点A(i+d,j+d),(-k<d<k)的像素替代。显然,以该点为圆心的圆半径越大,则雾化效果越明显。
其效果对比如图3.2.3所示。
(1)原始图片
(2)雾化图片
图3.2.3雾化效果对比图
3.3 程序设计
本次实验编程用MATLAB实现,因为MATLAB中都有相关的命令,可以直接实现图像的压缩,镜像等。例如
Imresize命令:是调整图像大小的命令。常用格式B = imresize(A,[mrows,mcols],method)其中中括号里是操作后图片的实际大小,method是内插的方法,共三种,'nearest' 'bilinear' 'bicubic'
'nearest'为最近邻内插法,这种方法是把原图像中最近邻的灰度赋给了每个新位置。
'bilinear'为双线性内插法,这种方法是用四个最近邻去估计给定位置的灰度。其数学模型
'bicubic'为双三次内插法,这种方法是用十六个最近邻去估计给定位置的灰度。
Flipdim命令:是镜像命令,实验中我们用过这个命令。常用格式,K = flipdim(J,dim);
当dim为1时,是上下镜像,当dim为2时,是左右镜像。
当然镜像我们还可以通过数学模型,一一对应得到垂直镜像图像。
本次实验编程如附录一所示。
3.4 程序调试
对所写程序进行运行,可以得到正确的倒影图像,只是有时得到的雾化效果明显,有时雾化效果不明显,其对比如图3.4所示。
图3.4
通过上图的对比可以看出其雾化效果有明显的不同,其实这取决于随机半径的不同,随机半径越大,则图像越模糊。而我们就是要通过不断的调试得到最佳的随机半径,从而得到好的雾化效果图。
另外我还选取了不同图片进行处理,得到不同建筑物立体倒影图,见附录二。
总结与致谢
通过本次课程设计,我受益匪浅,第一天我们看到题目后,我进行了简单的分析,首先题目是对题目的理解上,是我们所熟悉的倒影,然后利用数字图像处理课上所学的知识,我发现可以利用图像垂直镜像,及雾化方法处理得到我们所需的图像。后来通过查阅资料以及所学知识,先建立数学模型,然后利用MATLAB编程实现这个模型,从而得到所需图像。在编程中,我还学到了,一些以前不知道的命令,并且熟悉了一些常用的命令,增长了知识。
这使我懂得了,课程设计其实并不困难,我们要做的就是一步一步,将所学知识与实际应用相结合,通过课程设计,即巩固了理论知识又提高了实际操作能力。
当然这过程中遇到了许多困难,在这要感谢老师们的指导,通过他们的指导,帮我解答了许多课程上的问题,还要感谢同学的帮助,对于一些简单的问题,还有一些我的小错误上,他们对我帮助都很大。
参考文献
[1] 冈萨雷斯.数字图像处理(MATLAB)中文版[M].北京:电子工业出版社,2007.
[2] 王大志. 倒影图像检测. 哈尔滨工业大学,2009年6月
[3] 胡溢.微型无人直升机水面检测系统研究[D]. 浙江大学,2007
[4] A.L.Rankin,L.H.Matthies,and A.Huertas.Daytime Water Detection By Fusing Multiple Cues For Autonomous Off-Road Navigation .Jet Propulsion Laboratory, 2004
[5] 徐栋.基于多特征融合的复杂野外环境下水体障碍物的检测[D]. 浙江工商大学,2007
[6] Castleman, K. R.[美]著,朱志刚等译.数字图像处理[M].北京:电子工业出版社,2002.
[7] 朱虹.数字图像处理基础[M].北京:科学出版社,2005.
[8] 刘志敏,扬杰,施鹏飞.数学形态学的图像分割算法[D].计算机工程与科学,1998,20 (4):21.
[9] 章毓晋.图像分割.北京:科学出版社,2001.
[10] 王树伟,杨鸲.Matlab 6.5辅助图像处理[M].电子工业出版社,2003.
附录一
程序代码:
clear all, close all
I = imread('daoying.jpg');
figure,imshow(I)
o=size(I,1);
p=size(I,2);
l=o*0.5;
J = imresize(I,[l,p], 'nearest');%列数不变,行数减半
r=J(:,:,1); %上下翻转
g=J(:,:,2);
b=J(:,:,3);
K=J;
for i=1:l
for j=1:p
K(l-i+1,j,1)=r(i,j);
K(l-i+1,j,2)=g(i,j);
K(l-i+1,j,3)=b(i,j);
end
end
m=size(K,1);
n=size(K,2);
r=K(:,:,1);
g=K(:,:,2);
b=K(:,:,3);
A=K;
for i=2:m-3
for j=2:n-3
k=rand(1)*3 ; %产生一个随机数作为半径
di=i+round(k); %得到随机横坐标
dj=j+round(k); %得到随机纵坐标
A(i,j,1)=r(di,dj); %将原像素点用随机像素点代替
A(i,j,2)=g(di,dj);
A(i,j,3)=b(di,dj);
end
end
B=[J;A]; %将原图像与雾化图像结合
figure,imshow(B)
附录二
展开阅读全文