Я фильтрую небольшие капли из двоичного изображения (контуры с меньшей площадью, чем порог). Маска - это двоичное изображение.drawContours странное поведение?
Если я строка комментария
drawContours(mask, contours, -1, Scalar(255), CV_FILLED, 8);
тогда я получаю странные результаты, когда я сохранить маску после того, как наполняются 0 маленьких сгустков.
Также не понимаю, почему это работает, когда линия раскомментирована, потому что после того, как
drawContours(mask, contours, -1, Scalar(255), CV_FILLED, 8);
маска логически должна быть такой же, как маски ввода (за исключением 1 пикселя ограничительной рамки вокруг изображения)
void FilterSmallBlobs(Mat &mask, float minArea)
{
//as side effect this code extends inner holes with 1 pixel border and removes 1 pixels border from image border.
vector<vector<Point>> contours;
//findContours(mask, contours, CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE);
findContours(mask, contours, CV_RETR_LIST, CV_CHAIN_APPROX_NONE);
vector<vector<Point>> badContours; //contours to erase
for (int i = 0; i < (int)contours.size(); i++)
{
if(contourArea(contours[i]) <= minArea)
badContours.push_back(contours[i]);
}
//drawContours(mask, contours, -1, Scalar(255), CV_FILLED, 8);
drawContours(mask, badContours, -1, Scalar(0), CV_FILLED, 8);
}
что я хочу
Так что я не понимаю WHe drawContours коррумпированной первоначальную маску, когда я заполняю плохие контуры?
Используйте mask.clone() в findCountours, или маска будет b e изменено и покажет, что странный артефакт – Miki
@Miki не понимает, как это может помочь, мне нужно изменить маску, я заполняю плохие контуры 0. – mrgloom
'findContours' изменяет входное изображение' mask'. Вы видите измененную часть только «под» большими блобами, которые вы не рисовали (вы прокомментировали эту строку). Используйте 'findContours (mask.clone(), ...' и будете работать. – Miki