Скажем, у меня есть следующий двоичный образ, созданный с выхода cv::watershed()
:Как заполнить контуры, которые касаются границы изображения?
Теперь я хочу, чтобы найти и заполнить контуры, так что я могу отделить соответствующие объекты от фона в исходном изображении (который был сегментирован функцией водораздела).
Для сегментации изображения и найти контуры, которые я использую код ниже:
cv::Mat bgr = cv::imread("test.png");
// Some function that provides the rough outline for the segmented regions.
cv::Mat markers = find_markers(bgr);
cv::watershed(bgr, markers);
cv::Mat_<bool> boundaries(bgr.size());
for (int i = 0; i < bgr.rows; i++) {
for (int j = 0; j < bgr.cols; j++) {
boundaries.at<bool>(i, j) = (markers.at<int>(i, j) == -1);
}
}
std::vector<std::vector<cv::Point> > contours;
std::vector<cv::Vec4i> hierarchy;
cv::findContours(
boundaries, contours, hierarchy,
CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE
);
До сих пор так хорошо. Однако, если я прохожу контуры, полученные выше cv::drawContours()
, как показано ниже:
cv::Mat regions(bgr.size(), CV_32S);
cv::drawContours(
regions, contours, -1, cv::Scalar::all(255),
CV_FILLED, 8, hierarchy, INT_MAX
);
Это то, что я получаю:
Левый контур был оставлен открытым путем cv::findContours()
, и, как следствие, не заполняется cv::drawContours()
.
Теперь я знаю, что это следствие cv::findContours()
, отсекающее 1-пиксельную границу вокруг изображения (как указано в documentation), но что делать тогда? Кажется ужасной тратой, чтобы отбросить контур только потому, что это произошло, чтобы очистить границу изображения. И вообще, как я могу найти, какой контур (ы) попадает в эту категорию? cv::isContourConvex()
не является решением в этом случае; регион может быть concave, но «закрыт» и, следовательно, не имеет этой проблемы.
Редактировать: О предположении дублировать пиксели от границ. Проблема заключается в том, что моя маркировке функция также покраска всех пикселей «на фоне», то есть те регионы, я уверен, не является частью какого-либо объекта:
Это приводит к границе втягивается вокруг выход. Если я какой-то образом избежать cv::findContours()
чтобы обрезать эту границу:
Граница для фона становится слита с этим левым объектом:
что приводит к хорошим белым заполненным коробкам ,
Не совсем работать, как планировался. См. Редактирование на мой вопрос. – xperroni
Я не совсем уверен, как вы получили изображение iUYue.png. Почему эта белая граница вокруг всего изображения? –
Я тоже этого не понимаю, я просто использовал функцию водораздела с изображением маркера, которое я показал (первое изображение моего редактирования). – xperroni