您好,欢迎来到华佗小知识。
搜索
您的当前位置:首页计算机科学与技术专业综合实习报告

计算机科学与技术专业综合实习报告

来源:华佗小知识


计算机科学与技术专业综合实习报告

题目: 图像轮廓跟踪算法设计与实现

学 生: 别 佳 学 号: ********* 指导教师: *** 日 期: 2008年11月16日

目 录

一:实践目标 .................................................................................... 3 二:图像轮廓跟踪算法原理 ............................................................ 3 三:开发工具 .................................................................................... 3 四:数据结构描述 ............................................................................ 3

1:链码................................................................................................. 3 2:链码方向的旋转 ............................................................................ 4 3:链码的寻址 .................................................................................... 4 4:图像矩阵 ........................................................................................ 4

五:算法描述 .................................................................................... 4 六:程序运行结果 ............................................................................ 7 七:问题与不足 ................................................................................ 9 八:老师评语 .................................................................................... 9

2

图像轮廓跟踪算法设计与实现

一:实践目标

1:设计图像轮廓跟踪算法,并寻找图像的轮廓。

2:以矩阵为例,寻找矩阵的边界。验证轮廓跟踪算法设计。

二:图像轮廓跟踪算法原理

1:利用区域边界点搜索区域轮廓的方法。原理是从某一边界点出发,通过沿着一个方向(顺时针)不断搜索下一个轮廓点的方法,得到区域的完整轮廓。 轮廓跟踪算法的关键是寻找下一个边界点

2:寻找下一个边界点的方法:

① 按照水平向右的方向逐行寻找第一个值为1的起始点(如果第一行中第一个起始点没有找到,则从第二行、第三行…开始寻找直到找到第一个起始点)。

② 将水平向右的方向逆时针旋转145°。再按照每次顺时针旋转45°寻找其周围的像素点是否存在,如果不存在继续旋转45°;如果存在,当它的值为0时继续旋转45°,如果为1时,则此点位边界点,停止旋转。

③ 记录进入该边界点的方向,再按照逆时针旋转145°。再按照每次顺时针旋转4寻找此周围的像素点是否存在,如果不存在继续旋转45°;如果存在,当它的值为0时继续旋转45°,如果为1时,则此点位边界点,停止旋转。

④ 继续③,直到最后一个边界点为第一个起始点,则算法结束。

三:开发工具

Microsoft Visual C++ 四:数据结构描述

1:链码、

链码将中心像素邻域内的8个点逆时针方向编码,其对应编码与方向编码完全相同。

3

3 2 1 4 * 0 55 6 7 2:链码方向的旋转 从上图可以看出,方向按逆时针旋转45度,链码值加1,若链码值大于7时,则其以8取模就可以得到正确的链码。若取相反的方向,可以对链码值加4得到,给链码值加8可以回到原方向。 3:链码的寻址 通过中心像素临近像素的过程,叫做链码的寻址。链码的寻址是通过中心像素坐标加上偏移向量表来实现的。这个过程经常借助偏移向量来实现的。 下图为获得中心像素的偏移向量表,表中按照链码的顺序给出了八方向的X,Y偏移量,偏移向量表可利用二维数组directData[8][2]来实现。 偏移向量表(directData[8][2]) 链码 X偏移 Y偏移 0 1 0 1 1 -1 2 0 -1 3 -1 -1 4 -1 0 5 -1 -1 6 0 1 7 1 1 4:图像矩阵 用二维矩阵Image[N][N]来表示图像。 五:算法描述 1:初始矩阵如图所示,以方框内部的像素点为起始边界点。 4

2:起始点为中心像素点,搜索边界点搜索过程如下图

5

3:搜索到符合条件的像素点,令代表此像素点的值为7(为边界点) 然后以此像素点为新的起始点重新搜索。

6

4:当搜索回到第一个起始点,算法结束。如下图

7

六:程序运行结果

8

七:问题与不足

1:仅对单区域进行跟踪,没能实现多个区域的跟踪。 解决方法:①用一个一维数组来表示已访问的区域。 ②当对一个区域搜索完成以后,检索数组。

③对没有访问的区域进行轮廓跟踪。直到所有区域访问完成。

2:如果起始点为第一行(最后一行)、第一列(最后一列)中的元素, 由于它不能构成八邻域。则算法条件不满足。

解决方法:可在整个矩阵中增加两行(分别作为第一行、最后一行)、两列(第一列、最后一列)。

参考文献

注:1、计算机数据与图形处理;化学工业出版社;贾志刚

2、计算机图形学理论与实践;北京航空航天大学出版社;李春雨

3:数字图像处理开发入门与编程实践;电子工业出版社;左飞,万晋森,刘航

9

八:老师评语 10

九:部分代码

#include\"iostream.h\" #define N 7

int Image[N][N]={ {0,0,0,1,1,0,0}, {0,0,1,0,1,1,0}, {0,0,1,1,1,1,0}, {0,1,1,1,1,1,0}, {0,0,1,1,1,1,0}, {0,0,0,1,0,1,0}, {0,0,0,0,0,0,0} };//图像矩阵

int main(int argc, char* argv[]) {

int i,j,k,m; int

directData[8][2]={{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1,1},{0,1},{1,1}};//链码向量表

int x,y;//某一边界点的位置(坐标值) int nx,ny;//搜索到的轮廓点的值 int F_x,F_y;//起始点的坐标 int index;

int startindex;//起始链码 cout<<\"原图像\"<for(j=0;jcout<cout<for(i=0;ifor(j=0;j11

if(Image[i][j]==1) {

x=F_x=j;y=F_y=i,k=0;

break; } }

if(k==0)break; }

index=0;

do //轮廓跟踪算法

//循环搜索下一边界点,直到回到起始点 {

m=0;//对边界点进行搜索时,用来判断是否为第一个搜索到的1(边界点) startindex=index+3+8; //对此边界点周围进行搜索时的起始链码 for(i=0;i<=7;i++) {

index=(startindex-i)%8;//进入搜索到的该轮廓点的链码 nx=x+directData[index][0];

ny=y+directData[index][1];//得到搜索的轮廓点在矩阵中的位置

if(Image[ny][nx]==1)//判断矩阵元素值为一,如果是,则为找到的边界点.令该边界点在矩阵中的元素值为7 {

Image[ny][nx]=7;

m=1; //表示此次循环结束.

x=nx;y=ny; //保存搜索到的边界点坐标值 }

if(m==1)break;//搜索结束,跳出循环。 }

}

while(x!=F_x||y!=F_y); cout<<\"轮廓为:\"<for(j=0;jif(Image[i][j]==7)cout<<\"*\"<<\" \"; else

cout<<\" \"<<\" \"; }

cout<12

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo0.cn 版权所有 湘ICP备2023017654号-2

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务