[代码片段]YEAH!连通域标记和计数
//标记的连通域存储在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!连通域标记和计数的更多相关文章
- sublime代码片段
创建方法:Tools > New Snippet 这时你会看到如下示例代码: <snippet> <content><![CDATA[ Hello, ${ ...
- 十条jQuery代码片段助力Web开发效率提升
JQuery是继prototype之后又一个优秀的Javascript库.它是轻量级的js库 ,它兼容CSS3,还兼容各种浏览器(IE 6.0+, FF 1.5+, Safari 2.0+, Oper ...
- VS代码片段(snippet)创作工具——Snippet Editor(转)
原文:http://blog.csdn.net/oyi319/article/details/5605502 从Visual Studio 2005开始,IDE支持代码片段.代码片段以代码缩写和TAB ...
- jQuery Mobile高手必备的十大技巧和代码片段
与任何新技术一样,常常难就难在如何开始入手. 有鉴于此,我们整理出了与jQuery Mobile库有关的我认为最便利的一些技巧.方法和代码片段. 由于本文不是旨在全面介绍使用jQuery Mobile ...
- 100个直接可以拿来用的JavaScript实用功能代码片段(转载)
把平时网站上常用的一些实用功能代码片段通通收集起来,方面网友们学习使用,利用好的话可以加快网友们的开发速度,提高工作效率. 目录如下: 1.原生JavaScript实现字符串长度截取2.原生JavaS ...
- sublime text 2代码片段(Snippet)功能的使用
“snippet”在英语里面是“片段”的意思.当我们编码时候,通常想要打几个简略的字符串,就出来一些固定的模板. 例如:使用snippet在新建文件时快速生成HTML头部信息等. 定义很简单,菜单:t ...
- JavaScript实用功能代码片段
把平时网站上常用的一些实用功能代码片段通通收集起来,方面网友们学习使用,利用好的话可以加快网友们的开发速度,提高工作效率. 1.原生JavaScript实现字符串长度截取 function cutst ...
- 创建自己的代码片段(CodeSnippet)
前言 工作中经常会写一些重复的代码片段,如自动属性.for循环.Action等等,针对这种情况,VisualStudio已经给我们提供了一个非常方便的功能--代码片段,是我们可以简单的输入几个字母就能 ...
- 十条很实用的jQuery代码片段
本文转自:http://developer.51cto.com/art/201604/509093.htm 作者:核子可乐译来源:51CTO 原文标题:10 jQuery Snippets for E ...
随机推荐
- maven工程代码关联源代码配置
最近在学习dubbo,在maven构建完成后,需要关联查看一些依赖jar的源码,配置很简单,如下: 勾选windows-Preferences-Maven- Download Artifact Sou ...
- Scala _ [underscore] magic
I started learning Scala a few days before. Initially i was annoyed by the use of too many symbols i ...
- hdu
这道题因为某些位置要重复走,所以不能用标记的方法,但是为了提高效率,可以采用time[]数组和step[]数组来剪枝,很容易想到,当你从一条路劲走到(x,y)处的时间和步骤 比从另一条路劲走到(x,y ...
- debug阶段工作期站立会议2(进度推进)
组名:天天向上 组长:王森 组员:张政.张金生.林莉.胡丽娜 代码地址:HTTPS:https://git.coding.net/jx8zjs/llk.git SSH:git@git.coding.n ...
- 《Java核心技术卷二》笔记(三)正则表达式
正则表达式语法 一个正则表达式描述了字符串的构成规则(模式).如果一个具体的字符串正好符合正则表达式描述的这个规则,这个字符串就是与表达式匹配的.先看一下怎么描述这种规则,也就是正则表达式语法.正则表 ...
- Open vSwitch流表应用实战
本文参考:Open vSwitch流表应用实战 一个通过改变流表下发而实现的互相通信实验. 实验目的: 掌握Open vSwitch下发流表操作: 掌握添加.删除流表命令以及设备通信的原理. 原理:. ...
- unity 环境增强
早上过来解决两个问题: (1)VS2012 配置下 VA_X 插件,现在VS在字体颜色方面已经提高很多,但是在类成员实时显示方面还是不方便,或者我没找到吧 (2)安装unityVs插件,微软把 ...
- 树莓派系统安装、HDMI显示
树莓派上可以安装多种操作系统,我们采用的是官方的基于debian的raspbian.系统安装方式见 安装完系统由于我使用的是7寸的HDMI屏,装完系统如果配置不该的话会导致右边有一部分无法显示,所以在 ...
- hadoop编程模型
1. 拷贝数据 将一个超大的数据文件拷贝到hadoop集群中,hdfs将其分割成多个数据块,然后再把每一个数据块放到不同的节点里面. 2. map函数 提交一个map函数,此map函数可以被jobch ...
- The Producer-Consumer Relationship
//Listing 3-1. The Producer-Consumer Relationship Version 1 public class PC { public static void mai ...