2016-02-07 3 views
0

У меня есть контур, который я хотел бы «привязать» к краям изображения. То есть, некоторые вещи, как интеллектуальные ножницы, но для всего контура в то же самое. Пользователь предоставил приблизительный эскиз контура объекта, и я бы хотел его очистить, «нажимая» каждую точку на контуре до ближайшей точки в краевом изображении.Развитие контура OpenCV

Что-то вроде этого существует в OpenCV?

+0

Я не думаю, что OpenCV есть готовое решение, но активные модели змеи, как правило, работают хорошо для этого: HTTPS : //en.wikipedia.org/wiki/Active_contour_model –

+1

Несколько изображений могут помочь. Интеллектуальные ножницы используют активные контуры, змеи и т. П. [OpenCV grabcut] (http://docs.opencv.org/master/d8/d83/tutorial_py_grabcut.html#gsc.tab=0) должен работать хорошо. Вы можете попытаться обеспечить как-то переднего плана_ ваш контур. – Miki

ответ

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 

Что вы можете потерять, является топологией контура. Требуется некоторая обработка. Кроме того, вы не можете контролировать кривизну или гладкость контура, и это не означает эволюцию контура в смысле.

Только если вы заинтересованы, ИТК геодезический активный контур может быть то, что вы ищете http://www.itk.org/Doxygen/html/classitk_1_1GeodesicActiveContourLevelSetImageFilter.html

+0

Я знаю, что вы подразумеваете, установив неизвестную область вокруг контура (предположительно, я установил эту область между эродированным и расширенным областями в «вероятно, переднем плане» в терминологии OpenCV?), Но что вы подразумеваете под «радиусом притяжения» здесь ? –

Смежные вопросы