OpenCV实现区域生长算法
来源:互联网 发布:开淘宝店邮费 编辑:程序博客网 时间:2024/04/30 06:43
区域生长是按照预先定义的生长准则将像素或子区域组合为更大区域的过程。其基本原理是:从原始种子点集开始,利用图像中点的连通性,通过把区域生长把有强度、灰度级、纹理颜色等有相似属性的相邻元素合并成一个完整的区域。这个过程是迭代进行的,其中每个种子像素点都进行迭代生长,直到处理完成整个图像以此来形成了不同的区域,而这些区域的边界通过闭合的多边形定义。 由于OpenCV没有集成区域生长函数,而网上很多都是不能用的,因此自己写了一个代码:
/*说明:区域生长算法输入:原图像、种子点判断准则、生长准则返回:生长图像*/#include<opencv2\opencv.hpp>#include<iostream>using namespace std;using namespace cv;Mat RegionGrow(Mat MatIn,int iGrowPoint,int iGrowJudge);int main(){Mat MatIn=imread("G:\\Picture\\Plane.jpg",0);//imshow("2",MatIn);Mat MatOut(MatIn.size(),CV_8UC1,Scalar(0));MatOut=RegionGrow(MatIn,200,1);imshow("1",MatOut);cvWaitKey(0);}Mat RegionGrow(Mat MatIn,int iGrowPoint,int iGrowJudge)//iGrowPoint为种子点的判断条件,iGrowJudge为生长条件{Mat MatGrowOld(MatIn.size(),CV_8UC1,Scalar(0));Mat MatGrowCur(MatIn.size(),CV_8UC1,Scalar(0));Mat MatGrowTemp(MatIn.size(),CV_8UC1,Scalar(0));//初始化原始种子点for(int i=0;i<MatIn.rows;i++){for(int j=0;j<MatIn.cols;j++){ int it=MatIn.at<uchar>(i,j);if(it<=iGrowPoint)//选取种子点,自己更改{MatGrowCur.at<uchar>(i,j)=255;}}}imshow("MatGrowCur",MatGrowCur);int DIR[8][12]={{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};Mat MatTemp=MatGrowOld-MatGrowCur;int iJudge=countNonZero(MatTemp);if(iJudge!=0)//MatGrowOld!=MatGrowCur 判断本次和上次的种子点是否一样,如果一样则终止循环{MatGrowTemp=MatGrowCur;for(int i=0;i<MatIn.rows;i++){for(int j=0;j<MatIn.cols;j++){if(MatGrowCur.at<uchar>(i,j)==255 && MatGrowOld.at<uchar>(i,j)!=255){for(int iNum=0;iNum<9;iNum++){int iCurPosX=i+DIR[iNum][0];int iCurPosY=j+DIR[iNum][1];if(iCurPosX>0 && iCurPosX<(MatIn.rows-1) && iCurPosY>0 && iCurPosY<(MatIn.cols-1)){if(abs(MatIn.at<uchar>(i,j)-MatIn.at<uchar>(iCurPosX,iCurPosY))<iGrowJudge )//生长条件,自己调整{MatGrowCur.at<uchar>(iCurPosX,iCurPosY)=255;}}}}}}MatGrowOld=MatGrowTemp;}return MatGrowCur;}
由于种子点的选取条件和生长条件并没有一个普适的准则,所以需要自己根据图像适当调整。
原图像如图:
运行程序结果如图:
。
1 0
- OpenCV实现区域生长算法
- OpenCV - 区域生长算法
- 区域生长算法原理及MATLAB实现
- 区域生长算法原理以及Matlab实现
- 区域生长算法的一种C++实现
- 区域生长算法原理及MATLAB实现
- 区域生长算法:
- 区域生长算法代码
- 区域生长算法
- 区域生长算法
- 区域生长算法 C#
- 区域生长算法
- 区域生长算法
- 区域生长算法
- 区域生长算法
- matlab实现区域生长
- 区域生长和matlab实现
- [转]区域生长算法C++代码
- 我CSDN博客被黑经历
- Windows Server 2008 R2服务器远程连接把上一个连接挤掉
- STS搭建Spring MVC 项目
- ProgressBar自定义
- emmc知识
- OpenCV实现区域生长算法
- HTTP客户端(libcurl) & HTTP服务端(libevent)
- 【jeecg移动开发能力】Jeecg 重磅来袭,强大移动报表配置能力,一次配置七种展现风格
- object-c学习笔记
- NDK环境搭建(Native Code的编译,不需要Cygwin)
- 51单片机——LCD1602
- iOS 蓝牙开发那些事
- 计算的极限(一):所有机器的机器,与无法计算的问题
- Android 6.0 运行时权限处理完全解析