2015-10-14 2 views
3

Я ищу простой и элегантный способ подсчета белых пикселей в каждом блобе отдельно. Например, у меня есть картина, как это:Как подсчитать белые пиксели в каждом блоке в opencv?

black and white image

Код:

cv2.findContours(mat.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE) 
areas = [(lambda c: cv2.moments(c)['m00'])(c) for c in contours] 

возвращается [255.0, 482.5, 6480.5, 6230.0, 15531.0, 19810.0], но я хочу иметь только 3 значения, есть 3 отдельных капли.

+0

Вы хотите площадь каждого блоба? Что заставляет вас думать, что есть только три капли? Два или более пикселей вместе считаются blob !! – Arjun

+0

@ Арджун, что? Здесь есть 3 белых пятна. – Miki

+0

@ dragon7 вы предложили решение на основе 'connectedComponentsWithStats'. Если это сработает, можете ли вы дать новый ответ с примером кода и пометить это как ответ? – Miki

ответ

2

Лучший вариант, кажется, использует connectedComponentsWithStats от OpenCV 3.0.

Пример:

# find all blobs and label them 
n, labels, stats, _ = cv2.connectedComponentsWithStats(mat) 
  • п - число различных сгустков
  • этикетки - матрица с одной и той же формы, как мат и содержит метку для каждой точки
  • статистика - статистика для каждого блоба в следующем порядке:
    • CC_STAT_LEFT Самая левая (x) координата, которая является включенным началом ограничивающей рамки в горизонтальном направлении.
    • CC_STAT_TOP Самая верхняя (y) координата, которая является включенным началом ограничительной рамки в вертикальном направлении.
    • CC_STAT_WIDTH Горизонтальный размер ограничивающей рамки
    • CC_STAT_HEIGHT Вертикальный размер ограничивающего прямоугольника
    • CC_STAT_AREA Общая площадь (в пикселях) подключенного компонента

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

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