//标记的连通域存储在buff[]里
//返回值为连通域个数
int LinkBlob(unsigned char **imagedata,unsigned char buff[], int height, int width)
{
int x,y,domain_num=;
int i;
unsigned long offset;
//unsigned char imagedata[]; for(i=; i<width*height; i++)
buff[i]=;
i=; //for(offset = 0; offset<height*width; offset++) //遍历图像的点
for (y = ; y<height; y++)
{
for (x = ; x<width; x++)
{
offset = y*width + x;
/*x = offset % width;
y = offset / width;*/
if(y == )//第0行
{
if(x == )//第0列第0行
{
//if(imagedata[y][x] == FORECOLOR)//如果第0点有值则将其分配到区域一
//{
buff[offset]=i;
domain_num++; //联通域数量增一
//}
}
else//如果是第0行的其它点
{
//if(imagedata[y][x]==FORECOLOR) //如果有值
//{ if(imagedata[y][x-] == imagedata[y][x]) //如果它的前一点有值,则将它归属到它的前一点的联通域
{
i=buff[offset-];//获取前一点的联通域序号,传给i
buff[offset]=i;//将该点赋给i指定的联通域
}
else//如果它的前一点没有值,则将它归到另一个联通域
{
domain_num++;//联通域数量增一
i=domain_num;
buff[offset]=i;//将它标记为i联通域
}
//}
}
}
else if( x== && y>)//如果是第一行下的行和第0列,则只检测其上方及其右上方的点
{
//if(imagedata[y][x]==FORECOLOR)//如果有值
//{
if(imagedata[y-][x] == imagedata[y][x])//如果其上方的点有值则将它归属到上方点所属的连通域里
{
i = buff[x+(y-)*width]; //上方点的连同域的序号
buff[offset]=i; //将此点归属到上方点的连同域
}
else if(imagedata[y-][x+] == imagedata[y][x]) //则检测其右上方的点,如果右上方的点有值
{
i = buff[x++(y-)*width]; //右上方点的连同域的序号
buff[offset] = i; //将此点归属到右上方点的连同域
}
else //如果在上方的点和右上方的点都没有值,则另设一个连同域
{
domain_num++; //联通域数量增一
i = domain_num;
buff[offset] = i; //将它标记为i联通域
}
//}
}
else if(x == (width-) && y > )//如果是靠最右则第0行以下的点
{
//if(imagedata[y][x]==FORECOLOR)//如果此点有值
//{
if(imagedata[y][x-] == imagedata[y][x]) //如果它的前一点有值,则将它规属到前一点的连同域里
{
i = buff[offset-]; //获取前一点的联通域序号,传给i
buff[offset] = i; //将该点赋给i指定的联通域
}
else if(imagedata[y-][x-] == imagedata[y][x]) //否则如果其左上方有值,则将它归属到左上方的连同域里
{
i = buff[x-+(y-)*width]; //获取左上方点的联通域序号,传给i
buff[offset] = i; //将该点赋给i指定的联通域
}
else if(imagedata[y-][x] == imagedata[y][x]) //否则如果其上方的点有值,则归属到其上方的点的连同域里
{
i = buff[x+(y-)*width];//上方点的连同域的序号
buff[offset] = i;//将此点归属到上方点的连同域
}
else//它的前方,左上方,上方的点都没有值,则另设连同域
{
domain_num++;//联通域数量增一
i=domain_num;
buff[offset]=i;//将它标记为i联通域
}
//}
}
else //如果是其它正常的点
{
//if(imagedata[y][x]==FORECOLOR)//如果此点有值
//{
if(imagedata[y][x-] == imagedata[y][x])//如果它的前一点有值,则将它规属到前一点的连同域里
{
i = buff[offset-];//获取前一点的联通域序号,传给i
buff[offset]=i;//将该点赋给i指定的联通域 if(imagedata[y-][x] == imagedata[y][x]) //继续检测其上方的点,如果上方点有值
{
//if(buff[x+(y-1)*width]<buff[offset])//如果上方的点
}
else if(imagedata[y-][x+] == imagedata[y][x]) //否则如果其右上方才有值
{
if(buff[x++(y-)*width] < buff[offset])//如果右上方的点的域序号小
{
for(i=;i<width*height;i++) //则将其所有的属于本点连通域的点都归到右上方的点的连通域
{
if(buff[i]==buff[offset])
{
buff[i]=buff[x++(y-)*width];
}
else if(buff[i]>buff[offset])//所有大于本点的连通域序号的连通域序号自减1
{
buff[i]--;
}
}
domain_num--;//连通域序号减1
}
else if(buff[x++(y-)*width] > buff[offset])//否则则反之
{
for(i=;i<width*height;i++)
{
if(buff[i]==buff[x++(y-)*width])
{
buff[i]=buff[offset];
}
else if(buff[i]>buff[x++(y-)*width])
{
buff[i]--;
}
}
domain_num--;//连通域序号减1
}
}
}
else if(imagedata[y-][x-] == imagedata[y][x])//否则如果其左上方有值,则将它归属到左上方的连同域里
{
i=buff[x-+(y-)*width];//获取左上方点的联通域序号,传给i
buff[offset]=i;//将该点赋给i指定的联通域 if(imagedata[y-][x+] == imagedata[y][x])//继续检测其右上方的点
{
if(buff[x++(y-)*width] < buff[offset])//如果右上方的点的域序号小
{
for(i=;i<width*height;i++)//则将其所有的属于本点连同域的点都归到右上方的点的连同域
{
if(buff[i]==buff[offset])
{
buff[i]=buff[x++(y-)*width];
}
else if(buff[i]>buff[offset])//所有大于本点连通域序号的连通域序号自减1
{
buff[i]--;
}
}
domain_num--;//连通域序号减1
}
else if(buff[x++(y-)*width] > buff[offset])//否则则反之
{
for(i=;i<width*height;i++)
{
if(buff[i]==buff[x++(y-)*width])
{
buff[i]=buff[offset];
}
else if(buff[i]>buff[x++(y-)*width])
{
buff[i]--;
}
}
domain_num--;//连通域序号减1
}
}
}
else if(imagedata[y-][x] == imagedata[y][x])//否则如果其上方的点有值,则归属到其上方的点的连同域里
{
i = buff[x+(y-)*width];//上方点的连同域的序号
buff[offset] = i;//将此点归属到上方点的连同域
}
else if(imagedata[y-][x+] == imagedata[y][x])//否则如果其右上方的点有值,则将其归到其右上方点的连通域里
{
i = buff[x++(y-)*width];//右上方点的连同域的序号
buff[offset] = i;//将此点归属到右上方点的连同域
}
else //如果以上检测都没有值,则另建连同域
{
domain_num++;//联通域数量增一
i = domain_num;
buff[offset] = i;//将它标记为i联通域
}
//}
}
}//x end
}//y end return domain_num;
}

[代码片段]YEAH!连通域标记和计数的更多相关文章

  1. sublime代码片段

    创建方法:Tools > New Snippet 这时你会看到如下示例代码: <snippet>      <content><![CDATA[ Hello, ${ ...

  2. 十条jQuery代码片段助力Web开发效率提升

    JQuery是继prototype之后又一个优秀的Javascript库.它是轻量级的js库 ,它兼容CSS3,还兼容各种浏览器(IE 6.0+, FF 1.5+, Safari 2.0+, Oper ...

  3. VS代码片段(snippet)创作工具——Snippet Editor(转)

    原文:http://blog.csdn.net/oyi319/article/details/5605502 从Visual Studio 2005开始,IDE支持代码片段.代码片段以代码缩写和TAB ...

  4. jQuery Mobile高手必备的十大技巧和代码片段

    与任何新技术一样,常常难就难在如何开始入手. 有鉴于此,我们整理出了与jQuery Mobile库有关的我认为最便利的一些技巧.方法和代码片段. 由于本文不是旨在全面介绍使用jQuery Mobile ...

  5. 100个直接可以拿来用的JavaScript实用功能代码片段(转载)

    把平时网站上常用的一些实用功能代码片段通通收集起来,方面网友们学习使用,利用好的话可以加快网友们的开发速度,提高工作效率. 目录如下: 1.原生JavaScript实现字符串长度截取2.原生JavaS ...

  6. sublime text 2代码片段(Snippet)功能的使用

    “snippet”在英语里面是“片段”的意思.当我们编码时候,通常想要打几个简略的字符串,就出来一些固定的模板. 例如:使用snippet在新建文件时快速生成HTML头部信息等. 定义很简单,菜单:t ...

  7. JavaScript实用功能代码片段

    把平时网站上常用的一些实用功能代码片段通通收集起来,方面网友们学习使用,利用好的话可以加快网友们的开发速度,提高工作效率. 1.原生JavaScript实现字符串长度截取 function cutst ...

  8. 创建自己的代码片段(CodeSnippet)

    前言 工作中经常会写一些重复的代码片段,如自动属性.for循环.Action等等,针对这种情况,VisualStudio已经给我们提供了一个非常方便的功能--代码片段,是我们可以简单的输入几个字母就能 ...

  9. 十条很实用的jQuery代码片段

    本文转自:http://developer.51cto.com/art/201604/509093.htm 作者:核子可乐译来源:51CTO 原文标题:10 jQuery Snippets for E ...

随机推荐

  1. TAT,我的LCT转双旋了

    这里是rotate和splay函数 void rotate(int x) { ]==x; ch[y][d^]=ch[x][d];pre[ch[x][d]]=y; ch[z][ch[z][]==y]=x ...

  2. centos 下如何加入sudo 用户

    当在终端执行sudo命令时,系统提示“ jackluo is not in the sudoers file”: $ sudo ls Password:jackluo is not in the su ...

  3. SSH整合所需的jar包

    Spring3.1+Hibernate3+Struts2的最新整合所需要的jar包 Spring的基本jar包: 1.org.springframework.web-3.1.4.RELEASE.jar ...

  4. 李洪强-C语言关键字、标识符和注释

    一.关键字 C语言提供的有特殊含义的符号,共32个. 在Xcode中关键字全部高亮显示,关键字全部都为小写.如return.int等. 二.标识符 定义:标识符是程序员在程序中自定义的一些符号和名称. ...

  5. stack, deque 和 queue的对比

    stack, deque 和 queue这三个c++的STL的数据结构很类似但又各有不同. stack是堆栈,没有迭代器,特点是后进先出.用push()将元素压入栈中,top()返回栈顶元素,pop( ...

  6. rsync服务器的配置和使用

    yum install -y rsyncuseradd rsync -s /sbin/nologinmkdir /backupmkdir /backup1 chown rsync:rsync /bac ...

  7. Layui - 示例

    示例地址 http://www.layui.com/demo/ 下载地址 http://www.layui.com/ 示例代码 <!doctype html> <html> & ...

  8. Linux邮件服务器架构

    // 上面的过程只是实现了简单的本地用户的文件发送功能,只需要安装mailutil,不需要安装配置sendmail,看鸟哥的Linux私房菜中写的应该是本地用户发送邮件不需要sendmail.只有当非 ...

  9. mysql的事务处理与锁表

    数据库的事务处理可以保证一组处理结果的正确性.mysql中只有INNODB和BDB引擎的数据表才支持事务处理,对于不支持事务的MyISAM引擎数据库可以使用表锁定的方法来实现相同的功能. mysql的 ...

  10. optimize table table_name myisam mysql自动清除删除过留下的空记录

    optimize table table_name 这个可以清除你表里面的空记录,每次清除的时候记得锁表 lock tables table_name  write|read; unlock tabl ...