//标记的连通域存储在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. Windows7下面手把手教你安装Django

    我所使用的操作系统是Windows7,内存是2G 在搜索了一些资料发现,对于Django的安装,详细的真的很少,都说的很简化,然而,这篇blog可以手把手教你成功安装Django 对于Django的详 ...

  2. Json 数据

    来自:极课学院 简介: json与xml json语法 json对象 json对象数组 用到的包 读取json数据例子 创建json数据

  3. 使用SEP禁止客户端修改IP地址 - 飞舞的菜刀 - 51CTO技术博客

    1.首先从注册表中搜寻 IP地址所在的位置,查到几项,此项即可: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Paramete ...

  4. gridview header增加排序图标

    /* add sorting icons to gridview sort links */a.asc:after, a.desc:after { position: relative; top: 1 ...

  5. Apache Spark源码走读之9 -- Spark源码编译

    欢迎转载,转载请注明出处,徽沪一郎. 概要 本来源码编译没有什么可说的,对于java项目来说,只要会点maven或ant的简单命令,依葫芦画瓢,一下子就ok了.但到了Spark上面,事情似乎不这么简单 ...

  6. 【Spec for GS5】不要嘲笑程序员不懂烂漫

    // // main.cpp // 生日快乐 // // Created by wasdns on 16/11/21. // Copyright © 2016年 wasdns. All rights ...

  7. Web 在线文件管理器学习笔记与总结(6)jQuery UI 预览图片

    ① 查看文件内容,如果文件是图片类型,点击直接查看图片: ② 如果不是图片类型,显示文件中的内容: ③ 使用 jQuery UI 中的 Dialog 显示图片 a.引入: <script src ...

  8. UIButton 长按点击 背景改变效果

    1.添加按钮的点击事件和按下事件 [btn setImage:[UIImage imageNamed:@"NorMal.png"] forState:UIControlStateN ...

  9. Unity 中场景切换

    Unity游戏开发中,单个Scene解决所有问题似乎不可能,那么多个Scene之间的切换是必然存在.如果仅仅是切换,似乎什么都好说,但是在场景比较大的时候不想让玩家等待加载或者说场景与场景之间想通过一 ...

  10. 解决mysql数据库连接问题

    设置mysql远程连接root权限 在远程连接mysql的时候应该都碰到过,root用户无法远程连接mysql,只可以本地连,对外拒绝连接.需要建立一个允许远程登录的数据库帐户,这样才可以进行在远程操 ...