OpenCV:区域生长法实现
1、基本思想:区域生长法的懋鲕壶迎基本思想是:将具有相似性质的像素点合并到一起;在每一个区域内首先要指定一个种子点作为生长的起点;收墩芬蓥然后将种子点周围邻域的像素点与种子点进行比较,对具有相似性质的点合并之后继续向外生长,直到没有满足条件的像素被包括进来为止;这样一个区域的生长就完成了。下图是:发在PAMI上的LSD直线检测算法中的关键一步就是找line support regions.这个区域的查找就是利用区域生长法则,生长的条件就是梯度的方向角度;图中第一张图是原始图像,第二张是计算梯度角度,第三张是根据梯度角度区域生长的结果,相同颜色就是一个区域生长结果。

3、区域生长流程:①给出种子点,这里一次给出一个种子点②给出相似性准则,这里采用灰度差;③将种子点与其八邻域像素点进行相似性比较;相似点则作为下次生长的种子点;④停止生长:八邻域内没有合并的像素点时,即没有新的种子点时,停止。如图所示:


6、给出一个比较好区域生长法的程序://仅根据纹理分割图闻赙酵枭像,纹理特征是四维集合;void segmentTexture(Mat texture){ Mat regions(texture.rows荑樊综鲶, texture.cols, CV_8UC1, 0.0); Mat mark(texture.rows, texture.cols, CV_8UC1, 0.0); int min_regions = 10; RNG rng(25); Point seedPoint, now; Vec4b curr, next, seed; queue<Point> Q; vector<pair<pair<Point, Vec3b>, int> > Points; int pixelCount=0;//pixel covered in a segment for(int i =250; i>10; i -= 250/min_regions) { rng(12345); do { seedPoint.x = rng.uniform(0, texture.cols); seedPoint.y = rng.uniform(0, texture.rows); seed = texture.at<Vec4b>(seedPoint.y, seedPoint.x); } while(mark.at<uchar>(seedPoint.y, seedPoint.x) !=0 ); mark.at<uchar>(seedPoint.y, seedPoint.x) = i; Q.push(seedPoint); while(!Q.empty()) { now = Q.front(); Q.pop(); curr=texture.at<Vec4b>(now.y, now.x); for(int p=-1; p<=1; p++) { for(int q=-1; q<=1; q++) { if(0<=now.x+p && now.x+p<texture.cols && 0<=now.y+q && now.y+q<texture.rows) { next=texture.at<Vec4b>(now.y+q, now.x+p); if(mark.at<uchar>(now.y+q, now.x+p)==0 && (textureDifference(next, seed)==1 || farTextureDifference(next, curr)==2)) { Q.push(Point(now.x+p, now.y+q)); mark.at<uchar>(now.y+q, now.x+p)=i; //segm.at<Vec3b>(now.y, now.x)=image.at<Vec3b>(seedPoint.y, seedPoint.x); } } } } } } ///namedWindow("texture segment",2); ///imshow("texture segment",mark); imwrite("textureSegment.bmp",mark);}