如何判断离散点,利用递归算法统计连续点的个数,通过阈值来判定是否为离散点。opencv代码实现:
#include "cv.h"
#include "highgui.h"
#include <queue>
//点插入队列中
bool flagpoint(POINT point,PointQue &que)
{
for(int i=0;i<que.size();i++)
{
if(que[i].x==point.x && que[i].y==point.y)
{
return false;
}
else
{
que.push_back(point);
return true;
}
}
}
//队列中是否有此点
bool HaveFindPoint(PointQue findque,int x,int y)
{
for(int i=0;i<findque.size();i++)
{
if(findque[i].x==x && findque[i].y==y)
{
return false;
}
}
return true;
}
/*
函数说明:判断离散点 [利用递归算法统计连续点的个数,通过阈值来判定是否为离散点]
目前只支持对2值图像进行处理
参数说明:
psrc 图像
lWidth,lHeight 图片的宽高
X,Y,当前的坐标点
pque收集到的点
m_lend点的个数,离散点的判定长度
m_number已经收集到的个数
返回值:bool类型;是离散点返回false 不是离散点返回true
*/
bool GetNoisePoint(IplImage *pSrc,RECT FindRect,int x,int y,PointQue &pque,PointQue &FindQue,int m_lend,int m_number,bool bFirstPoint)
{
unsigned char *p = (unsigned char*)pSrc->imageData;
#define PIX(x,y) p[pSrc->widthStep * y + x]
POINT point;
m_number++;
if(bFirstPoint)
{
point.x=x;
point.y=y;
pque.push_back(point);
}
if(m_number>m_lend)
return false;
else
{
//考察上下左右以及左上、右上、左下、右下八个方向
//如果是黑色点,则调用函数自身进行递归
//考察下面点
///上方///
point.x=x;
point.y=y-1;
if(pque.size()>3&&pque[0].x==x&&pque[0].y==(y-1))
{
return true;///闭合区域,认为是杂点////
}
if((y-1>=FindRect.top)&&PIX(x,y-1)!=0&&(flagpoint(point,pque)))
{
GetNoisePoint(pSrc,FindRect,x,y,pque,FindQue,m_lend,m_number,false);
}
FindQue.push_back(point);
//左上点
point.x=x-1;
point.y=y-1;
if(pque.size()>3&&pque[0].x==(x-1)&&pque[0].y==(y-1))
{
return true;///闭合区域,认为是杂点////
}
if((y-1>FindRect.top)&&(x-1>=FindRect.left)&&PIX(x-1,y-1)!=0&&(flagpoint(point,pque)))
{
GetNoisePoint(pSrc,FindRect, x-1, y-1,pque,FindQue,m_lend,m_number,false);
}
FindQue.push_back(point);
//左边
point.x=x-1;
point.y=y;
if(pque.size()>3&&pque[0].x==(x-1)&&pque[0].y==(y))
{
return true;///闭合区域,认为是杂点////
}
if((x-1>=FindRect.left)&&PIX(x-1,y)!=0&&(flagpoint(point,pque)))
{
GetNoisePoint(pSrc, FindRect, x-1, y, pque,FindQue,m_lend,m_number,false);
}
FindQue.push_back(point);
//左下边
point.x=x-1;
point.y=y+1;
if(pque.size()>3&&pque[0].x==(x-1)&&pque[0].y==(y+1))
{
return true;///闭合区域,认为是杂点////
}
if((x-1>FindRect.left)&&(y+1<FindRect.bottom)&&PIX(x-1,y+1)!=0&&(flagpoint(point,pque)))
{
GetNoisePoint(pSrc, FindRect, x-1, y+1, pque,FindQue,m_lend,m_number,false);
}
FindQue.push_back(point);
///下面
point.x=x;
point.y=y+1;
if(pque.size()>3&&pque[0].x==(x)&&pque[0].y==(y+1))
{
return true;///闭合区域,认为是杂点////
}
if((y+1<FindRect.bottom)&&PIX(x,y+1)!=0&&(flagpoint(point,pque)))
{
GetNoisePoint(pSrc, FindRect, x, y+1,pque,FindQue,m_lend,m_number,false);
}
FindQue.push_back(point);
//右下面
point.x=x+1;
point.y=y+1;
if(pque.size()>3&&pque[0].x==(x+1)&&pque[0].y==(y+1))
{
return true;///闭合区域,认为是杂点////
}
if((y+1<FindRect.bottom)&&(x+1<FindRect.right)&&PIX(x,y+1)!=0&&(flagpoint(point,pque)))
{
GetNoisePoint(pSrc,FindRect, x+1, y+1,pque,FindQue,m_lend,m_number,false);
}
FindQue.push_back(point);
//右边
point.x=x+1;
point.y=y;
if(pque.size()>3&&pque[0].x==(x+1)&&pque[0].y==(y))
{
return true;///闭合区域,认为是杂点////
}
if((x+1<FindRect.right)&&PIX(x+1,y)!=0&&(flagpoint(point,pque)))
{
GetNoisePoint(pSrc, FindRect ,x+1, y, pque,FindQue,m_lend,m_number,false);
}
FindQue.push_back(point);
//右上///
point.x=x+1;
point.y=y-1;
if(pque.size()>3&&pque[0].x==(x+1)&&pque[0].y==(y-1))
{
return true;///闭合区域,认为是杂点////
}
if((x+1<FindRect.right)&&(y-1>FindRect.top)&&PIX(x+1,y-1)!=0&&(flagpoint(point,pque)))
{
GetNoisePoint(pSrc,FindRect, x+1, y-1, pque,FindQue,m_lend,m_number,false);
}
}
FindQue.push_back(point);
//如果递归结束,返回false,说明是离散点
return FALSE;
}
分享到:
相关推荐
内容概要:本文介绍了如何利用 OpenCV 实现 RANSAC(随机抽样一致性)算法来对一组散点进行旋转矩形拟合的方法。文中详细解释了三个关键函数的作用:pointToLineDistance 用来计算点与直线间的最短距离,...
在实现这些方法时,我们需要先加载待比较的图像,然后根据选择的方法进行相应的处理和计算。在实际应用中,可能会根据需求对结果进行阈值设定,以决定两张图片是否足够相似。例如,如果SSIM或PSNR值高于某个阈值,...
在图像处理领域,OpenCV(开源计算机视觉库)是一个强大的工具,用于实现各种复杂的计算机视觉任务。本项目“opencv细胞个数统计”专注于利用OpenCV进行细胞图像的轮廓跟踪,进而统计细胞的数量、面积和周长等关键...
在实现以上功能时,需要注意OpenCV 2.4版本可能不支持最新的API和特性,因此在编程时需要查阅相应版本的文档,确保兼容性。此外,由于激光雷达数据量通常较大,处理过程中要注意内存管理和计算效率,避免程序崩溃或...
1. **数据结构**:首先,你需要一个合适的数据结构来存储这些离散点,如数组、链表或者自定义的结构体。每个点应包含其坐标信息(通常是二维或三维坐标)。 2. **邻域定义**:曲率计算基于点的局部邻域,通常选择...
2. **OpenCV实现**:在OpenCV中,可以使用 `cv::calcHist()` 函数生成二维直方图,只需设置合适的通道参数。例如,对于RGB图像,可以分别对R、G、B通道进行直方图计算,然后将结果合并。 3. **可视化**:二维直方图...
KMeans算法是一种经典的无...总结,利用Emgu CV(OpenCV的C#接口)实现KMeans算法,可以方便地在.NET环境中进行数据聚类任务。理解算法原理、掌握Emgu CV的使用方法以及合理调整参数,是成功实现和应用KMeans的关键。
代码可能使用Python的OpenCV库,或者其他图像处理框架,实现上述的图像处理流程。在进行这个任务时,开发者需要考虑算法的精度、效率以及对于不同光照、米粒大小和形状变化的适应性。 总结来说,这个项目涵盖了数字...
1. `.gitignore`: 这个文件通常用于指定在Git版本控制系统中忽略哪些文件或目录。在Python项目中,可能会忽略编译生成的文件、日志文件或者环境特定的配置文件。了解`.gitignore`可以帮助保持代码仓库整洁,避免不必...