图像连通域标记算法研究

搬以前写的博客【2014-03-01 08:09】

图像连通域标记算法研究 ConnectedComponent Labeling                

最近在研究一篇复杂下背景文字检测的论文。

“Detecting Text in Natural Scenes with Stroke Width Transform ” CPVR 2010的文章,它主要探讨利用文字内部笔画宽度一致作为主要线索来检测文字的一个新奇的算法,当然,我不是想讨论文字检测,论文算法实施的过程中有一步涉及到图像连通域标记算法,在这里我遇到了一些问题,查阅了一些相关文章,所以想分享一下。

数字图像处理中有介绍到过连通域的概念,简单来说就是图像中一片颜色近似一致的区域,准确说是某一片区域中的任何一个像素都与该区域的其他的一个或几个像素8连通(或4连通),连通是指两个像素相邻并且某些属性相同(狭义上是灰度值,广义上可以像素所具备的各种属性,我看的论文里属性就是指像素所在笔画的笔画宽度),那么把这些相同的区域做上统一的标记是我们经常要做的事,研究这一类问题的算法我们就称其连通域标记算法,连通域标记是最基本的图像处理算法之一。

关于这一类问题,先说说我的想法。

想法一:

第一次了解这个问题的时候,看的是维基百科上关于这个的介绍,全英文嘛没看太懂,但是看懂了一部分,于是出现了我的第一种时间效率极其差的办法:

1.逐行扫描,对除了边界像素的每一个像素(边界像素特殊处理)作分析,分析它的左、左上、上、右上邻居:

(1)如果本像素的属性与其他四个邻居中每一个邻居的属性都不同(例如都不是一个灰度级别,再如笔画宽度不在同一个区间范围),那么区域号加1,并把这个新的区域号标记本像素的区域号;

(2)如果只和其中某一个邻居属性相同,那么把邻居的区域号标记本像素区域号

(3)如果和多个邻居属性相同,但是邻居的区域号又各有不同,那么说明了不同邻居虽然区域号不同,但是他们其实是在同一个连通域中,只不过没有扫描到本像素之前,他们并未汇合,所以这里就要统一他们的区域号,这里需要扫描所有的已经标记过的像素,把其中标记的区域号和本像素的邻居们区域号相同的那些像素群的区域号全部统一为其中最小的那个值,同时本像素标记也设为那个值。

2.重复1直到所有点全部扫描完成,最后可以得到一个大小和图像一样大的区域号map,区域号map的值是图像中对应位置的像素所在的区域号。

这样下来,经过一遍扫描之后,各个连通域的区域号已经设定出来,但是会出现不是区域号1,2,3,4,5。。。这样,而可能是1,3,4,6,9。。。这样。  时间复杂度上是O(n^2),n为图像像素的个数。

当然这种算法跑下来时间很久,一张640*480的图需要3分钟(当然是matlab我内部还有许多其他的判定和执行过程)。

想法二:

当然不能就此就这样了,我需要跑200多张图片,一张3分钟。。。所以得改进,重新看了维基百科和一部分介绍二值图像连通域标记算法的论文,发现原来他们讲的是扫描两遍的思想,于是借鉴了他们的想法:

1.还是从上至下逐行扫描,如果遇到想法一里面的(1)(2)两种情况,方法不变,如果遇到第三种情况,不像想法一中那样傻傻的再扫描一次统一赋值,而是把这些邻居的区域号码作为一个对记录到等价关系表equal中,equal(i)=【xi yi】表明区域号为xi,yi的区域是在同一片连通域中,并且在等价表中第i行。那么这里时间复杂度是O(n),

2.把等价关系表先简化,除去重复的部分,再从表做树形检索:

从表的equal(1)开始,在表中搜索满足x1∈equal(i)或者y1∈equal(i)的i的集合,再对集合中每一个i继续做检索直到表中和x1,y1有等价关系的区域号全部被找到。记录下这些区域号,把这些区域号对应的像素,全部统一,从表中删去这些对。重复对表做这样的树形检索,直到每一对都被扫描到,表最后为空,结束,这里的时间复杂度又是O(n),但是用到递归调用,会占据大量的空间,matlab跑竟然报out of memory= =。

想法三:

http://www.cnblogs.com/tiandsp/archive/2012/12/06/2804922.html

这个是网上看到的,同样是两步计算,大同小异,但是比传统的两步标记简单一些,不是等价对,而是等价序列,递归的过程更简单清楚,里面关于算法里面并查集 的介绍很好

想法四:

C:http://blog.stevenwang.name/connected-component-labeling-rg-545001.html

Matlab:http://www.cnblogs.com/tiandsp/archive/2012/12/06/2805276.html

同样是这位老兄推荐的别人的方法,区域生长法,简单高效,O(n)复杂度,实测很快

最后还是借鉴的想法四的思想,毕竟速度快,看来以后得多看一些算法方面的书了。

转载于:https://www.cnblogs.com/jugg1024/p/4204970.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/259544.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

lightoj 1214

lightoj 1214 Large Division (大数除法) 链接:http://www.lightoj.com/volume_showproblem.php?problem1214 题意:给定 a, b 两个数,判断 a 是否整除 b 。(a 为 大数) 思路&#…

二阶振荡衰减 matlab,基于Matlab/Simulink的二阶控制系统仿真研究

1 二阶控制系统模型本文引用地址:http://www.eepw.com.cn/article/201612/328597.htm能够用二阶微分方程描述的系统称为二阶控制系统。在控制工程实践中,二阶控制系统十分常见,例如,电枢控制的直流电动机,RLC网络和弹簧…

CCF201409-5 拼图(30分)

试题编号: 201409-5 试题名称: 拼图 时间限制: 3.0s 内存限制: 256.0MB 问题描述: 问题描述给出一个nm的方格图,现在要用如下L型的积木拼到这个图中,使得方格图正好被拼满,请问总共有…

欧几里得算法(即辗转相除法)的时间复杂度

本文是参考新浪博客而写。 欧几里得算法, 又称辗转相除法, 用于求两个自然数的最大公约数. 算法的思想很简单, 基于下面的数论等式 gcd(a, b) gcd(b, a mod b) 其中gcd(a, b)表示a和b的最大公约数, mod是模运算, 即求a除以b的余数. 代码如下: #include <iostream> #i…

UIImageJPEGRepresentation和UIImagePNGRepresentation

在Iphone上有两种读取图片数据的简单方法: UIImageJPEGRepresentation和UIImagePNGRepresentation. UIImageJPEGRepresentation函数需要两个参数:图片的引用和压缩系数.而UIImagePNGRepresentation只需要图片引用作为参数.通过在实际使用过程中,比较发现: UIImagePNGRepresenta…

C++ 0x

转载于:https://www.cnblogs.com/iiiDragon/p/3230006.html

系列文章----.Net程序员学用Oracle系列

.Net程序员学用Oracle系列(18)&#xff1a;PLSQL Developer 攻略.Net程序员学用Oracle系列(17)&#xff1a;数据库管理工具(SQL Plus).Net程序员学用Oracle系列(16)&#xff1a;访问数据库(ODP.NET).Net程序员学用Oracle系列(15)&#xff1a;DUAL、ROWID、NULL.Net程序员学用Or…

Github for Windows使用介绍

Git已经变得非常流行&#xff0c;连Codeplex现在也已经主推Git。Github上更是充斥着各种高质量的开源项目&#xff0c;比如ruby on rails&#xff0c;cocos2d等等。对于习惯Windows图形界面的程序员来讲&#xff0c;Github的使用是需要点时间和耐心的&#xff0c;然而最近Githu…

matlab中udt函数,《MATLAB信号处理超级学习手册》——2.5 离散时间信号中的运算...

本节书摘来自异步社区《MATLAB信号处理超级学习手册》一书中的第2章&#xff0c;第2.5节&#xff0c;作者&#xff1a;MATLAB技术联盟 , 史洁玉著&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看2.5 离散时间信号中的运算MATLAB信号处理超级学习手册2.5.1 离散…

iOS 将16进制颜色转换成UIColor

很多地方我们都使用16进制颜色&#xff0c;但iPhone使用的是UIColor对象&#xff0c;不直接支持16进制颜色&#xff0c;为此&#xff0c;需要我们手动将16进制颜色转换为UIColor - (UIColor *) hexStringToColor: (NSString *) stringToConvert {NSString *cString [[stringTo…

OBJ 文件格式

OBJ文件是一种标准的3D模型文件格式&#xff0c;很适合用于3D软件模型之间的互导。比如在3dsMax或LightWave中建了一个模型&#xff0c;想把它调到Maya里面渲染或动画&#xff0c;导出OBJ文件就是一种很好的选择。目前几乎所有知名的3D软件都支持OBJ文件的读写&#xff0c;不过…

构建Docker镜像(三)

作者:李晓辉联系方式:Xiaohui_lifoxmail.comQQ:939958092一、建立Dockerfile1、准备文件新建一个目录和一个 Dockerfilemkdir /steventouch /steven/Dockerfile2、更新Dockerfile这个步骤是在设计镜像&#xff0c;如果你需要在镜像内包含什么软件&#xff0c;将来开放哪些端口&…

centos 配置php开发环境变量配置,CentOS中配置PHP和Nginx环境变量

搜索热词一、摘要在Linux CentOS系统上 安装完PHP和Nginx后&#xff0c;一般需要执行查看版本命令’PHP -v’和’Nginx -v’,确认是否安装成功,如果在没有添加到环境变量之前&#xff0c;执行“PHP -v”命令查看当前PHP版本信息时&#xff0c;则会提示命令不存在的错误&#xf…

你必须很努力,才能看上去毫不费力

世上没有一件工作不辛苦&#xff0c;没有一处人事不复杂。 从今天起&#xff0c;每天微笑吧&#xff0c; 世上除了生死&#xff0c;都是小事。 不管遇到了什么烦心事&#xff0c;都不要自己为难自己&#xff1b; 无论今天发生多么糟糕的事&#xff0c;都不应该感到悲伤。 今天是…

HDU 4631 Sad Love Story 平面内最近点对

http://acm.hdu.edu.cn/showproblem.php?pid4631 题意: 在平面内依次加点,求每次加点后最近点对距离平方的和 因为是找平面最近点对...所以加点以后这个最短距离一定是递减的...所以最后会形成这样一个函数图像 所以我们只要从后往前依次删点即可... 15秒惊险水过...不过我最小…

c++三/五法则

如果这个类需要一个析构函数&#xff0c;我们几乎可以肯定它也需要一个拷贝构造函数和一个拷贝赋值运算符。 如果一个类需要拷贝构造函数&#xff0c;几乎可以肯定它也需要一个拷贝赋值运算符&#xff0c;反之亦然。 然而&#xff0c;无论是需要拷贝构造函数还是需要拷贝赋值运…

itoa的用法

功能&#xff1a;将任意类型的整数转换为字符串。在<stdlib.h>中与之有相反功能的函数是atoi。 用法&#xff1a;char*itoa(int value,char*string,int radix); int value 被转换的整数&#xff0c;char *string 转换后储存的字符数组&#xff0c;int radix 转换进制数…

Tomcat与Gzip与缓存

国内私募机构九鼎控股打造APP&#xff0c;来就送 20元现金领取地址&#xff1a;http://jdb.jiudingcapital.com/phone.html内部邀请码&#xff1a;C8E245J &#xff08;不写邀请码&#xff0c;没有现金送&#xff09;国内私募机构九鼎控股打造&#xff0c;九鼎投资是在全国股份…

java竖向菜单,垂直滑动菜单

www.lanrentuku.comtd {font-size: 12px;}width"200" />height9 src"images/bit05.gif" width8alignabsMiddle> href"javascript:void(null)">文管产品 src"images/bit06.gif" width8 alignabsMiddle> href"http://w…

作为IT从业者,你是如何做好个人职业规划?

前言 写这篇文章的原因是因为你前端时间看到朋友在公众号&#xff08;Marno&#xff09;发的一篇文章《27岁程序员职业生涯的“中年危机”》有感而发&#xff0c;谈谈自己对IT从业人员的一些职业规划上的想法。本篇文章是我在坐地铁的时候在手机上码出来的&#xff0c;写的不好…