c语言 连通域算法 递归,递归函数求连通域
本文主要介绍:利用递归函数,求四连通和八连通邻域。
一、变量定义
1.定义邻域类型
int m_linkType = 4 // 4表示4连通邻域 8表示8连通邻域
2.定义搜寻方向
POINT posDir[8];
posDir[0].x=0; posDir[0].y = -1; //上
posDir[1].x=0; posDir[1].y=1; //下
posDir[2].x=-1; posDir[2].y=0; //左
posDir[3].x=1;posDir[3].y=0; //右
posDir[4].x=-1; posDir[4].y=-1; //左上
posDir[5].x=1;posDir[5].y=-1; //右上
posDir[6].x=-1;posDir[6].y=1; //左下
posDir[7].x=1;posDir[7].y=1; //右下
二、对某一点求连通域函数
/******************************************************************
功能:对某个像素点,用递归函数求连通域
参数:
Inimg :输入图像矩阵
Flag :像素点有没有遍历过标志 0 表示没有 非0表示有
如果对连通域编号,可以赋值为编号值
row :像素点行
col :像素点列
Width :图像矩阵宽
Height:图像矩阵行
Value :起始点像素值
******************************************************************/
void ConnectRegion(unsigned char *Inimg,unsigned char *Flag,int row,
int col,int Width,int Height,int Value)
{
if(row<0||row>=Height||col<0||col>=Width) //如果该次遍历点的行列数,超出图像大小,
return; //则结束本次调用
int tIND2 = row*Width+col;
if(Inimg[tIND2]!=Value||Flag[tIND2]!=0) //如果该次遍历点的像素值不等于起始像素点值,
return; //或该点已遍历过,则结束本次调用
Flag[tIND2] =1;//标记该点已遍历过,也可以赋值为联通域编号,非0即可
//这里,可以得到与起始点连通的点的行列号 row col
//可以根据需求,对行列号存储或计算连通域边界
if(m_linkType==4)
for(int i=0;i<4;i++)//递归搜寻连通域
ConnectRegion(Inimg,Flag,row+posDir[i].y,col+posDir[i].x,Width,Height,Value);
if(m_linkType==8)
for(int i=0;i<8;i++)//递归搜寻连通域
ConnectRegion(Inimg,Flag,row+posDir[i].y,col+posDir[i].x,Width,Height,Value);
}
3.调用形式
//假定图像矩阵Inimg已知 Width:图像宽 Height:图像高
unsigned char *Flag = new unsigned char[Width*Height];//初始化遍历标志
ZeroMemory(Flag,sizeof(unsigned char)*Width*Height);
int tIND1,tIND2;
for(int i=0; i
{
tIND1 = i*Width;
for(int j=0;j
{
tIND2 = tIND1 + j;
if(Flag[tIND2]==0)//该点没有遍历过,即没有连通号
ConnectRegion(Inimg,Flag,i,j,Width,Height,Inimg[tIND2]);//寻找与该点连通的区域
}
}
c语言 连通域算法 递归,递归函数求连通域相关推荐
- c语言编程最大公约数穷举发,C语言基本算法 :1.求最大公约数与最小公倍数
C语言基本算法 :1.求最大公约数与最小公倍数 一.最大公约数: 最大公约数目前有三种求法:更相减损术.辗转相除法以及穷举法. 1.更相减损术: 算法介绍:设两个整数数a和b,以较大数减较小数,得出的 ...
- C语言编程用递归法求
7,用递归法求: (x2!)+(xxx3!)+(5个x相乘5!)+-+((2n-2)个x相乘(2n-2)!)当N为某值是上式为几?(到第n项,n和x的值有键盘输入.) #include<stdi ...
- c语言 连通域算法 递归,VC++ 6.0编写计算机图形学中的种子填充算法,想用递归的八向连通域,求助!...
VC++ 6.0编写计算机图形学中的种子填充算法,想用递归的八向连通域,求助!0 填充函数代码如下: void CComputerGraphicsView::PolygonFill2()//区域填充函 ...
- 寻找连通域算法_FPGA实现的连通域识别算法升级
代码在这:https://github.com/becomequantum/kryon 还做了个算法演示动画:https://www.bilibili.com/video/av26067000 < ...
- c语言筛选法_「干货」C语言经典算法筛选法求质数,极少数人用过的素数求解法...
小编是一个有着6年工作经验的工程师,关于C++编程,自己有做材料的整合,一个完整的C++编程学习路线,学习资料和工具,能够进我的群10048,-83029收取,免费送给大家,希望你也能凭着自己的努力, ...
- C语言编程用递归法求5!
问题描述:请利用递归方法求5!. 问题分析:递归公式:km=km_1*4! 程序源码: #include<stdio.h> int main() { int i; int fact(); ...
- 给定0-1矩阵,求连通域
图像处理题目: 注意,一下所有需要写代码的题目,不允许使用OpenCV的Mat类.如果图片内容需要用指针读取. 1 . 给定0-1矩阵,求连通域.(遇到过N次,笔试面试都有,最好做到能徒手hack代码 ...
- 如何用递归思想 求n的阶乘 C语言
如何用递归思想 求n的阶乘 C语言 首先,我讲一下什么是递归? 一个函数在它的函数体内调用它自身称为递归调用,这种函数称为递归函数.执行递归函数将反复调用其自身,每调用一次就进入新的一层,当最内层的函 ...
- 编写程序C语言 用递归法求n,用C语言编写一个递归程序用来计算:1*2+2*3+3*4+.+(n-1)*n...
用C语言编写一个递归程序用来计算:1*2+2*3+3*4+.+(n-1)*n以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧 ...
最新文章
- fiddler使用技巧进阶,如何抓包修改数据?——AutoResponder重定向
- java 数组排序论文_Java中运用数组的四种排序方法
- java7新特性之Try-with-resources statement
- linux双4g内存花屏,linux不支持4G内存的处理方法
- 数据库视频(一)——整体认识
- 技术管理者必备管理模板
- 小米净水器更换php教程,这种方法更换滤芯寿命更长:小米净水器
- [js插件]分享一个文章内容信息提示插件Colortip
- [禅悟人生]将所学转化成修行
- What is a hardlink and how to create one?
- Aircrack-ng破解WEP
- 浏览器被hao123劫持首页处理
- Microbiome:粪菌移植改善自闭症Fecal microbiota transplant (FMT)
- NodeJS 运行环境
- 计算机应用基础前言,大学计算机基础
- vscode的下载与安装教程
- 豪森药业阿美乐获批,全球第二个三代EGFR-TKI创新药
- 计算机语言VLOOKUP,R下如何实现VLOOKUP函数功能
- 今日金融词汇---应收,是什么?
- struts漏洞总结
热门文章
- 计划任务定时重启mysql_定时重启MySQL、定时重启Apache [任务计划]
- brisk matlab,opencv学习笔记三十七:BRISK特征点检测与匹配
- 为了孩子学英语,花几天时间写了个语法练习小程序
- CLIP(Contrastive Language-Image Pretraining)主体网络代码详解
- 爆火AIGC产品卷翻海外营销:AI一键搞定美工和拍摄,抠图PS设计样样精通,月活迅速破百万...
- 数据治理服务解决方案word
- iOS开发 - HTTP终结者 ASI
- spring xml头文件xmlns和xsi的含义
- 【id:56】【20分】C. 子串循环问题 (Ver. I)
- 【Linux】Linux进程的理解 --- 进程描述符、状态、优先级、切换…