OpenCV: как получить контуры объекта, который является черно-белым?

У меня проблемы с получением контуров объекта на моих фотографиях.

Чтобы удалить весь шум, я использую adjustROI() и Canny().

Я также пробовал erode() и dillate(), Laplacian(), GaussianBlur(), _7 _... и даже нашел этот фрагмент кода для резкости изображения:

GaussianBlur(src, dst_gaussian, Size(0, 0), 3);

addWeighted(src, 1.5, dst_gaussian, -0.5, 0, dst);

Но мой результат всегда один и тот же: мой объект заполнен черным и белым цветом (как шум на экране телевизора), так что невозможно получить контуры с помощью findContours() (findContours() находит миллион контуров, но не один из весь объект. Я проверяю это с помощью drawContours()).

Я использую C ++ и загружаю свое изображение как мат в оттенках серого (для Canny оно должно быть в оттенках серого). Мой объект имеет различную форму на каждом изображении, но он всегда находится примерно в середине изображения.

Мне либо нужно найти способ получить более качественный цвет объекта путем обработки изображения - но я не знаю, что еще попробовать, - либо способ, как заполнить объект цветом после обработки изображения (без его контуров, потому что это чего хочу в итоге).

Любые идеи приветствуются. Заранее спасибо.


person Temer    schedule 07.08.2012    source источник
comment
Будет очень сложно ответить, если вы не приведете примеры. Как я понял из вашего предыдущего поста, вы не можете размещать фотографии, так как они вам не «принадлежат». Не могли бы вы создать похожие изображения?   -  person Quentin Geissmann    schedule 07.08.2012


Ответы (1)


Я нашел решение, которое работает в большинстве случаев. Я заполняю свой объект с помощью вероятностного преобразования Хафа HoughLinesP().

vector<Vec4i> lines;
HoughLinesP(dst, lines, 1, CV_PI/180, 80, 30, 10);
for(size_t i = 0; i < lines.size(); i++)
{
    line(color_dst, Point(lines[i][0], lines[i][1]), Point(lines[i][2], lines[i][3]), Scalar(0,0,255), 3, 8);
}

Это из некоторого примера кода, который предоставляет документация OpenCV.

После использования некоторого алгоритма обнаружения краев (например, Canny()) вероятностное преобразование Хафа находит объекты в двоичных изображениях. Алгоритм находит линии, которые, если их нарисовать, представляют весь объект. Конечно, некоторые параметры нужно адаптировать под какую-то картинку.

Я не уверен, сработает ли это для каждого изображения или каждого объекта, но в моем случае это так.

person Temer    schedule 10.08.2012