http://www.bkjia.com/Javabc/771817.html

连通区标记是最基本的图像处理算法之一。该算法中,按从左至右、从上至下的顺序,对整幅图像进行扫描,通过比较每个前景像素的邻域进行连通区标记,并创建等效标记列表。最后,合并等效标记列表,并再次扫描图像以更新标记。算法的优点的是通俗易懂,缺点是需要两次扫描图像,效率不高。

区域生长法利用区域生长的思想,一次生长过程可以标记一整个连通区,只需对图像进行一次扫描就能标记出所有连通区。算法描述如下:

输入待标记图像bitmap,初始化一个与输入图像同样尺寸的标记矩阵labelmap,一个队列queue以及标记计数labelIndex;按从左至右、从上至下的顺序扫描bitmap,当扫描到一个未被标记的前景像素p时,labelIndex加1,并在labelmap中标记p(相应点的值赋为labelIndex),同时,扫描p的八邻域点,若存在未被标记的前景像素,则在labelmap中进行标记,并放入queue中,作为区域生长的种子;当queue不为空时,从queue中取出一个生长种子点p1,扫描p1的八邻域点,若存在未被标记过的前景像素,则在labelmap中进行标记,并放入queue中;重复3直至queue为空,一个连通区标记完成;转到2,直至整幅图像被扫描完毕,得到标记矩阵labelmap和连通区的个数labelIndex。

该算法最坏情况下,将对每个像素点都进行一次八邻域搜索,算法复杂度为O(n)。

typedef struct QNode{

int data;

struct QNode *next;

}QNode;

typedef struct Queue{

struct QNode* first;

struct QNode* last;

}Queue;

void PushQueue(Queue *queue, int data){

QNode *p = NULL;

p = (QNode*)malloc(sizeof(QNode));

p->data = data;

if(queue->first == NULL){

queue->first = p;

queue->last = p;

p->next = NULL;

}

else{

p->next = NULL;

queue->last->next = p;

queue->last = p;

}

}

int PopQueue(Queue *queue){

QNode *p = NULL;

int data;

if(queue->first == NULL){

return -1;

}

p = queue->first;

data = p->data;

if(queue->first->next == NULL){

queue->first = NULL;

queue->last = NULL;

}

else{

queue->first = p->next;

}

free(p);

return data;

}

static int NeighborDirection[8][2] = {{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1,1}};

void SearchNeighbor(unsigned char *bitmap, int width, int height, int *labelmap,

int labelIndex, int pixelIndex, Queue *queue){

int searchIndex, i, length;

labelmap[pixelIndex] = labelIndex;

length = width * height;

for(i = 0;i < 8;i++){

searchIndex = pixelIndex + NeighborDirection[i][0] * width + NeighborDirection[i][1];

if(searchIndex > 0 && searchIndex < length &&

bitmap[searchIndex] == 255 && labelmap[searchIndex] == 0){

labelmap[searchIndex] = labelIndex;

PushQueue(queue, searchIndex);

}

}

}

int ConnectedComponentLabeling(unsigned char *bitmap, int width, int height, int *labelmap){

int cx, cy, index, popIndex, labelIndex = 0;

Queue *queue = NULL;

queue = (Queue*)malloc(sizeof(Queue));

queue->first = NULL;

queue->last = NULL;

memset(labelmap, 0, width * height);

for(cy = 1; cy < height - 1; cy++){

for(cx = 1; cx < width - 1; cx++){

index = cy * width + cx;

if(bitmap[index] == 255 && labelmap[index] == 0){

labelIndex++;

SearchNeighbor(bitmap, width, height, labelmap, labelIndex, index, queue);

popIndex = PopQueue(queue);

while(popIndex > -1){

SearchNeighbor(bitmap, width, height, labelmap, labelIndex, popIndex, queue);

popIndex = PopQueue(queue);

}

}

}

}

free(queue);

return labelIndex;

}

二值图像连通 C语言,二值图像统计连通区域C语言版相关推荐

  1. c语言 字数统计 字符串,基于C语言的字数统计

    摘要:字数统计是文档处理中经常要用到的功能,这其中要包括英文单词.数字和中文等,而且又要和全角或半角的标点符号进行区分,故此在中英文混合文件中进行准确的字数统计也是有一定难度的.这里提出了一种较好的字 ...

  2. c语言如何统计输赢次数,C语言模拟掼蛋中一方最多炸弹数的数学期望

    掼蛋是一种在江苏.安徽地区广为流传的牌类游戏.由地方的扑克牌局"跑得快"."八十分"发展而来.牌局采用四人结对竞赛,输赢升级的方式进行.由于使用两副牌,并且有& ...

  3. c语言 程序统计注释比例,C语言统计单词数量程序 超详解

    /*************************************************************************************************** ...

  4. c语言编程统计学生个数,c编程统计并显示500至800之间所有素数的总个数以及总和...

    编一个程序,输入10个整数,统计并输出其中正数.负数和零的个数.要求用C语言编程. #includemain(){intt,i,c0=0,c1=0,c2=0;for(i=0;i excel 统计某列数 ...

  5. 用R语言做词频统计_R语言 | 词频统计

    Python网络爬虫与文本数据分析 本章内容 导入停用词 读数据,分词 剔除停用词 导入停用词表 library(dplyr) ## [1] "?" "." & ...

  6. R语言应用统计1 主成分分析

    R语言应用统计1 主成分分析 这个系列就讨论应用基础,争取一条公式都不用写.当原始数据集比较庞大,并且不同变量之间存在一些相关性时,我们希望可以用更少的变量来表示原始数据集,用到的变量越少的同时,能够 ...

  7. c语言编程统计单词的个数,使用c语言如何统计单词个数

    使用c语言如何统计单词个数 发布时间:2020-04-21 13:58:58 来源:亿速云 阅读:207 作者:小新 使用c语言如何统计单词个数?相信有很多人都不太了解,今天小编为了让大家更加了解Go ...

  8. c语言 统计数量用count_c语言中统计重复数字次数 c语言问题 统计不同数字的个数...

    请问c语言当中,如何统计数字各自出现的次数 请教一个问题: 在c语言当中,用数组的方法,统计输入的一串数字,统计实现代码: #include int main() { int num = 0, i = ...

  9. 易语言html实现报表打印,易语言报表统计功能例程可打印

    易语言报表统计源码是高级表格支持库的应用例程. .计次循环首 (取数组成员数 (物品资料数组), a) .判断循环首 (查找 (读 ("名称") = 物品资料数组 [a] 且 读 ...

  10. 易语言php统计代码,易语言统计代码行数与API的工具

    DLL命令表 .版本 2 .DLL命令 FindWindowEx, 整数型, "user32", "FindWindowExA", , 在窗口列表中寻找与指定条 ...

最新文章

  1. 通过关闭swap来提高win7运行速度
  2. 用Java获取文件的MD5校验和
  3. linux中注册系统服务—service命令的原理通俗
  4. 考考大家的数学,计算以下计算公式的结果
  5. 奥数之“牛吃草问题”C++实现
  6. (JavaWeb)会话跟踪技术Cookie和Session(重点)
  7. Linux常用错误码--errno-base.h
  8. pat1100. Mars Numbers (20)
  9. C语言中机考投机取巧的方法,计算机二级C语言考试机试经验三部曲:备考篇(一)...
  10. ug链轮设计软件_正版UG软件,UG软件代理,正版UG软件模块功能介绍
  11. 阿里云开源镜像站下载最新Ubuntu和CentOS镜像
  12. awstats的简单配置
  13. vmlogin效果怎么样?亚马逊防关联超级浏览器,电商多账号管理神器
  14. Latex学习之插入编号-实心圆点列表,横杆,数字
  15. yarn.lock、package-lock.json、npm-shrinkwrap.json的理解
  16. 优秀码农选择对象详细指南,看完记得要实战噢
  17. HDU 6082 度度熊与邪恶大魔王 (完全背包)
  18. 一行shell命令实现代码行数统计
  19. 用c语言如何在数字前自动补0
  20. 使用NLP检测和对抗AI生成的假新闻

热门文章

  1. linux时间调整为dst,Linux上系统时间函数、DST等相关有关问题总结
  2. linux 进程 控制终端,linux系统编程之进程(五):终端、作业控制与守护进程
  3. Fluid 0.5 版本:开启数据集缓存在线弹性扩缩容之路
  4. 游戏打包过程枯燥且繁琐,如何提升打包效率?
  5. 一文了解分布式一致性算法EPaxos
  6. RDS For MySQL常见连接问题总结
  7. 怪物行为树案例_Behavior Designer行为树(简单实现巡逻)
  8. python tkinter 循环显示文本_Python简易音乐播放器
  9. 《最后的守护者》的开发技术猜想
  10. 世界上第一台现代计算机是什么