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
原创粉丝点击