图斑合并过程求边界

来源:互联网 发布:成都管家婆软件 编辑:程序博客网 时间:2024/05/01 14:16

图像分割中的多尺度分析:图斑合并过程中合并后的图斑边界也会变化,需要实时计算更新后的图斑边界,计算过程大致为先得到合并图斑的掩膜,利用掩膜计算合并图斑边界。以下算法本人自己实现的,结果可以获得图斑所有边界,但是无法计算边界数量与边界之间的关系(边界之间的层次关系,类似opencv里findContours里的level 0 ,level 1这样的),但是对于合并图斑来说,其掩膜为有且只有一个边界的封闭连通区域,能够满足要求。

函数实现:

void findBoundary(cv::Mat &mask,std::vector<cv::Point> &boundary){int height=mask.rows;int width=mask.cols;for ( int x=0;x<width;x++ ){for ( int y=0;y<height;y++ ){int curvalue=mask.at<uchar>(y,x);if ( curvalue!=0 ){if ( x==0 || x==width-1 || y==0 || y==height-1 ){boundary.push_back(Point(x,y));}else{//4邻域if ( mask.at<uchar>(y,x-1)==0 || mask.at<uchar>(y,x+1)==0 || mask.at<uchar>(y-1,x)==0 || mask.at<uchar>(y+1,x)==0){ boundary.push_back(Point(x,y)); }}}}}}
此处利用一个小实验来测试该函数:
#include "opencv2/imgproc/imgproc.hpp"#include "opencv2/highgui/highgui.hpp"using namespace cv;using namespace std;int main(){cv::Mat mask;//create buffer along the contourstd::vector<cv::Point> boundary; mask=imread("test.png");cvtColor(mask,mask,CV_BGR2GRAY);// accept only char type matrices  CV_Assert( mask.depth() == CV_8U );// accept only gray scale matricesCV_Assert( mask.channels() == 1 );findBoundary(mask,boundary);Mat end=cv::Mat::zeros(mask.rows,mask.cols,CV_8UC1);for (std::vector< cv::Point >::const_iterator it=boundary.begin();it!=boundary.end();it++){ end.at<uchar>(*it)=255; }imwrite("end.jpg",end);return 0;}
实验图像:

测试结果:

0 0
原创粉丝点击