Как использовать связанные компоненты OpenCV со статистикой в ​​Python?

Я ищу пример того, как использовать функцию OpenCV ConnectedComponentsWithStats() в python, обратите внимание, что это доступно только с OpenCV 3 или новее. Официальная документация показывает только API для C++, хотя функция существует при компиляции для python. Я не мог найти это нигде в Интернете.

4 ответа

Функция работает следующим образом:

# Import the cv2 library
import cv2
# Read the image you want connected components of
src = cv2.imread('/directorypath/image.bmp')
# Threshold it so it becomes binary
ret, thresh = cv2.threshold(src,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
# You need to choose 4 or 8 for connectivity type
connectivity = 4  
# Perform the operation
output = cv2.connectedComponentsWithStats(thresh, connectivity, cv2.CV_32S)
# Get the results
# The first cell is the number of labels
num_labels = output[0]
# The second cell is the label matrix
labels = output[1]
# The third cell is the stat matrix
stats = output[2]
# The fourth cell is the centroid matrix
centroids = output[3]

Метка - это матрица размера входного изображения, где каждый элемент имеет значение, равное его метке.

Stats - это матрица статистики, которую вычисляет функция. Он имеет длину, равную количеству меток, и ширину, равную количеству характеристик. Он может быть использован с документацией OpenCV:

Вывод статистики для каждой метки, включая фоновую метку, см. Ниже для получения доступной статистики. Доступ к статистике осуществляется через статистику [label, COLUMN], где доступные столбцы определены ниже.

  • cv2.CC_STAT_LEFT Крайняя левая (x) координата, которая является включающим началом ограничительной рамки в горизонтальном направлении.
  • cv2.CC_STAT_TOP Самая верхняя (y) координата, которая является включающим началом ограничительной рамки в вертикальном направлении.
  • cv2.CC_STAT_WIDTH Горизонтальный размер ограничительной рамки
  • cv2.CC_STAT_HEIGHT Вертикальный размер ограничительной рамки
  • cv2.CC_STAT_AREA Общая площадь (в пикселях) подключенного компонента

Центроиды - это матрицы с координатами x и y каждого центроида. Строка в этой матрице соответствует номеру метки.

Я приходил сюда несколько раз, чтобы вспомнить, как это работает, и каждый раз мне приходится уменьшать приведенный выше код до:

_, thresh = cv2.threshold(src,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
connectivity = 4  # You need to choose 4 or 8 for connectivity type
num_labels, labels, stats, centroids = cv2.connectedComponentsWithStats(thresh , connectivity , cv2.CV_32S)

Надеюсь, это пригодится всем:)

Добавление к Zack Knopp ответ: Если вы используете изображение в градациях серого, вы можете просто использовать:

import cv2
import numpy as np

src = cv2.imread("path\\to\\image.png", 0)
binary_map = (src > 0).astype(np.uint8)
connectivity = 4 # or whatever you prefer

output = cv2.connectedComponentsWithStats(binary_map, connectivity, cv2.CV_32S)

Когда я пытался использовать Zack Knopp ответ на изображении в оттенках серого, это не сработало, и это было мое решение.

входное изображение должно быть одноканальным. поэтому сначала преобразуйте в оттенки серого, иначе это вызовет ошибку в opencv 4.x, которую вам нужно преобразовать в оттенки серого, а затем ответ Зака.

      src = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
Другие вопросы по тегам