cv2.connectedComponents не работает должным образом

Я хочу использовать функцию cv2.connectedComponents для соединения компонентов на двоичном изображении, как показано ниже...

образ,

Все работает, кроме выведенного массива меток. В этом массиве только нули, а не последовательные числа, как указано, в соответствии с идентифицированными компонентами.

import cv2
import numpy as np

img = cv2.imread('eGaIy.jpg', 0)
img = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)[1]  # ensure binary
ret, labels = cv2.connectedComponents(img)

# Map component labels to hue val
label_hue = np.uint8(179*labels/np.max(labels))
blank_ch = 255*np.ones_like(label_hue)
labeled_img = cv2.merge([label_hue, blank_ch, blank_ch])

# cvt to BGR for display
labeled_img = cv2.cvtColor(labeled_img, cv2.COLOR_HSV2BGR)

# set bg label to black
labeled_img[label_hue==0] = 0

cv2.imshow('labeled.png', labeled_img)
cv2.waitKey()

выводимые метки -> label.shape: (256 л, 250 л)

[[0 0 0 ..., 0 0 0]
 [0 0 0 ..., 0 0 0]
 [0 0 0 ..., 0 0 0]
 ..., 
 [0 0 0 ..., 0 0 0]
 [0 0 0 ..., 0 0 0]
 [0 0 0 ..., 0 0 0]]

1 ответ

Решение

Меня устраивает:

введите описание изображения здесь введите описание изображения здесь


И вы должны быть осторожны, чтобы функция находила только ненулевой компонент. В исходном изображении компоненты являются краями. И возвращаемое изображение помечено как тот же размер источника.

Выход из

[[0 0 0 ..., 0 0 0]
 [0 0 0 ..., 0 0 0]
 [0 0 0 ..., 0 0 0]
 ..., 
 [0 0 0 ..., 0 0 0]
 [0 0 0 ..., 0 0 0]
 [0 0 0 ..., 0 0 0]]

представляют только 4 угловые области (3x3), все нули, но это не значит, что все элементы являются нулями.


Если вы позвоните после того, как позвоните cv2.connectedComponents:

print(set(labels.reshape(-1).tolist()))

Ты получишь:

{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14}

Это означает, что существует 14 компонентов (ребер) и 1 фон (0).

Другие вопросы по тегам