二值图像连通 C语言,二值图像统计连通区域C语言版
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语言版相关推荐
- c语言 字数统计 字符串,基于C语言的字数统计
摘要:字数统计是文档处理中经常要用到的功能,这其中要包括英文单词.数字和中文等,而且又要和全角或半角的标点符号进行区分,故此在中英文混合文件中进行准确的字数统计也是有一定难度的.这里提出了一种较好的字 ...
- c语言如何统计输赢次数,C语言模拟掼蛋中一方最多炸弹数的数学期望
掼蛋是一种在江苏.安徽地区广为流传的牌类游戏.由地方的扑克牌局"跑得快"."八十分"发展而来.牌局采用四人结对竞赛,输赢升级的方式进行.由于使用两副牌,并且有& ...
- c语言 程序统计注释比例,C语言统计单词数量程序 超详解
/*************************************************************************************************** ...
- c语言编程统计学生个数,c编程统计并显示500至800之间所有素数的总个数以及总和...
编一个程序,输入10个整数,统计并输出其中正数.负数和零的个数.要求用C语言编程. #includemain(){intt,i,c0=0,c1=0,c2=0;for(i=0;i excel 统计某列数 ...
- 用R语言做词频统计_R语言 | 词频统计
Python网络爬虫与文本数据分析 本章内容 导入停用词 读数据,分词 剔除停用词 导入停用词表 library(dplyr) ## [1] "?" "." & ...
- R语言应用统计1 主成分分析
R语言应用统计1 主成分分析 这个系列就讨论应用基础,争取一条公式都不用写.当原始数据集比较庞大,并且不同变量之间存在一些相关性时,我们希望可以用更少的变量来表示原始数据集,用到的变量越少的同时,能够 ...
- c语言编程统计单词的个数,使用c语言如何统计单词个数
使用c语言如何统计单词个数 发布时间:2020-04-21 13:58:58 来源:亿速云 阅读:207 作者:小新 使用c语言如何统计单词个数?相信有很多人都不太了解,今天小编为了让大家更加了解Go ...
- c语言 统计数量用count_c语言中统计重复数字次数 c语言问题 统计不同数字的个数...
请问c语言当中,如何统计数字各自出现的次数 请教一个问题: 在c语言当中,用数组的方法,统计输入的一串数字,统计实现代码: #include int main() { int num = 0, i = ...
- 易语言html实现报表打印,易语言报表统计功能例程可打印
易语言报表统计源码是高级表格支持库的应用例程. .计次循环首 (取数组成员数 (物品资料数组), a) .判断循环首 (查找 (读 ("名称") = 物品资料数组 [a] 且 读 ...
- 易语言php统计代码,易语言统计代码行数与API的工具
DLL命令表 .版本 2 .DLL命令 FindWindowEx, 整数型, "user32", "FindWindowExA", , 在窗口列表中寻找与指定条 ...
最新文章
- 通过关闭swap来提高win7运行速度
- 用Java获取文件的MD5校验和
- linux中注册系统服务—service命令的原理通俗
- 考考大家的数学,计算以下计算公式的结果
- 奥数之“牛吃草问题”C++实现
- (JavaWeb)会话跟踪技术Cookie和Session(重点)
- Linux常用错误码--errno-base.h
- pat1100. Mars Numbers (20)
- C语言中机考投机取巧的方法,计算机二级C语言考试机试经验三部曲:备考篇(一)...
- ug链轮设计软件_正版UG软件,UG软件代理,正版UG软件模块功能介绍
- 阿里云开源镜像站下载最新Ubuntu和CentOS镜像
- awstats的简单配置
- vmlogin效果怎么样?亚马逊防关联超级浏览器,电商多账号管理神器
- Latex学习之插入编号-实心圆点列表,横杆,数字
- yarn.lock、package-lock.json、npm-shrinkwrap.json的理解
- 优秀码农选择对象详细指南,看完记得要实战噢
- HDU 6082 度度熊与邪恶大魔王 (完全背包)
- 一行shell命令实现代码行数统计
- 用c语言如何在数字前自动补0
- 使用NLP检测和对抗AI生成的假新闻
热门文章
- linux时间调整为dst,Linux上系统时间函数、DST等相关有关问题总结
- linux 进程 控制终端,linux系统编程之进程(五):终端、作业控制与守护进程
- Fluid 0.5 版本:开启数据集缓存在线弹性扩缩容之路
- 游戏打包过程枯燥且繁琐,如何提升打包效率?
- 一文了解分布式一致性算法EPaxos
- RDS For MySQL常见连接问题总结
- 怪物行为树案例_Behavior Designer行为树(简单实现巡逻)
- python tkinter 循环显示文本_Python简易音乐播放器
- 《最后的守护者》的开发技术猜想
- 世界上第一台现代计算机是什么