一种二值图像连通区域标记的新算法
基于FPGA的二值图像连通域快速标记

基于FPGA的二值图像连通域快速标记汪滴珠;安涛;何培龙【摘要】针对连通域标记算法运算量大、速度慢、硬件实现困难的缺点,提出一种适于现场可编程逻辑门阵列(FPGA)实现的二值图像连通域快速标记的算法,并用VHDL硬件开发语言在XILINX公司的FPGA上实现.实验结果表明了该算法能对二值图像复杂的连通关系正确标记,易于硬件实现,大大节约了硬件资源,电路结构简单,满足实时性要求.%In order to solve the prablems of low speed large computation and difficult hardware implementation of connected component labeling, a connected component fast labcling algorithm of binary image lageling applicable for field programmable gate array (FPGA) is proposed, which is implemented by VHDI. hardware description language based on FPGA platform of XILINX corporation. Experimental results show that the proposed algorithm can label binary image with complex connections correctly, implement hardware easily,save more hardware resource and meet real-time demands.【期刊名称】《现代电子技术》【年(卷),期】2011(034)008【总页数】3页(P115-117)【关键词】FPGA;二值图像;连通域;快速标记【作者】汪滴珠;安涛;何培龙【作者单位】中国科学院,光电技术研究所,四川,成都,610209;中国科学院研究生院,北京,100039;中国科学院,光电技术研究所,四川,成都,610209;中国科学院,光电技术研究所,四川,成都,610209【正文语种】中文【中图分类】TN919-34;TP391连通域标记算法是图像处理、计算机视觉和模式识别等领域的基本算法,它可以对图像中不同目标标上不同的标记,进而提取、分离目标,确定目标的特征和参数,从而对目标进行识别和跟踪。
一种二值图像连通区域标记的新算法

第2 7卷 第 1 期 1
20 0 7年 1 1月
文 章编 号 :0 1— 0 12 0 ) 1— 7 6— 2 10 9 8 ( 07 1 27 0
一
计 算机应 用
Co u e p i ain mp trAp lc t s o
Vo . 127 No. 1 】 No .2 7 v o0
Ke o d : on c drg n aen ;l elbl g e o rwn yw rs cn et i ;l l g i e n ;rg ngo g e eo b i n a i i i
0 引 言
灰度 图像进行 阈值分割得到二值 图像 ( 一般背 景像 素为
25 目标像 素为 0 , 了提取不 同区域的特 征 , 常先要 对 5, )为 常
GAO n ~ o W ANG e — i Ho g b , W ixng
( colfEet n n i e n,U &  ̄ yo l t nc c ne Tcnl yo C i , Sho o l r iE gn r g n e e r iSi c & eho g hn co c ei fE c o e o f a
C e g u S h n6 0 5 ,C i ) h n d i n 1 0 4 hn ca a
Ab ta t s r c :A e loih b s d o ie l b l g a d rg o — r w n s p o o e o i ay c n e td c mp n n n w ag r m a e n l — ei n e i n g o i g wa r p s d f r bn r o n ce o o e t t n a n
关 键词 : 连通 区域 ; 标记 ; 线标记 ; 区域增 长
八邻接点种子填充算法编程

image[x][y] = value
for i in range(8):
fill(x + dx[i], y + dy[i])
#调用递归函数来填充种子周围的像素
fill(seed[0], seed[1])
这个算法使用了一个递归函数来填充种子周围的像素。在函数中,我们首先检查当前像素是否在图像的边界内,并且是否与种子像素相连。如果是,我们将其值设置为目标值,并递归地填充与当前像素相连的像素。通过调用fill(seed[0], seed[1]),我们可以从种子像素开始填充整个连通区域。
dy = [-1, 0, 1, -1, 0, 1, -1, 0]
#定义四个边界条件
left = 0
right = width - 1
top = 0
bottom = height - 1
#定义递归函数来填充种子周围的像素
def fill(x, y):
if x < left or x > right or y < top or y > bottom or image[x][y] != seed:
八邻接点种子填充算法是一种用于图像处理的算法,用于填充二值图像中的连通区域。以下是一个简单的Python实现:
def seedfill(image, height = image.shape
#定义八个方向的偏移量
dx = [-1, -1, -1, 0, 0, 0, 1, 1]
二值化图像8联通域标记

区域生长法利用区域生长的思想,一次生长过程可以标记一整个连通区,只需对图像进行一次扫描就能标记出所有连通区。算法描述如下:
Step1、输入待标记图像bitmap(二值化原图,SDRAM内,u16,只有0x0000与0xffff),初始化一个与输入图像同样尺寸的标记矩阵labelmap(SDRAM内,大小与二值化原图相同,u16,初值0x0000),一个队列queue(SDRAM内,大小与二值化原图相同)以及标记计数labelIndex(unsigned char,最大值255,初值0);
{
int searchIndex, i, length;
labelmap[pixelIndex] = labelIndex;
length = width * height;
for(i = 0;i < 8;i++)
{
searchIndex = pixelIndex + NeighborDirection[i][0] * width + NeighborDirection[i][1];//???
}
}
}
//头步骤1
int ConnectedComponentLabeling(unsigned char *bitmap, int width, int height, int *labelmap)
{
int cx, cy, index, popIndex, labelIndex = 0;
Queue *queue = NULL;
popIndex = PopQueue(queue);
}
}
}
}
//free(queue);
二值图像的贴标签算法

⼆值图像的贴标签算法 贴标签就是将⼆值图中属于同⼀个连通域的像素标记起来。
之前编的程序需要多次遍历图像,所以速度⽐较慢,最近有朋友告诉我⼀种更简单的⽅法。
这⾥对⼆值图中⽩⾊的连通域进⾏贴标签,具体步骤是: 1、按⾏遍历图像,当遇到⼀个⽩点时,说明遇到了⼀个标签区域; 2、将当前⽩点的坐标作为种⼦点⼊栈; 3、判断栈是否为空,若栈⾮空,则在栈顶元素所在位置贴上对应的标签号,同时将⼆值图上的该位置赋成别的颜⾊(表明当前元素已经贴过标签),弹出栈顶元素,并将其8邻域的⽩点⼊栈,重复3直到栈空,这时,当前连通域已经完成贴标签过程; 4、继续按⾏遍历图像,直到遇到下⼀个⽩点,然后重复步骤2-3,直到遍历完图像;1////////////////////////////////////////////////////2// 功能:⼆值图贴标签(针对感兴趣区域)3// 参数:4// pBin - ⼆值图像5// pLabel - 标签矩阵(在外申请,和图像同样⼤⼩,并全部置0)6// lineByte - 图像的每⾏字节数7// roi - 感兴趣区域(左闭右开、上闭下开区间)8// 返回值:9// nLabel - 标签个数10///////////////////////////////////////////////////1112int Labeling(unsigned char *pBin, int *pLabel, int lineByte, CRect roi)13 {14//感兴趣区域的4条边界15int xMin = roi.left;16int xMax = roi.right;17int yMin = roi.top;18int yMax = roi.bottom;1920 stack<CPoint> stk;21int i,j,x,y,k;22int nLabel = 0; //标签编号(从1号标签贴起,⾮标签区域贴0)23for (y=yMin; y<yMax; y++)24 {25for (x=xMin; x<xMax; x++)26 {27if (pBin[y*lineByte+x]==255) //以找到的第⼀个⽩点为种⼦点28 {29 nLabel++;30 stk.push(CPoint(x,y)); //将种⼦点⼊栈31 pLabel[y*lineByte+x] = nLabel;32 pBin[y*lineByte+x] = nLabel*40;3334//若栈⾮空,弹出⼀个元素,并将其8邻域内的⽩点⼊栈,栈空时当前连通域完成贴标签35while (!stk.empty())36 {37 CPoint pt = stk.top();38 stk.pop();39 i = pt.y;40 j = pt.x;41 k = i*lineByte+j;42if (i>yMin && j>xMin && pBin[k-lineByte-1]==255) //左上43 {44 stk.push(CPoint(j-1,i-1));45 pLabel[k-lineByte-1] = nLabel;46 pBin[k-lineByte-1] = nLabel*40;47 }48if (i>yMin && pBin[k-lineByte]==255) //上49 {50 stk.push(CPoint(j,i-1));51 pLabel[k-lineByte] = nLabel;52 pBin[k-lineByte] = nLabel*40;53 }54if (i>yMin && j<xMax-1 && pBin[k-lineByte+1]==255) //右上55 {56 stk.push(CPoint(j+1,i-1));57 pLabel[k-lineByte+1] = nLabel;58 pBin[k-lineByte+1] = nLabel*40;59 }60if (j>xMin && pBin[k-1]==255) //左61 {62 stk.push(CPoint(j-1,i));63 pLabel[k-1] = nLabel;64 pBin[k-1] = nLabel*40;65 }66if (j<xMax-1 && pBin[k+1]==255) //右67 {68 stk.push(CPoint(j+1,i));69 pLabel[k+1] = nLabel;70 pBin[k+1] = nLabel*40;71 }72if (i<yMax-1 && j>xMin && pBin[k+lineByte-1]==255) //左下73 {74 stk.push(CPoint(j-1,i+1));75 pLabel[k+lineByte-1] = nLabel;76 pBin[k+lineByte-1] = nLabel*40;77 }78if (i<yMax-1 && pBin[k+lineByte]==255) //下79 {80 stk.push(CPoint(j,i+1));81 pLabel[k+lineByte] = nLabel;82 pBin[k+lineByte] = nLabel*40;83 }84if (i<yMax-1 && j<xMax-1 && pBin[k+lineByte+1]==255) //右下85 {86 stk.push(CPoint(j+1,i+1));87 pLabel[k+lineByte+1] = nLabel;88 pBin[k+lineByte+1] = nLabel*40;89 }90 }91 }92 }93 }9495return nLabel;96 }。
python中连通域算法

python中连通域算法Python 中连通域算法连通域可以简单理解为一个图像中相邻的像素点相连形成的一块区域。
在图像处理中,我们常常需要对这些连通的区域进行一些操作,比如找到其中的特征、选择某个区域进行分析或对整个区域进行一些操作。
在Python 中,我们可以使用一些算法来找到图像中的连通域并进行相应的操作。
接下来,我将逐步介绍Python 中连通域的概念、如何找到连通域、如何在连通域上进行特定操作的方法。
1. 连通域的概念在图像处理中,连通域是一个由相邻的像素点构成的区域。
在二值图像中,像素点的值通常只有两个,例如黑色和白色,被称为“0”和“1”。
连通域的数量和形状通常与图像中的目标有关。
例如,在一张图片中,我们可能需要找到所有联通的数字或字母,或者只需要找到图像中最大或最小的连通区域。
2. 连通域的查找算法在Python 中,我们可以使用不同的算法来查找连通域。
其中,最常用的两种算法是DFS(深度优先搜索)和BFS(广度优先搜索)。
在这里,我们将重点介绍DFS 算法。
DFS 算法是一种非常适合连通域查找的算法。
它的基本思路是从图像中的某个像素点开始,沿着该点所在的连通域递归地访问所有相邻的未访问过的像素点。
通过递归,我们可以遍历整个连通域,并找到所有的像素点。
为了演示DFS 算法,我们先创建一个简单的二值图像。
以下代码创建一个10x10 的方形图像,其中心区域是黑色的(0),外围是白色的(1)。
import numpy as npimport matplotlib.pyplot as pltimage = np.ones((10, 10), dtype=np.uint8) # 创建一个10x10的白色方形图像image[3:7, 3:7] = 0 # 将图像中心区域切换为黑色plt.imshow(image, cmap=plt.cm.gray) # 绘制图像plt.axis('off')plt.show()运行后,可以看到以下图像:
左下 、 8 相邻像素 , 左 个 如图 2 示。 所
p X
图1 P 的四邻域
像 中提取连通分量的过程 实际上也是标记连通 区域 的过程 。 二值 图像 的连通域标记处理就是 从 白色像 素( 通常二值 图
像用 “ ” 灰度 图像 用“ 5 ” l, 2 5 来表示)和黑色像 素( 通常用 … 来 0’
计算机 时代 2 1 年 第 6 02 期
・ 3・ 2
基于区域生长法提取二值图像 中的连通区域
聂欢 欢 ,伊 磊 。刘任 平 ( 方工业 大学 ,北 京 10 4 ) 北 0 1 4
摘 要 :标记 二值 图像连 通区域是 图像 处理过 程的基本 算法 , 器视 觉和模 式识 别 中常用此 方法提 取 目标和分析 目标 机 几何特征。文章 以人机交互方式获得初 始种 子点 , 增强种子点的可靠性 , 通过 区域 生长 法提取二值 图像 中的连通 区域。
t xrc bet ad aay e terg o tc fa rs h e se on s o tie ho g u ncmp tr it at n i re o o e t tojcs n n lz i eme i et e.T ed p iti band tru h h ma—o ue ne c o n odrt a h r u r i
1像 素 间的连 通性
逐个检查每个连通成分 , 对每一个都要 先确定一个“ 子 种 像 素间的连通性是这样 定义的 : s 令 代表 一幅 图像 中的像 整体 , , 另一类 是 “ 分而 治之 ” 算 素 子集 , 如果在 s 中全部像素之问存在一个通路 , 就称 2 个像 素 点 ” 再 向周 围邻域 扩展 地填入 标记 ; 法, 基本思想是从整体到局部 , 先确定不 同的连通成分 , 再对每 P和 Q在 s中是连 通的 。像 素问的连通 性是确定 区域 的一 个
一种二值图像连通区域标记的新方法

一
种二值 图像 连通 区域标 记的新方法
陈柏 生
( 华侨 大 学计算 机科 学 系, 建泉 州 32 1 ) 福 60 1
E mal s mc e @h ue u c — i: a h n q .d .n
摘
要 论 文 提 出 了一 种基 于 区域 生长 的二 值 图像 连 通 区域 标 记 的 快 速 算 法 。 与传 统 方 法相 比 该 方 法 的特 点 是 在 一 次 图像 扫 描 中 完 成 所 有 连 通 区域 的 标 记 , 而且 避 免 了大 多数 改 进 算 法 都 必 须 处理 的重 复标 记 的 问题 ; 时 . 方 法 不 受 所 同 该
c mp rtv e p r n s o a a i e x e me t i wi t d t n l t r i o a meh d n t o i i r v d h a i t o a d wo f t mp o e meh d ae s t o s r ma eT e x e me tl es l d . h e p r n a r ut i s s o h r p s d a g r h h g f ce c n o u t e s h w t e p o o e lo t m i h e in y a d r b sn s . i i Ke wo d : bn r ma e c n e t d c mp n n a e i g e g t n i h o h o sn l c n y rs i a i g , o n c e o o e t l b l , ih e g b r o d,i g e s a y n
CHEN Bai h ng —s e
( eateto o ue cec , uqa nvri , unhuFj n3 2 ) D pr n fC mptrSineH aioU iesy Q azo ,ui 6 0 m t a 1 1
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
118
4
1
581
56
32 8 499 51
结论 : 1)图像 1大小为 799 ×599,连通区域比较规则 ,单向反复扫 描法 、两次扫描法 、线标号法以及区域增长法速度都比较快 。 2)图像 2大小为 2 048 ×1 024;连通区域形状不太规则 , 单向反复扫描法 、两次扫描法以及线标号法算法效率有一定 程度的下降 ;区域增长法速度较快 。 3)图像 3 大小为 799 ×599,连通区域形状严重不规则 (标记冲突现象非常严重 ) ,单向扫描法 、两次扫描法以及线 标号算法效率严重下降 ;但是区域增长法由于其鲁棒性 ,效率 基本不受影响 。 4)图像 4 大小为 800 ×600,图中只有一个目标物体 (大 小为 750 ×650的矩形 ) ,此时单向反复扫描法 、两次扫描法以 及线标号法都比较快 ,但是区域增长法对每个目标像素点都 要进行 8邻域的判断 ,效率严重下降 。如果当图像中连通区 域比较大时 (如卫星遥感图像 ) ,区域增长法就不能满足实时 性的要求 。 从以上结论可以看出 ,线标记法以连通区域的目标段作 为检测单元 ,当连通区域比较规则时 ,速度较快 ;区域增长
由于采用的是 8邻域连通 ,所以本行目标段 ( Xs1 , Xe1 ) 和 上下两行目标段 ( Xs2 , Xe2 ) 重叠的准则是 : Xs1 - 1 ≤ Xe2 并且 Xe1 + 1 ≥ Xs2。
图 2中第一个连通区域的目标段入栈先后顺序为目标段 ①→目标段 ③→目标段 ②→目标段 ④;出栈顺序正好相反 。
收稿日期 : 2007 - 05 - 24;修回日期 : 2007 - 07 - 23。 作者简介 :高红波 (1982 - ) ,男 ,四川成都人 ,硕士研究生 ,主要研究方向 :图像处理 、模式识别 ; 王卫星 ( 1959 - ) ,男 ,湖南邵阳人 ,教授 、 博士生导师 ,主要研究方向 :计算机视觉 、模式识别 、图像处理 。
New connected com ponen t labeling a lgor ithm for b inary image
GAO Hong2bo, WANG W ei2xing (S chool of E lectron ic Eng ineering, U n iversity of E lectron ic S cience & Technology of Ch ina,
Key words: connected region; labeling; line labeling; region grow ing
0 引言
灰度图像进行阈值分割得到二值图像 (一般背景像素为 255,目标像素为 0) ,为了提取不同区域的特征 ,常常先要对 连通区域进行标记 。连通区域标记是指将图像中符合某种连 通规则 (4邻域连通和 8邻域连通 )的像素用相同的标号表示 出来 。这种方法在工业检测 ,光学字符识别 (Op tical Character Recognition, OCR)等领域有广泛的应用 ,如文本识别的图文 分割 、零件图像提取等 ,是图像处理和目标识别的基础 ,标记 算法的速度直接影响到图像的分析效率 。
第 11期
高红波等 :一种二值图像连通区域标记的新算法
2 77 7
本算法从上往下 、从左向右对图像进行扫描 ,采用 8邻域 连通 。基本思想如下 :找到连通区域的第一个目标段 (如图 2 目标段 ①,第 1行的第 1列到第 3列 ) ,标记该段并且压入堆 栈 ,作为“区域增长 ”的种子段 。检查当前段的上下两行是否 有重叠并且未标记的目标段 。如果不存在重叠的目标段就把 当前段弹出堆栈 ;如果存在 (目标段 ③,第 2行的第 2列到第 5 列 ) ,标记该段并且压入堆栈 ,作为新的“种子段 ”。后续操作 不断从堆栈中取出种子段 ,重复上述操作直到堆栈为空 (标记 完一个连通区域 ) 。接着搜索图像中下一个未标记的连通区 域 ,重复上述操作直到图像中所有的连通区域标记完毕 。
表 1 二值图像连通区域的标记算法比较
图 序号
连通 区域 个数
标记时间 /m s 单向反复 两次 线标 区域 扫描法 扫描法 号法 增长法
本文 算法
1
824
885
33
8248679Fra bibliotek2 3 136 16 872 3 386 1 960 888
217
3 4 074 27 696 33 316 11 335 255
Chengdu S ichuan 610054, Ch ina)
Abstract: A new algorithm based on line2labeling and region2grow ing was p roposed for binary connected component labeling. A ll the connected components were labeled w ith one pass, and had no label collisions. The algorithm was independent of the shapes of the connected regions. Then the new algorithm was op tim ized and the search time was reduced. The comparative experiments with traditional algorithm s show that this new method is more efficient and effective.
线标记法 [4 ] 将目标段 (目标物体同一行中两个边界点 像素集合 ,包括边界点 )作为连通体检测的基本单元 ,第一次 扫描时记录冲突的标记并形成等价对 ;第二次扫描时用等价 标记中最小的标号赋予所有等价标号对应的像素点 。
在线标记法的基础上发展起来的算法有基于跑长码的标 记算法 [5 ] 、基于游程的标记算法 [6 ]等 。
本算法综合了线标记法和区域增长法的优点 , 把连通区 域的目标段作为区域增长的“种子段 ”, 充分利用区域的邻域 信息 ,对图像只需要进行一次扫描就可以标记出所有连通区 域 。但是由于每个目标段都需要对上下两行进行扫描判断 (有些判断必定是重复操作 ) , 为了进一步提高算法效率 , 本 文提出优化策略 。
到目前为止 ,图像的标记算法有很多种 ,这些方法大致可 以分为以下 3类 :
像素标记法 根据标记过程中对图像扫描次数的不同可 以分为 :两次扫描法 [1 ] 、单向反复扫描法 [2 ]以及双向反复扫 描法 [3 ] 。两次扫描法第一次扫描时记录冲突的标记并形成 等价对 (存储在特殊的数据结构中 ) ,第二次扫描时 ,把等价 标记中最小的标记赋予所有等价标记对应的像素点 。单向反 复扫描法 ,反复扫描图像 ,并在同一连通区域内传播最小标 号 ,直到没有标号变化为止 。双向反复扫描法 ,正向和反向反 复扫描图像 ,并在邻域内传播标号 ,直到没有标号变化为止 。
区域增长法 [7 ] 依次扫描二值图像中的每个像素点 ,当 找到某个未标记的目标像素时 ,将其压入堆栈并从该点开始 反复标记其邻域 ,直到堆栈为空 。8邻域连通准则下 ,区域增 长的扫描次数可以由 8次降到平均 4次 [8 ] 。
此外还有基于四叉树 [9 ]的表示以及用于特殊体系的计 算机的并行标记算法 [10 ]等 。
第 27卷第 11 2007年 11月
期
计算机应用 Computer App lications
Vol. 27 No. 11 Nov. 2007
文章编号 : 1001 - 9081 (2007) 11 - 2776 - 02
一种二值图像连通区域标记的新算法
高红波 ,王卫星 (电子科技大学 电子工程学院 ,成都 610054)
为了克服线标记法和区域增长法的缺点 ,本文提出了一种 基于区域增长法和线标记法的新方法 。该方法不仅充分利用区 域的邻域信息 ,而且一次扫描就可以标记出图像中所有目标物 体 ,不会出现标号冲突的现象 ,真正做到了快速、简单。为了提高 算法的效率 ,减少比较次数 ,本文还提出了对其的优化策略。
1 本文算法
的边界时出现对内存的非法操作 ,申请一个比原始图像尺寸 上 、下 、左 、右各大一个像素的临时图像 ;由于元素的删除和增 加操作始终在数据结构的顶部进行 ,所以我们采用堆栈作为 存放目标段的数据结构 。在上述伪代码中 , Obj表示二值图 像中的目标物体 , seg表示目标段 , L 表示段的标记值 , U 表示 未标记的目标段集 , stack表示存放目标段的堆栈 , push_ stack 和 pop_stack分别表示入栈和出栈 。 1. 2 算法优化
2 试验结果分析
为了评价本文算法及其改进算法的效率 ,我们设计了传 统的单向反复扫描法 、两次扫描法 、线扫描法以及区域增长法 做对比试验 。本文用大量的二值图像对 5种算法进行了测试 比较 ,测试结果表明本文算法的平均效率远远优于其他四种 算法 。我们给出了 4 种具有典型意义的二值图像的测试结 果 ,如 表 1 所示 。所 有 算 法 均 运 行 在 P4 /2. 0 GHz/512 MB DDR的 PC环境中 。
1. 1 算法描述 当连通区域形状不规则时 ,传统的像素标记法以及线标