[代码片段]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 ...
随机推荐
- USACO 5.4 Telecowmunication(最大流+枚举)
面对最小割之类的题目,完全木想法... 枚举+最大流..复杂度很大了...居然很快的就过了.. /* ID: cuizhe LANG: C++ TASK: telecow */ #include &l ...
- weblogic sockets 和 thread 问题解决
原创文章,转载须注明出处. 这个问题网上很多答案,可惜没一个能解决.后来发现是weblogic 必须适配JDK 版本. 一般会报这个错误,There are: 5 active sockets, bu ...
- vim molokai配色方案(调过)
" Vim color file " " Author: Tomas Restrepo <tomas@winterdom.com> " " ...
- MongoBD解决没有自动增长ID 的问题
Sequence Numbers:序列号传统的数据库中,通常用一个递增的序列来提供主键,在 MongoDB中用 ObjectId 的来代替,我们可以通过如下的函数来获取主键 function coun ...
- ZXing二维码的生成和解析
Zxing是Google提供的关于条码(一维码.二维码)的解析工具,提供了二维码的生成与解析的方法, 现在我简单介绍一下使用Java利用Zxing生成与解析二维码 注意: 二维码的生成需要借助辅助类( ...
- 《GK101任意波发生器》升级固件发布(版本:1.0.2build539)
一.固件说明: 硬件版本:0,logic.3 固件版本:1.0.2.build539 编译日期:2014-10-08 ====================================== 二. ...
- swfit-block反向传值
// ViewController.swift // Block import UIKit class ViewController: UIViewController { var myLabel = ...
- UITableview xib里面 cell 按钮的回调
// MoreBtnCell.m#import <UIKit/UIKit.h> @interface MoreBtnCell : UITableViewCell @property (w ...
- Physically Based Render in Game 序
基于物理渲的渲染理论,从SIGGRAPH06被Naty Hoffman等人提出后,近年来也越来越多的被各大游戏公司所采用,几乎已经是次世代游戏的标准特性,也是每个3D游戏工作者所必备的知识,尽管每年S ...
- 如何开发ecshop支付插件
如何开发ecshop支付插件 ecshop模板网 / 2014-06-03 目标一:搞懂ecshop的支付流程 选完商品,进入购物车页面,点击“结算中心”,页面跳转到flow.php?step=che ...