数据结构案例教学_二叉树在图像分割中的应用_刘国英
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
130
安阳师范学院学报
2016 年
Forest = ( BestBiTree) malloc( m* sizeof( BTNode) ) ;
double disMatrix[m][m]; / / 根结点距离矩 阵,取值越小,树的灰度越接近
for( i = 0; i < m; i + + ) { Forest[i]. parent = 0; for( j = 0; j < m; j + + ) { disMatrix[i][j] = Inf; } } for( i = 0; i < n; i + + ) { Forest( i) = { i,gId[i],dFreq[i],0,0,0} ; for( j = i + 1; j < n; j + + ) { disMatrix[i][j] = abs( gId[i]- gId[j]) ; / / 计算初始的相似度取值 } / / 创建 Forest 中的每棵二叉树 for( i = n; i < m; i + + ) { / / 选择根结点灰度值最接近的两棵树 tree1, tree2 [tree1,tree2] = selectTree ( Forest,disMatrix,i) ; Forest[tree1]. parent = Forest[tree2]. parent = i; Forest[i]. pxlNumber = Forest[tree1]. pxlNumber + Forest[tree2]. pxlNumber; Forest[i]. lchild = tree1; Forest[i]. rchild = tree2; Forest[i]. rootId = i; Forest[i]. meanValue = ( Forest[tree1]. pxlNumber* Forest[tree1]. meanValue + Forest[tree2]. pxlNumber* Forest[tree2]. meanValue ) / Forest[i]. pxlNumber; / / 更新 disMatrix 取值 for( j = 1; j < i - 1; j + + ) { disMatrix[j][i] = abs( Forest[j]. meanValue - Forest[i]. meanValue) ; } } / /从构造的二叉树森林中获取分割结果 cls = 1; for( i = 0; i < m; i + + ) { if( Forest[i]. parent = = 0) / / 节点 i 为树根
第2 期
刘国英,王煜龙,陈双浩: 数据结构案例教学—二叉树在图像分割中的应用
129
每个结点,使得每个结点均被访问一次,而且仅被 访问一次[6]。由二叉树的递归定义可知,二叉树 是由 3 个基本单元组成: 根节点、左子树和右子 树。因此,二叉树的遍历即为按照某种顺序依次 访问这三部分的算法。根据根结点的访问次序, 有三种二叉树遍历方法: 先序遍历、中序遍历和后 序遍历。先序遍历是指先访问根节点,再依次遍 历左子树和右子树。中序遍历是指先遍历左子 树,再访问根结点,最后遍历右子树。后序遍历指 先依次遍历左子树和右子树,最后再访问根结点。
2 基于最优二叉树的图像分割案例
2. 1 分割算法设计 假设待分割图像表示为像素集合{ Pi | i = 1,
2,…,N} ,其中 N 为图像的像素个数。为了减少 算法处理的数据量,本案例教学设计的分割方法 针对灰度图像的 256 个灰度值进行处理。假设分 割的类别数为 K,基于二叉树进行图像分割的算 法描述如下:
数据结构案例教学—二叉树在图像分割中的应用
刘国英,王煜龙,陈双浩
( 安阳师范学院 计算机与信息工程学院,河南 安阳 455002)
[摘要]数据结构是计算机相关专业的核心基础课。掌握数据结构有关知识对学生进一步学习后续课程起着至关
重要的作用,有助于提高学生设计复杂软件的能力。然而,传统的教学方法过于强调抽象数据类型的定义及对应的实现
1 基本知识
不重叠的图像区域,并要求图像区域内部的像素 具有相同的属性,比如颜色和纹理。在图像分割 中,获得的图像区域个数就成为图像的类别数。
二叉树是指树种任一结点的度小于 2 的树, 即任一结点最多有两棵子树,并且二叉树的子树 有左右之分,其次序不能颠倒[6]。这表明二叉树 或为空,或为一个根节点加上两棵分别称为左子 树和右子树的、互不相交的二叉树组成。这两棵 子树也 是 二 叉 树。 因 此,二 叉 树 是 递 归 定 义 的。 因为二叉树不同子树上的节点是互不相交的,这 与图像分割中各个分割区域之间互不重叠的要求 是一致的。所以,利用二叉树的性质设计图像分 割算法符合该研究问题的特点。 1. 2 二叉树的遍历
当前,多媒体智能信息处理技术一直引领计 算机学科的发展。其中,图像分割是图像及视频 信息处理的一个基础研究课题,在遥感、农业、军 事等领域应用非常广泛。图像分割技术的深入研 究对数据结构理论体系的发展和应用提出了更高 的 要 求。 很 多 人 在 图 像 分 割 领 域 进 行 了 研 究[2 - 5]。因此,为了拓展学生的知识面,提高学生 学习的热情,本文以图像分割为背景,设计数据结 构中二叉树的案例教学方法。
方法,而使得让学生觉得枯燥和困难。本文以二叉树在图像分割中的应用为案例,利用最优二叉树的性质、二叉树的遍
历方法等知识点,设计图像分割算法,并进行了简单分析。教学实践百度文库明,数据结构的案例教学比传统教学更能提高教
学质量。
[关键词]数据结构; 二叉树; 图像分割; 案例教学
[中图分类号]G642
[文献标识码]A
InitSet( leavesSet) ; / / 将叶子结点集合 leavesSet 初始化为空集合
PreOrderTrevers ( Forest,i,leavesSet) ; / / 先 序 遍历获得叶子结点集合
setNumber = Length( leavesSet) ; / / 获得集合 大小
对图像分割的研究一直是图像处理中的重点 和热点[2]。图像 分 割 的 目 的 是 将 图 像 划 分 为 互
结构,是学生必须掌握的一个知识点。然而,该结 构相对线性结构更加抽象和复杂,常用教材中采 用 的 案 例 非 常 少,这 对 学 生 理 解 产 生 巨 大 障 碍。 虽然有教师设计了不同的案例方法[1],但仍然显 不够。
的一个分割区域。对每一棵二叉树执行叶子结点 的遍历操作,即可获得对应类别在图像中的真实 分割区域。 2. 2 算法顺序表示与实现
为了运算简便,在执行步骤( 2) 时,本文采用 如下准则进行二叉树选择: 两个根结点对应图像 区域的灰度均值最接近。为此,在本案例中,我们 设计如下的最优二叉树结点结构:
typedef struct{ int rootId; / / 该结点的存储索引 double meanValue; / / 灰度均值 int pixlNumber; / / 以该结点为根的像素个数 unsigned int parent,lchild,rchild; / / 父结点、 孩子结点在二叉节点列表中的存储位置 } BTNode,* BestBiTree; 对应的森林 F 存储在结构体数组中,大小为 2n - K - 1。上述结构体中的三个整形变量表示 每一个结点的父结点、左右孩子在结构体数组中 的存储单元下标。如果某一结点的父结点为 0, 表示该结点为树的根结点; F 中树的个数表示当 前图像的分割类别数。因此,构造最优二叉树的 过程就是图像分割的过程。图像分割的算法实现 如下: void BestTreeSegmentation ( double * pImage, double * pSegmentation,int width,int height,int K) / / pImage 为 指 向 灰 度 图 像 数 据 的 指 针, pSegmentation 为分割结果指针 / / width 和 height 为图像的高和宽,K 为图像 的分类个数 { if ( K < 2) return; if( pSegmentation = = NULL) return; int n = 256; / / 图像灰度级的总个数 / / 统计每一灰度级出现的频度,gFred[i]为 灰度 gId[i]在图像中出现的次数 [gFreq, gId] = imgHist ( pImage, width, height) ; / / 统计每一灰度级对应的像素集合,pxlSet [i]为灰度级 gId[i]对应的像素位置集合的指针 pxlSet = GetPixelSet ( pImage, gId, width, height) ; int m = 2* n - 1 - K; / / 获取最终分割结果 时,F 中总共的结点个数
[文章编号]1671 - 5330( 2016) 02 - 0128 - 04
DOI:10.16140/j.cnki.1671-5330.2016.02.033
数据结构是计算机及相关专业的一门核心课
1. 1 图像分割与二叉树结构
程,对学生深入学习计算机专业知识具有至关重 要的作用。二叉树作为一种应用极其广泛的数据
遍历二叉树是指按照某条搜索路径巡访树中
[收稿日期]2016 - 01 - 01 [基金项目]计算机科 学 与 技 术 国 家 级 特 色 专 业 ( TS11576 ) ; 国 家 自 然 科 学 基 金 ( 41001251 ) ; 河 南 省 科 技 公 关 项 目 ( 152102410042、132102210212) ; 河南省教育厅资助项目( 13A520011) ; 河南省青年骨干教师项目( 2011 - 148) ; 安阳师范 学院《数据结构》精品资源共享课程。 [作者简介]刘国英( 1979 - ) ,男,博士,副教授,主要从事遥感影像信息提取研究。
InitSet( treePixelSet) ; / / 初 始 化 一 个 空 的 集 合,用来存储像素的索引
for( j = 0; j < setNumber; j + + ) { / /合并同一棵树的叶子结点对应的像素索引 集合 treePixelSet = union ( treePixelSet, pixelSet [leavesSet[j]]) ; } / / 将 pSegmentation 中的在 treePixelSet 中的 像素索引位置均设为 cls setValues( pSegmentation,treePixelSet,cls) ; cls + + ; } } 先序遍历算法的伪代码如下: void PreOrderTravers ( BestBiTree Forest, int root,int * &pixelSet) { if ( Forest [root]. lchild = = 0 && Forest [root]. rchild = = 0) pixelSet = union( pixelSet,Forest[root]. rootId) ; else{ PreOrderTravers ( Forest, Forest [i]. lchild, pixelSet) ; PreOrderTravers ( Forest, Forest [i]. rchild, pixelSet) ; } } 2. 3 案例算法运行结果 为了检验案例算法的分割效果,在教学过程 中我们选用一幅大小为 256 * 256 的全色遥感影 像进行算法测试。实验中,我们设定类别数 K = 6,对应的分割结果如图 1 所示。分割结果使用彩 色表示是为了增加不同类别之间的视觉差别。从 图中可以看出,使用二叉树结构进行图像分割能 够完成图像分割所要求的功能。
本文的案例教学中,在获得图像分割过程所 对应的二叉树后,使用先序遍历的方法确定每一 结点属于哪个类别,并生成最终的分割结果。 1. 3 最优二叉树
最优二叉 树 是 指 带 权 路 径 长 度 最 小 的 二 叉 树,又称作赫夫曼树[6]。在该树种没有度为 1 的 结点。因此,一个有 n 个叶子结点的最优二叉树 共有 2n - 1 个结点。因为,在构造最优二叉树后, 经常需要从叶子结点出发寻找一条到根结点的路 径。比如,赫夫曼编码时需要根据从根结点到叶 子结点的路径来确定编码,本文案例教学所用的 图像分割实例也需要依据从叶子结点到根结点的 路径来确定叶子节点对应像素所在的类别。为 此,在最优二叉树的结点结构中,除了包含所需的 数据信息外,一般还包含三个指针: 父结点指针 、 左子树指针和右子树指针。增加父结点指针为访 问父结点提供了便利。
( 1) N 个像素构成 N 棵二叉树的集合 F = { T1,T2,…,TN} ,其中每棵二叉树只有一个根节 点,其左右子树均为空;
( 2) 采用一定的策略,在 F 中选取两棵树作 为左右子树构造一棵新的二叉树;
( 3) 在 F 中删除这两棵树,同时将新得到的 二叉树加入 F 中;
( 4) 重复( 2) 和( 3) ,直到 F 中包含的二叉树 的个数为 K。这时,F 中每一棵二叉树对应图像