基于区域增长的连通域标记算法的优化

基于区域增长的连通域标记算法的优化
基于区域增长的连通域标记算法的优化

第32卷第2期2011年3月

闽江学院学报

JOURNAL OF MINJIANG UNIVERSITY

Vol.32No.2

Mar.2011

基于区域增长的连通域标记算法的优化

罗志灶,周赢武,郑忠楷

(1、闽江学院物理学与电子信息工程系福建福州350108)

摘要:与以往基于区域增长的连通域标记算法用目标点作为种子不同,优化算法将游程作为种子,结合游程和种子算法的优点,减少种子的数量和目标点邻域的搜索次数.实验表明,本算法能有效地减少算法冗余操作,明显提高效率,且性能优于其它算法.

关键词:二值图像;连通域;区域增长;标记算法

中图分类号:TP391文献标识码:A文章编号:1009-7821(2011)02-0041-04 Optimizing the algorithm of labeling connected components based on region-growth

LUO Zhi-zao,ZHOU Ying-wu,ZHENG Zhong-kai

(Department of Physics and Electronic Information Engineering,Minjiang University,Fuzhou,Fujian350108,China)

Abstract:The optimized algorithm of labeling connected components based on region-growth regards run-length as seeds,other than object pixels that was considered as seeds by traditional algorithm,it makes use of both advantages of run-length seeds algorithm and algorithm,and it could decrease quantity of seeds and times for searching neighbors of object points.The experimental results show the algorithm could decrease redundant operations efficiently and improve it’s efficiency obviously,and it is more excel-lent than others.

Key words:binary images;connected components;region growth;labelling algorithm

图像的连通域标记是将图像中符合某种连通规则[1](4邻域或8邻域)的像素点用相同的、唯一的标号标记.连通域标记的速度和准确性直接影响图像的后续处理,故历来是数字图像处理的重要研究方向.Costantino G在文献[2]分析了连通域标记算法的发展进程及类别,并将现有的连通域标记算法大致归纳为如下3种:一次扫描连通域标记算法[3-5],该类算法完成连通域标记仅需扫描图像一次.其中主要类别有基于轮廓扫描技术[5]、区域增长法[4]及递归搜索算法[3]等;二次扫描连通域标记算法[6,7],分两阶段对图像进行扫描,用一维共同连通域标号数组标记不同的连通域所属的共同连通域;多次扫描连通域标记算法[8],该类算法主要是反复自顶向下和自底向上扫描图像,并传递临时连通域标号,直到不再出现连通域标号冲突.一次扫描算法不论是轮廓跟踪标记算法[5]、还是区域增长法[4],通常需大量访问堆栈和邻域搜索.究其原因,主要是目标连通域形状的不规则且不可预测,图像扫描未完成前,无法获取全部的信息,需堆栈保存扫描获取的信息和反复搜索目标点的邻域以获取所有可能的连通路径.减少邻域搜索和堆栈访问的次数是提高该类算法效率的有效方法.常用的区域增长标记算法[4,9-10]是以目标点作为种子单位,目标点之间的冗余连通路径被重复搜索,因而从堆栈中存取种子占用了大量运行时间,且还造成大量冗余的连通路径搜索.游程编码[11]是用一个符号值代替具有相同值的连续符号.以游程为种子单位,能有效地减少算法存取种子的次数;同时线标记游程内的连续目标点,可减少目标点的邻域搜索次数.图像的游程编码原先主要用于图像压缩和减少内存消耗.由于在连通域标记算法中,若用游程表示行时,需判断该游程的上行和下行的每个目

收稿日期:2011-03-01

项目资助:福建省教育厅科技项目(JB10137)

作者简介:罗志灶(1971-),男,福建三明人,闽江学院物理学与电子信息工程系讲师.

周赢武(1967-),男,福建屏南人,闽江学院物理学与电子信息工程系副教授.

郑忠楷(1978-),男,福建福州人,闽江学院物理学与电子信息工程系讲师.

闽江学院学报第32卷

标点是否在游程范围之内,并需提取与该游程连通的游程,算法逻辑复杂,影响算法的速度.本算法以游程为

种子单位,

简化与当前游程相连通的上行和下行游程的提取,以提高算法速度.1算法描述

以游程作为区域增长算法的种子,可有效地减少种子的数量,同时对游程的目标点进行线扫描和标记可

避免重复搜索邻域.用游程表示二值图像时,一个游程表示某段连续的目标点.游程通常包括起始地址、结束地址和目标点的值.当前游程表示正在进行连通域标记的游程,

与当前游程的起始目标点或结束目标点连通的上行和下行游程,则难以直接获取起始地址和结束地址.如图1所示,游程r 1、r 3、r 5、r 7是当前游程r 4的上行或下行游程,且与游程r 4的起始目标点和结束目标点连通,由于它们的起始地址或结束地址超出游程r 4范

围,因此要获取它们的起始地址和结束地址,势必增加算法的复杂度.以游程内的某目标点作为种子,而不是以整个游程编码作为种子,则可避免此问题.

本算法的思路:1)从上向下、从左至右,扫描图像,若遇到未标记目标点时,则可认为该目标点是新的连通域的种子,将该目标点作为游程种子压入堆栈;2)从堆栈中取出一个种子,以该种子为起点向左搜索其左边界目标点;从左边界点向右扫描并标记目标点,在标记的过程中,查找与该游程连通的上行和下行的游程,并取新游程中的一个目标点作为游程种子压入堆栈;3)重复从堆栈中取出种子,按步骤2)标记目标点,直至

堆栈为空;4)堆栈空时,

则连通域标记完成,继续扫描图像,直到结束.图1优化算法的游程实例

Fig.1

Example of yun-length for optimized algorithm

如图1所示,沿游程纵向观察,其上行和

下行的游程被背景像素点间隔开,

而游程内部则是连续的目标点,如上行游程r 1、

r 2、r 3和下行游程r 5、

r 6、r 7均被背景像素点间隔.因此判别上行和下行的新游程的规则如下:当对游程内的目标点采取从左至右逐点标记目标

点时,

若遇到的上行或下行的像素点是目标点且其左侧邻域是背景点时,则该目标点属

于新游程内的目标点,可将该目标点作为游

程种子存入堆栈.由于当前游程的起始目标点的左上邻域及左下邻域可能存在与其连通的游程,如r 5,同样当前游程的结束目标点的右上和右下邻域也可能存在与其连通的游程,如r 7.因此在游程目标点的标记过程中,

除需判断目标点的上邻域和下邻域是否有新的游程外,对8邻域连通域标记则还需判断是否有新的游程与起始目标点和结束目标点连通.

假设连通域内的某游程r 长度为n ,如图2所示,白色为背景像素点,灰色为目标像素点.游程r 的8邻域由目标点的上邻域和下邻域及起始目标点的左上邻域和左下邻及结束目标点的右上邻域和右下邻域组成,图2优化算法游程领域

Fig.2

Neighors of yun-length for optimized algorithm

其邻域数量为2n +4;而以目标点为种子,则n 个目标点的邻域则是8n.若图像的目标点为N ,游程的平均长度为n ,则种子数量约为N /n ,而以目标点为种子,则种子数量为N ;同样,以目标点为种子,搜索邻域的数量为8N ;而以游程为种子,搜索邻域的数量约为N /n *(2n +4),当n 2n

时,约为2N.分析表明将游程作为种子,可减少种子的数量,

及避免重复搜索邻域.2.1

算法流程

描述算法流程之前先解释几个变量,BinaryImage (x ,

y )是二值图像某像素点(x ,y )的灰度值,

0表示背景,1表示目标;变量topStatus 、

bottomStatus ;provisional (x ,y )表示某像素点(x ,y )的连通域标号;index 表示当前的连通域标号.

算法的执行流程如图3所示,首先扫描图像,当遇到未标记目标点时,则将其作为种子入栈,保存扫描断点;重复从堆栈中取出种子,标记种子游程内的目标点,并查找与其连通的上行和下行的未标记游程,并将它们压入堆栈,直至堆栈为空;从扫描断点继续扫描图像,直到图像扫描结束.

令topStatus 、bottomStatus 表示前一个目标点的上行和下行的像素点是否是目标点,当前游程是否有上行

和下行的未标记游程与其连通的判断标准是:topStatus ==0&BinaryImage (x -1,

y )==1&provisional (x -1,y )==0和bottomStatus ==0&BinaryImage (x +1,y )==1&provisional (x +1,y )==0,即上行或下行的像素点是目标点且其左侧邻域是背景点,且未标记.

2

4

第2期罗志灶,等:基于区域增长的连通域标记算法的优化

图3优化算法算法流程图

Fig.3

Flow chart for the optizimed algorithm

当堆栈为空时,说明当前连通域已

标记完成,则继续扫描图像,搜索下一个未标记的连通域.

算法流程简单,易于代码实现,能准

确标记所有目标的连通域,是完备的.连通域的标号与图像扫描中,

连通域出现的先后次序一致.尽管算法以游程作为种子单位,

但与以目标点为种子单位相比,对每个种子处理的逻辑复杂度相当,并没有增加算法的运算量.

3实验分析

选取不同复杂度的图像,将本算法与其它连通域算法,如传统区域增长法

[4]

,传统轮廓跟踪算法[5]

、二次扫描算法[6]、多次扫描算法[8]、基于游程算法[9]

等进行比较.

在不同结构的图像(512?512),和2.5GHz CPU 和3.46GB 内存的PC 机内的Matlab 环境下,

运行上述各算法.实验图像如图4所示表1数据是各算法标记(512?512)图像连通域所需的运行时间.离散度取各图像的运行时间与平均运行时间差值的绝对值的均值,

实验结果表明,本算法所需运行时间较少;对不同复杂度的图像,本算法运行时间的离散度更小.

为分析不同尺寸的图像下各标记算

法的运行时间,

本文按16*n ?16*n 划图4算法比较的实验图像

Fig.4

The experimental images for algorithms comparation

3

4

闽江学院学报第32卷

分,将(512?512)图像分成32幅不同尺寸,运行各标记算法,并随机抽取其中一组实验数据.在不同尺寸图

像下,

各算法所需的运行时间,如图5所示.实验数据显示,随图像尺寸增大,本算法运行时间基本是呈缓慢增长,其它算法运行时间的变大明显快于本算法.因此,本算法对大尺寸图像的连通域标记更具优势.

表1各算法运行时间

Tab.1

The run time that algorithms need (s )图像名/来源本文算法传统轮廓跟踪算法基于游程算法多次扫描算法二次扫描算法传统区域增长法2.pgm 0.0632.7033.9060.5320.0946.8753.pgm 0.0632.2652.9850.9382.1091.9687.pgm 0.0621.8443.3130.5930.0941.04710.pgm 0.0472.1093.0780.4682.0460.62541.pgm 0.0462.8753.4060.6090.0784.40747.pgm 0.0783.4065.2660.6250.2815.549.pgm 0.04753.5310.2970.0623.531平均运行时间0.0582.8863.6410.5800.6813.422离散度

0.010

0.753

0.540

0.127

0.798

1.893

图66种算法在不同尺度的执行时间

Fig.5The run time that six algorithms need under

various size

3结束语

分析了现有连通域标记算法,针对区域增加法的缺点,提出以游程为种子单位,有效地降低堆栈空间,和减少目标点的邻域搜索.实验结果表明本算法效率较高,且稳定性较高.

参考文献:

[1]Rafael C G ,Richard E W.Digital image processing [M ].2nd ed.北京:电子工业出版社,2006.

[2]Costantino G ,Daniele B ,Rita C.Connected component labeling techniques on modern architectures [J ].Image Analysis and Pro-cessing ,

2009,5716:816-824.[3]徐正光,鲍东来,张利欣.基于递归的二值图像连通域像素标记算法[

J ].计算机工程,2006,32(24):186-225.[4]Ayman A B ,Rami Q ,Stan I ,et al.one scan connected component labeling technique [C ]//2007IEEE International Conference

on Signal Processing and Communications (ICSPC 2007),2007:1283-1286.

[5]Chang F ,Chen C J.A component-labeling algorithm using contour tracing technique [C ]//7th International Conference on Docu-ment Analysis and Recognition.Washington :IEEE Computer Society ,2003:741-745.

[6]Samet H ,Tamminen M.An improved approach to connected component labeling of images [J ].Proc of CVPR ,1986:312-318.[7]Wu K S ,Otoo E ,Suzuki K.Optimizing two-pass connected-component labeling algorithms [J ].Pattern Anal Applic ,2009(12):

117-135.

[8]Suzuki K ,Horiba I ,Sugie N.Linear-time connected-component labeling based on sequential local operations [J ].Computer Vision

and Image Understanding ,2003,89(1):1-23.

[9]朱云芳,叶秀清,顾伟康.视频序列的全景图拼接技术[J ].中国图象图形学报,2006,11(8):1150-1155.[10]张云哲,赵海,宋纯贺,等.一种新的连通区域标记算法[

J ].计算机应用研究,2010,11(27):4335-4340.[11]Zenzos D ,Cinque L ,Levial D.Run-based algorithms for binary image analysis and processing [J ].IEEE Transactions on Pat-tern Analysis and Processing ,1996,18(1):83-89.

(责任编辑:唐诚焜)

4

4

二值图像连通域标记算法与代码

二值图像连通域标记算法与代码 这里列举二值图像连通域标记算法包括直接扫描标记算法和二值图像连通域标记快速算法 一、直接扫描标记算法把连续区域作同一个标记,常见的四邻域标记算法和八邻域标记算法。 1、四邻域标记算法: 1)判断此点四邻域中的最左,最上有没有点,如果都没有点,则表示一个新的区域的开始。 2)如果此点四邻域中的最左有点,最上没有点,则标记此点为最左点的值;如果此点四邻域中的最左没有点,最上有点,则标记此点为最上点的值。 3)如果此点四邻域中的最左有点,最上都有点,则标记此点为这两个中的最小的标记点,并修改大标记为小标记。 2、八邻域标记算法: 1)判断此点八邻域中的最左,左上,最上,上右点的情况。如果都没有点,则表示一个新的区域的开始。 2)如果此点八邻域中的最左有点,上右都有点,则标记此点为这两个中的最小的标记点,并修改大标记为小标记。 3)如果此点八邻域中的左上有点,上右都有点,则标记此点为这两个中的最小的标记点,并修改大标记为小标记。 4)否则按照最左,左上,最上,上右的顺序,标记此点为四个中的一个。代码实现: #include #include #include //连通区域属性结构 typedef struct tagMarkRegion { std::list MarkPointList;//点列表 RECT rect; }MarkRegion; //定义MarkMap 结构,用来存放等价对 typedef struct tagEqualMark { int MarkValue1; //标记值 int MarkValue2; //标记值 } EqualMark; //定义MarkMapping 结构,用来存放标记映射关系 typedef struct tagMarkMapping

(整理)MATLAB 标注连通域.

matlab 标注连通域 clear; clc; f=imread('c:\1.jpg'); gray_level=graythresh(f); f=im2bw(f,gray_level); [l,n]=bwlabel(f,8) imshow(f) hold on for k=1:n [r,c]=find(l==k); rbar=mean(r); cbar=mean(c); plot(cbar,rbar,'Marker','o','MarkerEdgeColor','k','MarkerFaceColor','k','MarkerSize',10); plot(cbar,rbar,'Marker','*','MarkerEdgecolor','w'); end 主要概念: 1. 2.4连接 8连接 0 1 0 1 p 1 ===> 4连接,p为当前像素点。 0 1 0 1 1 1 1 p 1 ====》8连接,p为当前像素点。 1 1 1 3.bwlabel()函数 语法: [ L, num]=bwlabel(f,conn) 其中f是一副二值图像,conn用来指定期望的连接(不是4就是8),默认为8,输出L称为标记矩阵,参数num给出所找到连接分量的总数。 4.find()函数 该函数非常有用,会返回指定条件的索引值,在标记矩阵中的作用是返回对应对象的索引。 I = FIND(X) returns the linear indices corresponding to the nonzero entries of the array X. X may be a logical expression. Use IND2SUB(SIZE(X),I) to calculate multiple subscripts from the linear indices I. find(bwlabel(bw)==2)表示的意思是连通域2中的数值所在向量的位置。

基于FPGA的二值图像连通域标记快速算法实现

基于FPGA的二值图像连通域标记快速算法实现 摘要:在图像自动目标识别和跟踪过程中,首先对图像目标进行阈值分割提取,得到的二值图像通常包含多个连通区域,系统利用图像目标的形状特性对可疑高威胁的飞行目标进行自动识别。因此,需要对各连通区域块进行分别检测判断,本文采用改进的适合FPGA实现的快速标记算法对各连通域进行检测提取。 关键词:FPGA,二值图像连通域,快速标记算法,可编程逻辑 贺明 1 引言 在图像自动目标识别和跟踪过程中,首先对图像目标进行阈值分割提取,得到的二值图像通常包含多个连通区域,系统利用图像目标的形状特性对可疑高威胁的飞行目标进行自动识别。因此,需要对各连通区域块进行分别检测判断,本文采用改进的适合FPGA实现的快速标记算法对各连通域进行检测提取。 实现二值图像连通体检测通常采用的方法有下几种[1] [2] [3]:区域生长法:首先对图像进行逐行(列)扫描,每遇到一个未标记的“1”像素点,就分配其一个未使用过的标号,然后对其领域进行检测,如有未标记过的“1”像素,则赋予相同的标号。反复进行这一操作.直到不存在应该传播标号的“1”像素。然后继续图像行(列)扫描,如检测判未标记的“1”像素则赋予其新的标号,并进行与以上相同的处理。整个图像扫描结束,算法也就终止。这种方法可准确地检测出各种类型的连通体.但处理时间也较长.因为要逐一检测每一“1”像素的邻域,且出现“1”像素的重复扫描。跟踪算法:二值图像中每个取值为“1”的像素被标记一个与其坐标相关的标号,如由n,m串构成的数。热后,扫描标记后的图像,并将每十像素的标号改为其邻域内的最小标号。反复执行这个过程,直到不需要作标记更改为止。用这种方法处理小而凸的目标时,收敛速度较慢。 本文以适合FPGA实现为目的,提出一种具有计算规则性的快速二值图像连通域标记算法。与传统的二值图像标记算法相比,该算法具有运算简单性、规则性和可扩展性的特点,适合以FPGA实现。选用在100MHz工作时钟下,处理384×288像素的红外图像能够达到400帧/秒以上的标记速度,足够满足实时目标识别系统的要求。处理速度可以满足大部分实时目标识别系统的要求。该算法同样可以软件编程方式应用于嵌入式DSP系统中。 2 算法描述 首先,在进行标记算法以前,利用硬件开辟独立的图像标记缓存和连通关系数组,接着在视频流的采集传输过程中,以流水线的方式按照视频传输顺序对图像进行逐行像素扫描,然后对每个像素的邻域分别按照逆时针方向和水平方向进行连通性检测和等价标记关系合并,检测出的结果对标记等价数组和标记缓存进行更新,在一帧图像采集传输结束后,得到图像的

二值化图像8联通域标记

//基于区域生长法的连通域标记(C语言) 区域生长法利用区域生长的思想,一次生长过程可以标记一整个连通区,只需对图像进行一次扫描就能标记出所有连通区。算法描述如下: Step1、输入待标记图像bitmap(二值化原图,SDRAM内,u16,只有0x0000与0xffff),初始化一个与输入图像同样尺寸的标记矩阵labelmap(SDRAM内,大小与二值化原图相同,u16,初值0x0000),一个队列queue(SDRAM内,大小与二值化原图相同)以及标记计数labelIndex (unsigned char,最大值255,初值0); Step2、按从左至右、从上至下的顺序扫描bitmap,当扫描到一个未被标记的前景像素p时(0xffff,2个字节,unsigned short int),labelIndex加1,并在labelmap中标记p(相应点的值赋为labelIndex),同时,扫描p的八邻域点,若存在未被标记的前景像素,则在labelmap 中进行标记,并放入queue中,作为区域生长的种子; Step3、当queue不为空时,从queue中取出一个生长种子点p1,扫描p1的八邻域点,若存在未被标记过的前景像素,则在labelmap中进行标记,并放入queue中; Step4、重复Step3直至queue为空,一个连通区标记完成; Step5、转到Step2,直至整幅图像被扫描完毕,得到标记矩阵labelmap和连通区的个数labelIndex。 该算法最坏情况下,将对每个像素点都进行一次八邻域搜索,算法复杂度为O(n)。 //辅助队列 typedef struct QNode { int data; struct QNode *next; }QNode; typedef struct Queue { struct QNode* first; struct QNode* last; }Queue; void PushQueue(Queue *queue, int data) { QNode *p = NULL; //p = (QNode*)malloc(sizeof(QNode)); p->data = data; if(queue->first == NULL) { queue->first = p; queue->last = p; p->next = NULL; } else

二值图像连通域标记算法与代码 收藏

二值图像连通域标记算法与代码收藏 10:19:42二值图像连通域标记算法与代码 这里列举二值图像连通域标记算法包括直接扫描标记算法和二值图像连通域标记快速算法 一、直接扫描标记算法把连续区域作同一个标记,常见的四邻域标记算法和八邻域标记算法。 1、四邻域标记算法: 1)判断此点四邻域中的最左,最上有没有点,如果都没有点,则表示一个新的区域的开始。 2)如果此点四邻域中的最左有点,最上没有点,则标记此点为最左点的值;如果此点四邻域中的最左没有点,最上有点,则标记此点为最上点的值。 3)如果此点四邻域中的最左有点,最上都有点,则标记此点为这两个中的最小的标记点,并修改大标记为小标记。 2、八邻域标记算法: 1)判断此点八邻域中的最左,左上,最上,上右点的情况。如果都没有点,则表示一个新的区域的开始。 2)如果此点八邻域中的最左有点,上右都有点,则标记此点为这两个中的最小的标记点,并修改大标记为小标记。 3)如果此点八邻域中的左上有点,上右都有点,则标记此点为这两个中的最小的标记点,并修改大标记为小标记。 4)否则按照最左,左上,最上,上右的顺序,标记此点为四个中的一个。 代码实现: #include #include #include //连通区域属性结构 typedef struct tagMarkRegion

{ std::list MarkPointList;//点列表 RECT rect; }MarkRegion; //定义MarkMap 结构,用来存放等价对 typedef struct tagEqualMark { int MarkValue1; //标记值 int MarkValue2; //标记值 } EqualMark; //定义MarkMapping 结构,用来存放标记映射关系typedef struct tagMarkMapping { int nOriginalMark; //第一次扫描的标记 int nMappingMark; //等价整理之后对应标记 } MarkMapping; /* 功能说明:八连通标记 参数说明:I,表示图像数据指针 ImageWidth,表示图像宽 ImageHeight,表示图像高

用vc++实现连通区域标记

用阳卡争|饕现唐≯’雾蓬通区匆《稼萄参I|i |i。;:: 一、引言 用图像处理方法做目标检测的一般顺序是:图像预处理、边缘检测、阈值分割、区域标记、形状判断分析。 进行区域标记之前的图像一般已经被处理为二值图像。如图1所示,二值图像中可能有多个连通区域。进行图像检测的时候往往关心的是每个连通区域各自的特性。这就需要使用区域标记的方法把不同的连通区域区分开来。 图1经过前期处理所得到的二值图像 二、连通区域 像素间的连通性是确定区域的一个重要概念。在二维图像中,假设目标像素周围有m(m<=8)个相邻的像素,如果该像素灰度与这m个像素中某~个点A的灰度相等,那么称该像素与点A具有连通性。常用的连通性有4连通和8连通。4连通一般选取目标像素的上、下、左、右四个点。8连通则选取目标像素在二维空间中所有的相邻像素。我们以下讨论的都采用了在实践中常选用的8连通区域。 将所有具有连通性的像素作为一个区域则构成了一个连通区域。那么对于图1,每个分离的白色目标区域被认为是一个连通区域。要注意的是,黑色背景同时也是一个连通区域。当然背景也可能被目标分成多个连通区域。目标和背景都是相对而言的。 三、标记算法 图像处理中有很多不同的标记算法。有些简单的算法只 玉案静。。豫玲。褰建永金赞 适合标记方形、圆形等规则的形状,并不是很实用。像素标记法和游程连通性分析是两种实用的方法,能够标记出符合连通性质的所有连通区域。这里我们只介绍易于理解的像素标记法,游程连通性分析可以参看《图像处理和分析上册》章毓晋编著P.206的介绍。 假设图像中目标像素的灰度为1,背景像素灰度为o。标记算法只对目标像素进行标记,而不针对背景像素。 首先对一幅图像从左到右、从上到下进行扫描。假如当前像素的灰度值为0,就移到下一个扫描位置。假如当前像素的灰度值为1,检查它左、左上、上、右上这4个相邻像素(根据所采用的扫描次序,当我们到达当前像素时这4个相邻像素已经被处理过)。如果上述4个相邻像素的灰度值都为0,就给当前像素一个新的标记值。如果4个相邻像素中只有一个像素P的灰度值为l,就把P像素的标记值赋给当前像素。如果4个相邻像素中有m(1<m<=4)个像素的灰度值为l,则按照左、左上、上、右上的优先顺序,确定当前像素的标记值。然后对这m个像素所拥有的标记值做等价对,并将其归入一个等价对数组中。例如,4个像素的灰度值都为1时,将左边像素的标记值赋给当前像素,然后做出左等价左上,左等价上,左等价右上三个等价对,最后将这三个等价对加入等价对数组。第一次扫描结束后,所有灰度值为1的点都已经被标记过,但有些标记是等价的。 整理等价对数组,把等价对整理为等价关系。进行第二次图像扫描,根据整理所得的等价关系来进行重新标记。第二次扫描结束之后,所有灰度值为1的目标区域都被标记了不同的标记值。根据不同的标记值就可以区分不同的连通区域。 四、算法实现 本文采用Vc++实现“像素标记法”。这里所处理的图像为二值化之后的8位BMP图像。关于图像的读入、显示等方面,很多文章都有详细的叙述,这里就不再赘述了。 利用VC++的Classwizard创建cImage类,增加如下成员变量。 Iongm_JngWldth://图像宽 Iongm_JngwldthBytes://图像宽所占字节数

计算连通域的面积

计算连通域的面积 matlab函数_连通区域 1、 matlab函数bwareaopen——删除小面积对象 格式:BW2 = bwareaopen(BW,P,conn) 作用:删除二值图像BW中面积小于P的对象,默认情况下使用8邻域。 算法: (1)Determine the connected components. L = bwlabeln(BW, conn); (2)Compute the area of each component. S = regionprops(L, 'Area'); (3)Remove small objects. bw2 = ismember(L, find([S.Area] >= P)); 2、matlab函数bwarea——计算对象面积 格式:total = bwarea(BW) 作用:估计二值图像中对象的面积。 注:该面积和二值图像中对象的像素数目不一定相等。 3、matlab函数imclearborder——边界对象抑制 格式:IM2 = imclearborder(IM,conn) 作用:抑制和图像边界相连的亮对象。若IM是二值图,imclearborder将删除和图像边界相连的对象。默认情况conn=8。 注:For grayscale images, imclearborder tends to reduce the overall intensity level in addition to suppressing border structures. 算法: (1)Mask image is the input image. (2)Marker image is zero everywhere except along the border, where it equals the mask image. 4、matlab函数bwboundaries——获取对象轮廓 格式:B = bwboundaries(BW,conn)(基本格式) 作用:获取二值图中对象的轮廓,和OpenCV中cvFindContours函数功能类似。B是一个P ×1的cell数组,P为对象个数,每个cell 是Q×2的矩阵,对应于对象轮廓像素的坐标。 5、matlab函数imregionalmin——获取极小值区域 格式:BW = imregionalmin(I,conn) 作用:寻找图像I的极小值区域(regional maxima),默认情况conn=8。 Regional minima are connected components of pixels with a constant intensity value, and whose external boundary pixels all have a higher value. 6、matlab函数bwulterode——距离变换的极大值 格式:BW2 = bwulterode(BW,method,conn) 作用:终极腐蚀。寻找二值图像BW的距离变换图的区域极大值(regional maxima)。用于距离变换的距离默认为euclidean,连通性为8邻域。

二值图像连通域标记快速算法实现

二值图像连通域标记快速算法实现 算法描述 首先,在进行标记算法以前,利用硬件开辟独立的图像标记缓存和连通关系数组,接着在视频流的采集传输过程中,以流水线的方式按照视频传输顺序对图像进行逐行像素扫描,然后对每个像素的邻域分别按照逆时针方向和水平方向进行连通性检测和等价标记关系合并,检测出的结果对标记等价数组和标记缓存进行更新,在一帧图像采集传输结束后,得到图像的初步标记结果以及初步标记之间的连通关系,最后,根据标号对连通关系数组从小到大的传递过程进行标号的归并,利用归并后的连通关系数组对图像标记缓存中的标号进行替换,替换后的图像为最终标记结果,并且连通域按照扫描顺序被赋予唯一的连续自然数。 图 1 标记算法流程 本文快速二值图像连通域标记算法分为三个环节: 1.图像初步标记:为每个像素赋予临时标记,并且将临时标记的等价关系记录在等价表中 2.整理等价表:这一环节分为两个步骤: (1)将具有等价关系的临时标记全部等价为其中的最小值; (2)对连通区域以自然数顺序重新编号,得到临时标记与最终标记之间的等价关系。 3.图像代换:对图像进行逐像素代换,将临时标记代换为最终标记.经过3个环节处理后,算法输出标记后的图像,图像中连通域按照由上到下,由左至右出现的顺序被标以连续的自然数。 1 图像初始标记 标记算法符号约定:算法在逆时钟方向检测连通域时用w1,w2表示连续两行的图像数据,在紧接着的顺时钟方向连通域检测时用k0,k表示连续两行经过

逆时钟方向标记后的图像数据。其在工作窗口的位置在图2、3中分别说明;对初始逆时针方向临时标记用Z表示。Z初始标记值为1。 二值图像连通域标记算法采用8连通判断准则,通过缩小标记范围剔除了图像的边界效应。为了简化标记处理过程,使标记处理在硬件对一帧图像传输操作时间内结束,标记处理利用中间数据缓存分为连续的两种类型,其中类型1用于直接图像序列传输,硬件发起图像序列传输时,类型1采用逆时钟顺序连通域检测,对2×3工作窗口中的二值像素进行初始标记。类型2对经过类型1初始标记过的图像数据再进行水平方向的连通域检测和归并,然后把标记结果存入图像存储区。 图像初始标记类型1: 步骤1读取像素w1(2)、w1(1)、w1(0)、w0(2)、w0(1),以及相应的二值像素值。 步骤2读取像素w0(1),按照逆时针方向依次与w1(0)、w1(1)、w1(2)、w0(2)比较,若w0(1)= w1(0),则k0(1)=k(2);若w0(1)= w1(1),则k0(1)=k(1);若w0(1)= w1(2),则k0(1)=k(0);若w0(1)= w0(2),则k0(1)=k0(0);否则(即w0(1)≠(w1(2)、w1(1)、w1(0)、w0(2)),k0(1)= Z;Z ++。 步骤3写入等价关系表,以Z为地址将Z写入等价关系数组。 图 2 逆时钟方向初始标记的工作窗 图像初始标记类型2: 步骤1判断经过逆时针方向标记后,如果w0(1)= w0(2)= 1,而标记灰度k0(1)≠k0(0),则进行下一步骤。 步骤2 假设k0(1)> k0(0),判断lab(k0(1))=k0(1)或者lab(k0(1))=k0(0),则lab(k0(1))=k0(0),否则对标记数组进行追踪置换。跳转至步骤3。 步骤3 假设k0(1)< k0(0),判断lab(k0(0))=k0(0)或者lab(k0(0))=k0(1),则lab(k0(0))=k0(1),否则对标记数组进行追踪置换。 追踪置换方法:步骤2的追踪置换令t= lab(k0(0));若lab(t)≠t,则

基于连通域算法的区域测量

第8卷 第9期 2008年5月1671-1819(2008)9-2492-03  科 学 技 术 与 工 程 S c i e n c e T e c h n o l o g ya n d E n g i n e e r i n g  V o l .8 N o .9 M a y 2008 2008 S c i .T e c h .E n g n g . 基于连通域算法的区域测量 李仪芳 刘景琳 (广东技术师范学院电子与信息学院,广州510665) 摘 要 基于数字图像处理的原理,提出用八连通域算法对有多个连通区域的二值图像进行面积测量。通过逐行逐列地扫描图像,按照一定的规则标记连通区域,得到对象的个数,同时统计每个区域所含的像素,通过标尺转换可以得出区域的面积。结果表明,该算法能有效地提取八连通区域,可用于计算显微图像颗粒物的面积和粒径。关键词 区域标记 像素测量 八连通域算法中图法分类号 T P 391.77; 文献标识码 A 2008年1月21日收到 广东省第二批产业技术研究研发计划 项目(2007B 010200041)资助 第一作者简介:李仪芳(1983—),女,广东三水人,广东技术师范学院助教,硕士,研究方向:图像处理和光电技术。E -m a i l :a n g e l i -n a 2008@y a h o o .c o m .c n 二值图像中连通域的提取是图像处理和分析中的一个重要处理过程,可以用于显微图像的对象识别和测量,红外图像的目标定位等领域。灰度图像经过阈值分割后常包括多个连通的区域,需要将连通区域搜索标记出来以便测量。但常见算法是关于四连通区域的研究,其中文献[1,2]中描述或采用的是区域标号法,但文献[1]中描述的算法在实现时并不能达到预定的结果。而且区域生长法计算复杂度过高;像素标记法和行程标记法必须全部扫描完图像才能得到连通域,随着图像幅度和连通域个数的增加,计算复杂度增长。现提出用八连通域算法 [3] ,它不仅能在对图像一次扫描中标记连 通域即计算对象的个数,而且可实现边扫描边提取像素,即累计每个连通域所含像素的个数。 1 区域标记 算法实现逐行逐列扫描,对图像内每个连通的黑色区域进行标记操作,求得对象的数目。图1为6×12图像点阵,图中有三个连通区域,即三个对 象,分别用1,2,3标号。设前景点灰度取1,背景点取值为0。在算法中,定义了多个数组N (i ),其中i 代表连通区域的标号,∑N (i )表示区域内部包含的像素个数。如第1个区域,∑N (1)=7;对第2个区域,∑N (2)=6。下面以标记区域1为例,说明标记的具体算法。 图1 八连通域算法说明图 ① 初始化N (i )=0,i =0。② 从左到右,从上到下逐行扫描图像;如果没有遇到“1”,则继续扫描。若遇到“1”,如(1,1),则依次判断该像素点的

计算机图形学四连通区域种子填充算法实验

《计算机图形学实验》报告 任课教师:钱文华 2016年春季学期 实验:四连通区域种子填充算法 实验时间:2016年12月8日 实验地点:信息学院2204 实验目的:掌握种子填充算法的原理,并会用种子填充算法和opengl

并结合使用c++语言编写程序绘制多边形。 实验原理:种子填充算法又称为边界填充算法。其基本思想是:从多边形区域的一个内点开始,由内向外用给定的颜色画点直到边界为止。如果边界是以一种颜色指定的,则种子填充算法可逐个像素地处理直到遇到边界颜色为止。内点的检测条件:if(interiorColor!=borderColor&&interiorColor!=fillColor)。 种子填充算法常用四连通域和八连通域技术进行填充操作。从区域内任意一点出发,通过上、下、左、右四个方向到达区域内的任意像素。用这种方法填充的区域就称为四连通域;这种填充方法称为四向连通算法。从区域内任意一点出发,通过上、下、左、右、左上、左下、右上和右下八个方向到达区域内的任意像素。用这种方法填充的区域就称为八连通域;这种填充方法称为八向连通算法。 一般来说,八向连通算法可以填充四向连通区域,而四向连通算法有时不能填充八向连通区域。 四向连通填充算法: a)种子像素压入栈中; b)如果栈为空,则转e);否则转c); c)弹出一个像素,并将该像素置成填充色;并判断该像素相邻的四连通像素是否为边界色或已经置成多边形的填充色,若不是,则将该像素压入栈; d)转b); e)结束。

四连通填充算法利用到了递归的思想。 本实验只包括四连通填充算法 程序代码:#include #include #include #include void init(void) { glClearColor(1.0,1.0,1.0,0.0); glMatrixMode(GL_PROJECTION); gluOrtho2D(0.0,300.0,0.0,300.0); } void setPixel(int x,int y,long fillColor){ glColor3f(fillColor<<16,fillColor<<8,fillColor); glBegin(GL_POINTS); glVertex2i(x,y); glEnd(); } void boundaryFill4(int x,int y,long fillColor,long borderColor) { unsigned char params[3]; long interiorColor; glReadPixels(x,y,1,1,GL_RGB,GL_UNSIGNED_BYTE,params); interiorColor=RGB(params[0],params[1],params[2]); if(interiorColor!=borderColor&&interiorColor!=fillColor)

相关文档
最新文档