我有一个轮廓,我想要“捕捉”到图像的边缘。也就是说,像智能剪刀这样的东西,但同时适用于整个轮廓。用户提供了对象轮廓的粗略草图,我想通过将轮廓上的每个点“推”到边缘图像中最近的点来清理它。
在OpenCV中有这样的东西吗?
发布于 2016-02-08 02:16:32
您可以按照建议使用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
https://stackoverflow.com/questions/35255145
复制相似问题