2015-08-19 6 views
1

Я фильтрую небольшие капли из двоичного изображения (контуры с меньшей площадью, чем порог). Маска - это двоичное изображение.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); 
} 

что я получаю enter image description here enter image description here

что я хочу

enter image description here enter image description here

Так что я не понимаю WHe drawContours коррумпированной первоначальную маску, когда я заполняю плохие контуры?

+0

Используйте mask.clone() в findCountours, или маска будет b e изменено и покажет, что странный артефакт – Miki

+0

@Miki не понимает, как это может помочь, мне нужно изменить маску, я заполняю плохие контуры 0. – mrgloom

+0

'findContours' изменяет входное изображение' mask'. Вы видите измененную часть только «под» большими блобами, которые вы не рисовали (вы прокомментировали эту строку). Используйте 'findContours (mask.clone(), ...' и будете работать. – Miki

ответ

2

Как указано в документации findContours

Примечание: Источник изображения изменяется с помощью этой функции.

Таким образом, в вашем случае, вы видите некоторые части измененного изображения, в то время как другие части покрыты, так как вы рисуете маленькие сгустки как черные.

Этот фрагмент кода должен прояснить этот вопрос:

#include <opencv2\opencv.hpp> 
using namespace cv; 

int main() 
{ 
    Mat1b img = imread("path_to_image", IMREAD_GRAYSCALE); 

    vector<vector<Point>> contours; 

    Mat1b will_be_modified = img.clone(); 
    findContours(will_be_modified, contours, RETR_LIST, CHAIN_APPROX_SIMPLE); 

    for (int i = 0; i < contours.size(); ++i) 
    { 
     if (contourArea(contours[i]) < 3000) 
     { 
      drawContours(img, contours, i, Scalar(0), CV_FILLED); 
     } 
    } 

    imshow("img", img); 
    imshow("After findContours", will_be_modified); 
    waitKey(); 

    return 0; 
} 

Результат:

enter image description here

Изображение передается findContours:

enter image description here

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