0

我有一个轮廓,我想“捕捉”到图像的边缘。也就是说,类似于智能剪刀的东西,但对于整个轮廓都是一样的。用户提供了对象轮廓的粗略草图,我想通过将轮廓上的每个点“推”到边缘图像中最近的点来清理它。

OpenCV中是否存在类似的东西?

4

1 回答 1

0

cv::grabCut您可以按照建议使用模拟活动轮廓。您选择吸引半径(曲线可以从原始位置演变多远),并通过使用膨胀和侵蚀图像,定义轮廓周围的未知区域。

// cv::Mat img, mask; // contour on mask as filled polygon
if ( mask.size()!=img.size() )
    CV_Error(CV_StsError,"ERROR");
int R = 32; // radius of attraction
cv::Mat strel = cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(2*R+1,2*R+1) );
cv::Mat gc( mask.size(), CV_8UC1, cv::Scalar(cv::GC_BGD) );
cv::Mat t;
cv::dilate( mask, t, strel );
gc.setTo( cv::GC_PR_BGD, t );
gc.setTo( cv::GC_PR_FGD, mask ); // 3
cv::erode( mask, t, strel );
gc.setTo( cv::GC_FGD, t ); // 1
cv::grabCut( img, gc, cv::Rect(), cv::Mat(), cv::Mat(), 2 );
gc &= 0x1; // either foreground or probably foreground
gc *= 255; // so that you see it

您可能会松动的是轮廓的拓扑。那里需要一些处理。此外,您无法控制轮廓的曲率或平滑度,这并不是真正意义上的轮廓演变。

仅当您有兴趣时,ITK 测地线活动轮廓可能就是您正在寻找的东西http://www.itk.org/Doxygen/html/classitk_1_1GeodesicActiveContourLevelSetImageFilter.html

于 2016-02-07T18:16:31.967 回答