c语言计算二值图像中心位置,C语言版二值图像统计连通区域

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

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

输入待标记图像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,0},-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 *labelmap){

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

Queue *queue = NULL;

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

queue->first = NULL;

queue->last = NULL;

memset(labelmap,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,queue);

popIndex = PopQueue(queue);

while(popIndex > -1){

SearchNeighbor(bitmap,queue);

popIndex = PopQueue(queue);

}

}

}

}

free(queue);

return labelIndex;

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。

总结

以上是编程之家为你收集整理的C语言版二值图像统计连通区域全部内容,希望文章能够帮你解决C语言版二值图像统计连通区域所遇到的程序开发问题。

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

小编个人微信号 jb51ccc

喜欢与人分享编程技术与工作经验,欢迎加入编程之家官方交流群!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值