2015-04-04 2 views
0

Я должен быть в состоянии ввести положение пикселя и получить все то же цветное (в моем случае оно должно быть черным) пиксели, которые подключены к нему. Как это сделать в opencv с C++. Просто выходные пиксели должны быть связаны друг с другом цветным цветом. Метод FindContours() не работает, поскольку он не может быть загружен пикселем.Как обнаружить все связанные соседние пиксели с одинаковым значением цвета в opencv

ответ

3

OpenCV не имеет такой функции, поэтому вам придется реализовать ее самостоятельно. Легким способом было бы реализовать алгоритм поиска, например BFS или DFS в деревьях.

сома псевдо-код:

list<pixels> pixels_in_component; 
stack<pixels> neighbours; 
neighbours.add(starting_point) 

while not neightbours.empty: 
    p = neighbours.pop(); 
    pixels_in_component.append(p) 
    for each adjacent pixel n of p: 
    if color(n) == color(starting_point): 
     neighbours.append(n) 

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

Или (если вы ограничены черными компонентами), вы можете использовать cv :: Threshold для инверсии изображения. Просто используйте инвертированный двоичный порог, где все пиксели выше определенного значения отображаются на ноль, а пиксели ниже порога отображаются на заданное значение.

Если у вас есть изображение CV_8UC1, вы можете просто вызвать порог (вход, выход, 1,255, THRESH_BINARY_INV);

чтобы отобразить черные пиксели до 255, а остальные - к нулю. Затем вы можете просто запустить обычный findContours.

2

Вы должны просто использовать floodFill.

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

+0

Спасибо. Через простой метод заливки (1-й вариант) мы можем изменить цвет только подключенных компонентов. Это не возвращает, какие пиксели подключены. Поэтому я все еще думаю, что это не прямой ответ, а обходной путь. Я предполагаю, что вы предлагаете использовать второй вариант метода floodFill, который включает параметр маски. Но имеет ли эта маска также информация о том, какие пиксели связаны? (или мне нужно вручную найти, какие пиксели заполнены определенным цветом) –

+0

@SamithaChathuranga Проверьте также этот http://stackoverflow.com/q/28364678/2436175. Как вы хотите свой выход? Вектор вектора точек? Вектор двоичных изображений, где каждое бинарное изображение представляет собой одну метку? – Antonio